結構化感知機標註框架是一套利用感知機作序列標註任務,而且應用到中文分詞、詞性標註與命名實體識別這三個問題的完整在線學習框架,該框架利用1個算法解決3個問題,時自治贊成的系統,同時三個任務順序漸進,構成流水線式的系統。本文先介紹中文分詞框架部份內容。java
中文分詞算法
訓練多線程
只需指定輸入語料的路徑(單文檔時爲文件路徑,多文檔時爲文件夾路徑,靈活處理),以及模型保存位置便可:框架
命令行性能
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 Exceptionlua
{ spa
PerceptronTrainer trainer = new CWSTrainer();.net
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數據集上的性能評估結果以下:
/**
* 性能測試
*
* @param corpora 數據集
* @return 默認返回accuracy,有些子類可能返回P,R,F1
* @throws IOException
*/
public double[] evaluate(String corpora) throws IOException
速度
目前感知機分詞是全部「由字構詞」的分詞器實現中最快的,比本身寫的CRF解碼快1倍。新版CRF詞法分析器框架複用了感知機的維特比解碼算法,因此速度持平。
測試
測試時只需提供分詞模型的路徑便可:
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中大規模採用這種思路去重構。