如何使用Hanlp載入大字典

adnb34g發表於2019-01-23


 

 

問題

因為需要載入一個 1G 的字典到 Hanlp 中,一開始使用了 CustomDictionay.add() 方法來一條條的載入,果然到了中間,維護 DoubleArraTre 的成本太高,新增一個節點,都會很長時間,本來時間長一點沒有關係,只要訓練出 .bin 的檔案,第二次載入就會很快,然而作為以空間換時間的 DAT 結構,記憶體消耗很大,預料之內的出現了

1    out of memory: heap size

的問題。後來嘗試直接載入了 1G 的字典,顯然更不行。

思路

閱讀了 Hanlp 的部分原始碼,也請教了原作者一部分問題,就打算從原始碼入手。初步想法大概是將原始字典 split 成多份,然後分別將多份的小字典 訓練成 多個小的 .bin 檔案,再完整的載入到記憶體中,基於的原則則是:載入兩個 10M 的字典的消耗比一個 20M 的要小。

然後又優化了一部分,現在載入一個大概 1G 的字典,佔記憶體約 3g+ ,已經可以使用了。

大概流程

1 修改  CustomDictionary.java  設定一個 hashmap  或者 一個 list 來儲存所有的小 Dat

2 將所有的 dat 載入完,這裡就不再區分主副字典了。

3 修改 Segment.java 裡面的 combineByCustomDictionary 函式,原始碼中只有一個 dat , 這裡我們需要選擇我們容器中其中某一個 dat 作為要匹配使用,之前使用的方案是,遍歷所有的 dat ,知道有了匹配,但是這樣缺陷很明顯,解決不了多個字典匹配同一個詞的字串的情況,這裡我的考察方案是,字典中的同一個字開始的詞條對映到同一個檔案,這樣不會出現字串問題了。

以上就 是個大概的修改,可以參考。


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2564514/,如需轉載,請註明出處,否則將追究法律責任。

相關文章