本章是接前兩篇《分詞工具Hanlp基於感知機的中文分詞框架》和《基於結構化感知機的詞性標註與命名實體識別框架》的。本系統將同時進行中文分詞、詞性標註與命名實體識別3個任務的子系統稱爲「詞法分析器」。java
加載框架
對應的類爲PerceptronLexicalAnalyzer,其構造方法爲遞增的3個模型地址:ide
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 IOExceptionlua
用戶根據本身要進行的任務,訓練3個模型中的任意個數,而後靈活傳入此類構造便可。此處假設訓練了3個模型,那麼傳入這3個模型的路徑便可構造詞法分析器:spa
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)
-compre***atio [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 ——開源自由的漢語言處理包