本文旨在介紹如何利用HanLP訓練分詞模型,包括語料格式、語料預處理、訓練接口、輸出格式等。 目前HanLP內置的訓練接口是針對一階HMM-NGram設計的,另外附帶了通用的語料加載工具,能夠經過少許代碼導出供其餘訓練工具使用的特定格式(如CRF++)。算法
語料格式ide
輸入語料格式爲人民日報分詞語料庫格式。該格式並無明確的規範,但整體知足如下幾點:函數
一、單詞與詞性之間使用「/」分割,如華爾街/nsf,且任何單詞都必須有詞性,包括標點等。工具
二、單詞與單詞之間使用空格分割,如美國/nsf 華爾街/nsf 股市/n。spa
三、支持用[]將多個單詞合併爲一個複合詞,如[紐約/nsf 時報/n]/nz,複合詞也必須遵照1和2兩點規範。.net
你能夠參考OpenCorpus/pku98/199801.txt(做者並沒有版權,請勿詢問)。設計
語料預處理對象
語料預處理指的是將語料加載到內存中,根據須要增刪改其中部分詞語的一個過程。 在HanLP中,這是經過CorpusLoader.walk實現的:接口
CorpusLoader.walk("path/to/your/corpus", new CorpusLoader.Handler()內存
{
public void handle(Document document)
{
System.out.println(document);
}
});
其中,document對象就是加載到內存的文檔,對應某一個文本文件。用戶能夠經過document.getSimpleSentenceList等接口獲取文檔中的句子列表,每一個句子都是單詞的鏈表,具體參數請參考source.jar,再也不贅述。而Handler是一個處理邏輯(lambda函數),在此能夠編寫本身的預處理代碼。
· CRF分詞采用BMES標註集,從人民日報轉換到CRF訓練語料的完整預處理代碼請參考com.hankcs.test.model.TestCRF#testPrepareCRFTrainingCorpus。
· 若不使用上述預處理代碼則請注意:因爲在HanLP實現的CRF分詞解碼算法中,數詞被轉換爲M,英文被轉換爲W;因此在訓練CRF分詞以前,須要用相同的邏輯預處理語料。轉換代碼請參考:com.hankcs.test.model.TestCRF#compile
訓練HMM-NGram分詞模型
HMM-NGram在HanLP中特地被處理爲文本形式,方便用戶理解、修改HMM-NGram模型(習慣上稱爲詞典,但這並不表明它不是模型)。此處的訓練就是爲了獲得分詞所需的所有模型,而訓練,只需一兩行代碼:
final NatureDictionaryMaker dictionaryMaker = new NatureDictionaryMaker();
CorpusLoader.walk("path/to/your/corpus", new CorpusLoader.Handler()
{
public void handle(Document document)
{
dictionaryMaker.compute(CorpusUtil.convert2CompatibleList(document.getSimpleSentenceList(true)));
}
});
dictionaryMaker.saveTxtTo("data/test/CoreNatureDictionary");
其中,document.getComplexSentenceList()表明獲取複合詞句子列表(即複合詞原樣輸出),用戶能夠將其替換爲CorpusUtil.convert2CompatibleList(document.getSimpleSentenceList(true))來將複合詞拆分爲單個詞語。
輸出格式
訓練後一共得出3個文件:
一、CoreNatureDictionary.txt:單詞詞性詞典
二、CoreNatureDictionary.ngram.txt:二元接續詞典
三、CoreNatureDictionary.tr.txt:詞性轉移矩陣
接下來用戶能夠經過替換配置文件中的CoreDictionaryPath來使用新訓練的詞典。