Hanlp之理解用户自定义词典(java版本)
首先說明,由于本人水平有限,文章紕漏以及不妥之處還請指出,不勝感激;
理解hanlp中用戶自定義詞典(java)
什么是hanlp用戶自定義字典?為什么要有用戶自定義詞典?
在Hanlp分詞中,不管是標(biāo)準(zhǔn)分詞器、NLP分詞器還是索引分詞器都不可能每次都準(zhǔn)確的將我們希望的結(jié)果詞語分出來,尤其是我們平常用到的自定義名詞或者流行語,比如:“印象筆記”、“奧利給”等,分析語句一長,分詞準(zhǔn)確性還會繼續(xù)下降,這時就需要我們利用用戶自定義詞典,來進行這些詞語的記錄,方便分詞器依據(jù)用戶詞典來進行分詞,提高準(zhǔn)確度。
用戶自定義詞典中的詞在分詞時一定會被準(zhǔn)確無誤的區(qū)分出來嗎?
我們需要知道準(zhǔn)確無誤這樣的形容詞在形容分詞這項工作就是不恰當(dāng)?shù)?#xff0c;在分詞工作中,對分詞結(jié)果評判的標(biāo)準(zhǔn)是不確定的,在官方FAQ中有這樣的例子:
假如用戶詞典中一共3個詞語:商品、和服、服務(wù),那么“商品和服務(wù)”到底怎么分才能滿足這些用戶呢?無論怎么分詞,這3個詞語都不可能同時出現(xiàn)。
也許你以為往詞典中添加“川普”,并且用戶詞典優(yōu)先級最高的話,就可以解決眼前的“普京與川普 通話”這個句子。但在你沒注意到的地方,有更多類似“四川普通話”“銀川普通高考”“唐納德·川普”(本該是一個詞)的句子會發(fā)生錯誤。
所以說,詞典≠中文分詞。
在了解了上述兩個問題之后,我們就開始進行用戶自定義詞典的分析了。
下載Hanlp數(shù)據(jù)包后,默認(rèn)位置是在Hanlp配置目錄下的data\dictionary\custom,CustomDictionary是一份全局的用戶自定義詞典,可以隨時增刪,影響全部分詞器。另外可以在任何分詞器中關(guān)閉它。下圖是CustomDictionary在windows OS中的位置;
我們點開它,發(fā)現(xiàn)了一些詞語,仔細(xì)觀察我們會發(fā)現(xiàn)這些詞的組織是有一定的規(guī)律的;
-
每一行代表一個單詞,格式遵從[單詞] [詞性A] [A的頻次] [詞性B] [B的頻次] … 如果不填詞性則表示采用詞典的默認(rèn)詞性。
-
詞典的默認(rèn)詞性默認(rèn)是名詞n,可以通過配置文件修改:全國地名大全.txt ns;如果詞典路徑后面空格緊接著詞性,則該詞典默認(rèn)是該詞性。
我們打開Hanlp的配置文件,在箭頭指向位置可以看到自定義詞典的路徑,詞典名有后綴的就是設(shè)置了詞條默認(rèn)詞性,默認(rèn)名詞;
詞性表請參照《HanLP詞性標(biāo)注集》 -
在統(tǒng)計分詞中,并不保證自定義詞典中的詞一定被切分出來。用戶可在理解后果的情況下通過Segment#enableCustomDictionaryForcing強制生效。
我們在之前已經(jīng)討論過這個問題,如果你實在需要詞典中的詞被完整的分出來,可以使用此方法來開啟強制分詞。
我們也可以添加詞典
-
CustomDictionary主詞典文本路徑是data/dictionary/custom/CustomDictionary.txt,用戶可以在此增加自己的詞語(不推薦);也可以單獨新建一個文本文件,通過配置文件CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; 我的詞典.txt;來追加詞典(推薦)。
緩存 -
始終建議將相同詞性的詞語放到同一個詞典文件里,便于維護和分享。
特別注意:
①通過代碼進行詞語的增刪并不會影響到詞典;
②在詞典進行更改后,必須刪除詞典緩存,在下一次載入詞典時更改才會生效;
③詞典緩存和詞典在同一目錄下,后綴一般是.bin。有時候是.trie.dat和.trie.value。它們是歷史遺留產(chǎn)物;
現(xiàn)在是時候進入代碼,仔細(xì)觀察了。這是文檔給出的一段代碼:
我們通過源代碼查看一下選中的幾個方法:
add(String) : boolean
/*** 往自定義詞典中插入一個新詞(非覆蓋模式)<br>* 動態(tài)增刪不會持久化到詞典文件** @param word 新詞 如“裸婚”* @return 是否插入成功(失敗的原因可能是不覆蓋等,可以通過調(diào)試模式了解原因)*/public static boolean add(String word){if (HanLP.Config.Normalization) word = CharTable.convert(word);if (contains(word)) return false;return insert(word, null);}insert(String) : boolean
/*** 以覆蓋模式增加新詞<br>* 動態(tài)增刪不會持久化到詞典文件** @param word* @return*/public static boolean insert(String word){return insert(word, null);}get(String) : Attribute
/*** 查單詞** @param key* @return*/public static CoreDictionary.Attribute get(String key){if (HanLP.Config.Normalization) key = CharTable.convert(key);CoreDictionary.Attribute attribute = dat.get(key);if (attribute != null) return attribute;if (trie == null) return null;return trie.get(key);}remove(String) : void
/*** 刪除單詞<br>* 動態(tài)增刪不會持久化到詞典文件** @param key*/public static void remove(String key){if (HanLP.Config.Normalization) key = CharTable.convert(key);if (trie == null) return;trie.remove(key);}源代碼正在研究,考完六級再來補…
總結(jié)
以上是生活随笔為你收集整理的Hanlp之理解用户自定义词典(java版本)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode--16. 最接近的三数
- 下一篇: leetcode--983.最低票价