Hanlp自然語言處理工具之詞法分析器
本章是接前兩篇《分詞工具 Hanlp基於感知機的中文分詞框架》和《基於結構化感知機的詞性標註與命名實體識別框架》的。 本系統將同時進行中文分詞、詞性標註與命名實體識別 3個任務的子系統稱為“詞法分析器”。
載入
對應的類為 PerceptronLexicalAnalyzer,其構造方法為遞增的3個模型地址:
l public PerceptronLexicalAnalyzer(String cwsModelFile) throws IOException
l public PerceptronLexicalAnalyzer(String cwsModelFile, String posModelFile) throws IOException
l public PerceptronLexicalAnalyzer(String cwsModelFile, String posModelFile, String nerModelFile) throws IOException
使用者根據自己要進行的任務,訓練 3個模型中的任意個數,然後靈活傳入此類構造即可。此處假設訓練了3個模型,那麼傳入這3個模型的路徑即可構造詞法分析器:
public void testCWSandPOSandNER() throws Exception
{
PerceptronLexicalAnalyzer segmenter = new PerceptronLexicalAnalyzer(Config.CWS_MODEL_FILE, Config.POS_MODEL_FILE, Config.NER_MODEL_FILE);
}
分析
詞法分析器的分析介面如下:
public static final String SENTENCE = "香港特別行政區的張朝陽說商品和服務是三原縣魯橋食品廠的主營業務";
public void testCWSandPOSandNER() throws Exception
{
PerceptronLexicalAnalyzer segmenter = new PerceptronLexicalAnalyzer(Config.CWS_MODEL_FILE, Config.POS_MODEL_FILE, Config.NER_MODEL_FILE);
Sentence sentence = segmenter.analyze(SENTENCE);
System.out.println(sentence);
}
正常情況下輸出:
[香港/ns 特別/a 行政區/n]/ns 的/n 張朝陽/nr 說/v 商品/n 和/c 服務/vn 是/v [三原縣/ns 魯橋/nz 食品廠/n]/nt 的/z 主營/vn 業務/n
Sentence結構是一個對人民日報語料格式的實現,使用者可以方便地用for迴圈去遍歷單詞,用instanceof來判斷單詞屬於複合詞還是簡單詞。此處演示輸出句子中所有複合詞內部的簡單詞:
for (IWord word : sentence)
{
if (word instanceof CompoundWord)
System.out.println(((CompoundWord) word).innerList);
}
結果:
[香港/ns, 特別/a, 行政區/n]
[三原縣/ns, 魯橋/nz, 食品廠/n]
透過此結構,我們可以捕捉語言的複合結構(簡單詞構成複合詞)。此結構輸出為文字後滿足人民日報 2014語料格式,形成了一個語料與文字之間的閉環。
與 HanLP舊介面的相容
本系統依然相容 HanLP的seg介面,與analyze介面比較如下:
System.out.println(segmenter.seg(SENTENCE));
System.out.println(segmenter.analyze(SENTENCE));
輸出:
[香港特別行政區/ns, 的/n, 張朝陽/nr, 說/v, 商品/n, 和/c, 服務/vn, 是/v, 三原縣魯橋食品廠/nt, 的/z, 主營/vn, 業務/n]
[香港/ns 特別/a 行政區/n]/ns 的/n 張朝陽/nr 說/v 商品/n 和/c 服務/vn 是/v [三原縣/ns 魯橋/nz 食品廠/n]/nt 的/z 主營/vn 業務/n
注意上面兩個結果中的命名實體有著本質的不同, seg介面無法輸出層次結構,而analyze介面可以。
線上學習
本框架另一個特色功能是 “線上學習”,或稱“增量訓練”。其適用場景如下: 線上系統的統計模型依然會犯錯誤,但重新訓練的代價過大(比如耗時長,沒有語料等等)。本系統支援線上學習新知識,實時修正統計模型的錯誤。這裡舉一個分詞的例子,人民日報1998年1月份訓練出來的模型無法分對“下雨天地面積水”這個句子:
PerceptronSegmenter segmenter = new PerceptronSegmenter(Config.CWS_MODEL_FILE);
System.out.println(segmenter.segment("下雨天地面積水"));
輸出:
[下雨, 天地, 面積, 水]
但本系統支援線上學習這個句子的正確分詞方式:
segmenter.learn("下雨天 地面 積水");
System.out.println(segmenter.segment("下雨天地面積水"));
透過 learn介面,感知機模型學習到了這個句子的正確分詞方式,並輸出了正確結果:
[下雨天, 地面, 積水]
對於類似的句子,也擁有了舉一反三的泛化能力:
System.out.println(segmenter.segment("下雨天地面積累了很多水"));
輸出:
[下雨天, 地面, 積累, 了, 很多, 水]
詞性標註器和命名實體識別器也有類似的 learn介面,使用者可舉一反三類似地呼叫,不再贅述。
模型壓縮與持久化
線上學習或訓練後的模型可以序列化到某個路徑,其介面是:
/**
* @param ratio 壓縮比c(壓縮掉的體積,壓縮後體積變為1-c)
* @return
*/
public LinearModel compress(final double ratio)
/**
* 儲存到路徑
*
* @param modelFile
* @throws IOException
*/
public void save(String modelFile, final double ratio) throws IOException
比如壓縮比為 0.1,則壓縮後的體積為原來的0.9。此處的“體積”指的是特徵數量,並不一定等於檔案體積。
命令列介面
如上文所述,本框架中的功能可以透過命令列呼叫:
$ java -cp hanlp.jar com.hankcs.hanlp.model.perceptron.Main
缺少必需引數 : -model
用法 : com.hankcs.hanlp.model.perceptron.Main
-task [TaskType] 任務型別 :CWS|POS|NER (CWS)
-train [flag] 執行訓練任務
-test [flag] 執行預測任務
-evaluate [flag] 執行評估任務
-model [String] 模型檔案路徑
-input [String] 輸入文字路徑
-result [String] 結果儲存路徑
-gold [String] 標準分詞語料
-reference [String] 訓練集
-development [String] 開發集
-iter [Integer] 迭代次數 (5)
-compressRatio [Double] 模型壓縮比率 (0.0)
-thread [int] 執行緒數 (8)
當使用者按照上文所述訓練了 1到3個模型後,可以透過命令列介面互動式地觀察效果:
$ java -cp target/hanlp-1.6.0.jar:src/main/resources com.hankcs.hanlp.model.perceptron.Main -test
商品和服務
商品 /n 和/c 服務/vn
上海華安工業(集團)公司董事長譚旭光和秘書胡花蕊來到美國紐約現代藝術博物館參觀
[上海/ns 華安/nz 工業/n (/w 集團/n )/w 公司/n]/nt 董事長/n 譚旭光/nr 和/c 秘書/n 胡花蕊/nr 來到/v [美國/ns 紐約/ns 現代/t 藝術/n 博物館/n]/ns 參觀/v
l 預設載入配置檔案指定的模型,可以透過 -model your/cws.bin,your/pos.bin,your/ner.bin指定別的模型。
l 還可以將輸入輸出重定向到檔案,形成一個 pipeline。
l 更多資訊,請參考《編譯執行》。
未來工作
l 英文和數字最好要做特殊處理。
l 與 hanlp-lucene-plugin的整合。
l 整合自定義詞典。
l 索引分詞等功能。
l 重構出新的分詞、詞性標註與命名實體識別介面,統一所有分詞器,並逐步淘汰舊介面。
文章摘自: HanLP: Han Language Processing —— 開源自由的漢語言處理包
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2640872/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Hanlp自然語言處理中的詞典格式說明HanLP自然語言處理
- NLP自然語言處理中的hanlp分詞例項自然語言處理HanLP分詞
- HanLP 自然語言處理 for nodejsHanLP自然語言處理NodeJS
- 自然語言處理之jieba分詞自然語言處理Jieba分詞
- 自然語言處理工具hanlp定製使用者詞條自然語言處理HanLP
- 自然語言處理工具HanLP-N最短路徑分詞自然語言處理HanLP分詞
- 自然語言處理NLP(6)——詞法分析自然語言處理詞法分析
- 配置Hanlp自然語言處理進階HanLP自然語言處理
- 自然語言處理:分詞方法自然語言處理分詞
- Hanlp自然語言處理工具的使用演練HanLP自然語言處理
- 自然語言處理工具hanlp關鍵詞提取圖解TextRank演算法自然語言處理HanLP圖解演算法
- 自然語言處理之:搭建基於HanLP的開發環境自然語言處理HanLP開發環境
- 如何編譯執行HanLP自然語言處理包編譯HanLP自然語言處理
- hanlp自然語言處理包的基本使用--pythonHanLP自然語言處理Python
- python呼叫自然語言處理工具hanlp記錄Python自然語言處理HanLP
- 詞!自然語言處理之詞全解和Python實戰!自然語言處理Python
- 自然語言處理入門基礎之hanlp詳解自然語言處理HanLP
- 自然語言處理工具hanlp自定義詞彙新增圖解自然語言處理HanLP圖解
- 自然語言處理工具包HanLP的Python介面自然語言處理HanLPPython
- 開源自然語言處理工具包hanlp中CRF分詞實現詳解自然語言處理HanLPCRF分詞
- hanlp自然語言處理包的人名識別程式碼解析HanLP自然語言處理
- 自然語言處理工具python呼叫hanlp的方法步驟自然語言處理PythonHanLP
- 漢語言處理包HanLPv1.6.0釋出,感知機詞法分析器HanLP詞法分析
- 自然語言處理工具pyhanlp分詞與詞性標註自然語言處理HanLP分詞詞性標註
- 入門自然語言處理必看:圖解詞向量自然語言處理圖解
- Pyhanlp自然語言處理中的新詞識別HanLP自然語言處理
- NPL---自然語言處理單詞界定問題自然語言處理
- 中文自然語言處理工具hanlp隱馬角色標註詳解自然語言處理HanLP
- 自然語言處理工具python呼叫hanlp中文實體識別自然語言處理PythonHanLP
- 自然語言處理(NLP)自然語言處理
- 深度解析自然語言處理之篇章分析自然語言處理
- 自然語言處理工具hanlp 1.7.3版本更新內容一覽自然語言處理HanLP
- 自然語言處理工具HanLP-基於層疊HMM地名識別自然語言處理HanLPHMM地名識別
- 自然語言處理中的分詞問題總結自然語言處理分詞
- 中文自然語言處理工具集:分詞,相似度匹配自然語言處理分詞
- 12 種自然語言處理的開源工具自然語言處理開源工具
- 自然語言處理(NLP)系列(一)——自然語言理解(NLU)自然語言處理
- 自然語言處理(NLP)概述自然語言處理