分詞工具Hanlp基於感知機的中文分詞框架

adnb34g發表於2019-04-03

結構化感知機標註框架是一套利用感知機做序列標註任務,並且應用到中文分詞、詞性標註與命名實體識別這三個問題的完整線上學習框架,該框架利用 1個演算法解決3個問題,時自治同意的系統,同時三個任務順序漸進,構成流水線式的系統。本文先介紹中文分詞框架部分內容。

中文分詞

訓練

只需指定輸入語料的路徑(單文件時為檔案路徑,多文件時為資料夾路徑,靈活處理),以及模型儲存位置即可:

命令列

java -cp hanlp.jar com.hankcs.hanlp.model.perceptron.Main -task CWS -train -reference data/test/pku98/199801.txt -model data/test/perceptron/cws.bin

API

 

     public void testTrain() throws Exception

    {        

        PerceptronTrainer trainer = new CWSTrainer();

        PerceptronTrainer.Result result = trainer.train(

            "data/test/pku98/199801.txt",

            Config.CWS_MODEL_FILE

            );

        //        System.out.printf("準確率F1:%.2f\n", result.prf[2]);

    }

事實上,視語料與任務的不同,迭代數、壓縮比和執行緒數都可以自由調整,以保證最佳結果 :

 

     /**

     * 訓練

     *

     * @param trainingFile  訓練集

     * @param developFile   開發集

     * @param modelFile     模型儲存路徑

     * @param compressRatio 壓縮比

     * @param maxIteration  最大迭代次數

     * @param threadNum     執行緒數

     * @return 一個包含模型和精度的結構

     * @throws IOException

     */

    public Result train(String trainingFile, String developFile,

                        String modelFile, final double compressRatio,

                        final int maxIteration, final int threadNum) throws IOException

單執行緒時使用 AveragedPerceptron演算法,收斂較好;多執行緒時使用StructuredPerceptron,波動較大。關於兩種演算法的精度比較,請參考下一小節。目前預設多執行緒,執行緒數為系統CPU核心數。請根據自己的需求平衡精度和速度。

 

準確率

 

sighan2005的msr資料集上的效能評估結果如下:

 

 

語料未進行任何預處理

只使用了 7種狀態特徵,未使用詞典

壓縮比 0.0,迭代數50

總耗時包含語料載入與模型序列化

對任意 PerceptronTagger,使用者都可以呼叫準確率評估介面:

 

 

     /**

     * 效能測試

     *

     * @param corpora 資料集

     * @return 預設返回accuracy,有些子類可能返回P,R,F1

     * @throws IOException

     */

    public double[] evaluate(String corpora) throws IOException

速度

目前感知機分詞是所有 “由字構詞”的分詞器實現中最快的,比自己寫的CRF解碼快1倍。新版CRF詞法分析器框架複用了感知機的維特比解碼演算法,所以速度持平。

 

 

測試時需關閉詞法分析器的自定義詞典、詞性標註和命名實體識別

測試環境 Java8 i7-6700K

測試

測試時只需提供分詞模型的路徑即可:

 

public void testCWS() throws Exception

{

    PerceptronSegmenter segmenter = new PerceptronSegmenter(Config.CWS_MODEL_FILE);

    System.out.println(segmenter.segment("商品和服務"));

}

 

正常情況下對商品和服務的分詞結果為 [商品, 和, 服務]。建議在任何語料上訓練時都試一試這個簡單的句子,當作HelloWorld來測試。若這個例子都錯了,則說明語料格式、規模或API呼叫上存在問題,須仔細排查,而不要急著部署上線。

 

另外,資料包中已經打包了在人民日報語料 1998年1月份上訓練的模型,不傳路徑時將預設載入配置檔案中指定的模型。

 

在本系統中,分詞器 PerceptronSegmenter的職能更加單一,僅僅負責分詞,不再負責詞性標註或命名實體識別。這是一次介面設計上的新嘗試,未來可能在v2.0中大規模採用這種思路去重構。


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

相關文章