Hanlp自然語言處理工具之詞法分析器

adnb34g發表於2019-04-10


本章是接前兩篇《分詞工具 Hanlp基於感知機的中文分詞框架》和《基於結構化感知機的詞性標註與命名實體識別框架》的。 本系統將同時進行中文分詞、詞性標註與命名實體識別 3個任務的子系統稱為“詞法分析器”。

 

載入

對應的類為 PerceptronLexicalAnalyzer,其構造方法為遞增的3個模型地址:

public PerceptronLexicalAnalyzer(String cwsModelFile) throws IOException

public PerceptronLexicalAnalyzer(String cwsModelFile, String posModelFile) throws IOException

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

預設載入配置檔案指定的模型,可以透過 -model your/cws.bin,your/pos.bin,your/ner.bin指定別的模型。

還可以將輸入輸出重定向到檔案,形成一個 pipeline。

更多資訊,請參考《編譯執行》。

未來工作

英文和數字最好要做特殊處理。

hanlp-lucene-plugin的整合。

整合自定義詞典。

索引分詞等功能。

重構出新的分詞、詞性標註與命名實體識別介面,統一所有分詞器,並逐步淘汰舊介面。

  文章摘自: HanLP: Han Language Processing —— 開源自由的漢語言處理包


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2640872/,如需轉載,請註明出處,否則將追究法律責任。

相關文章