結構化感知機標註框架是一套利用感知機做序列標註任務,並且應用到中文分詞、詞性標註與命名實體識別這三個問題的完整在線學習框架,該框架利用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數據集上的性能評估結果如下:
l 語料未進行任何預處理
l 只使用了7種狀態特徵,未使用詞典
l 壓縮比0.0,迭代數50
l 總耗時包含語料加載與模型序列化
l 對任意PerceptronTagger,用戶都可以調用準確率評估接口:
/**
* 性能測試
*
* @param corpora 數據集
* @return 默認返回accuracy,有些子類可能返回P,R,F1
* @throws IOException
*/
public double[] evaluate(String corpora) throws IOException
速度
目前感知機分詞是所有“由字構詞”的分詞器實現中最快的,比自己寫的CRF解碼快1倍。新版CRF詞法分析器框架複用了感知機的維特比解碼算法,所以速度持平。
l 測試時需關閉詞法分析器的自定義詞典、詞性標註和命名實體識別
l 測試環境 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中大規模採用這種思路去重構。