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


 

封面.jpg 

結構化感知機標註框架是一套利用感知機做序列標註任務,並且應用到中文分詞、詞性標註與命名實體識別這三個問題的完整在線學習框架,該框架利用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 compre***atio 壓縮比

     * @param maxIteration  最大迭代次數

     * @param threadNum     線程數

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

     * @throws IOException

     */

    public Result train(String trainingFile, String developFile,

                        String modelFile, final double compre***atio,

                        final int maxIteration, final int threadNum) throws IOException

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

 

準確率

 

sighan2005的msr數據集上的性能評估結果如下:

圖片1.png

 

語料未進行任何預處理

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

壓縮比0.0,迭代數50

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

對任意PerceptronTagger,用戶都可以調用準確率評估接口:

 

 

    /**

     * 性能測試

     *

     * @param corpora 數據集

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

     * @throws IOException

     */

    public double[] evaluate(String corpora) throws IOException

速度

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

圖2.png

 

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

測試環境 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中大規模採用這種思路去重構。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章