對於詞典,直接加載文本會很慢,所以HanLP對於文本文件做了一些預處理,生成了后綴名為.txt.bin的二進制文件。
這些二進制文件相當於緩存,避免了每次加載去讀取多個文件。
通過這種txt和bin結合的方式,HanLP一方面方便用戶編輯查看詞典,另一方面bin方便加載,這種方式可謂是兼二者之長,設計上堪稱典范。
打開hanlp的data目錄data\dictionary\custom,刪除所有的.txt.bin文件,這樣一來,HanLP下次加載詞典時會自動構建.txt.bin,這樣一來,你對文本文件所做的更改才會生效。對於HanLP中的字典,每次更改之后,都必須重新生成bin才可以,否則不會生效。
實際上,這種方式不夠智能,可以改進為檢查文件日期的方式,如果當前目錄下的最新的詞典文件比bin文件新,那么bin文件失效,需要重新構建bin。
構建bin的過程是比較緩慢的,它需要把所有的相關文本文件中的詞語合並到一個里面,每次構建大概需要2min,構建完成之后下次啟動就很快了。
更改hanlp.properties,添加mine.txt.
#自定義詞典路徑,用;隔開多個自定義詞典,空格開頭表示在同一個目錄,使用“文件名 詞性”形式則表示這個詞典的詞性默認是該詞性。優先級遞減。
#另外data/dictionary/custom/CustomDictionary.txt是個高質量的詞庫,請不要刪除
CustomDictionaryPath=data/dictionary/custom/mine.txt; CustomDictionary.txt; 現代漢語補充詞庫.txt; 全國地名大全.txt ns; 人名詞典.txt; 機構名詞典.txt; 上海地名.txt ns;data/dictionary/person/nrf.txt nrf
在data/dictionary/custom/目錄下新建mine.txt,添加一些詞語。比如里面加上”蘭陵笑笑生“。
隨便編一個程序測試一下
List<Term> res = HanLP.segment("蘭陵笑笑生笑道:你他娘的真是個天才");
System.out.println(res);//[蘭陵笑笑生/nr, 笑/v, 道/q, :/w, 你/r, 他/r, 娘/n, 的/uj, 真/d, 是/v, 個/q, 天才/n]
for (String i : HanLP.Config.CustomDictionaryPath) {
System.out.println(i);
}