選手:IKanalyzer、ansj_seg、jcseg
硬件:i5-3470 3.2GHz 8GB win7 x64
比賽項目:1、搜索;2、自然語言分析
選手介紹:
1,IKanalyzer
IKanalyzer采用的是“正向迭代最細粒度切分算法”,是比較常見而且很容易上手的分詞器了。一般新手上路學習lucene或者solr都會用這個。優點是開源(其實java分詞器多是開源的,畢竟算法都是業內熟知的)、輕量、目前來看沒有太大的bug,源碼簡單易懂,做二次開發也很簡單,即使遇到solr/Lucene版本更新,只需要自己稍微修改下實現類就可以通用。缺點是過於簡單白痴,只是簡單的根據配置好的詞庫進行分詞,沒有任何智能可言,連“和服”、“和服務器”這種老梗都破不了。我手頭的IKanalyzer是被我進行二次開發后的版本,修改了一些問題,詞庫讀取方式改成樹形。IKanalyzer可以作為非智能分詞器的代表出場。
2,ansj_seg
ansj_seg分詞器用的人可能不太多吧,不過個人覺得是開源分詞器里最強悍功能最豐富的。作者孫建,我曾在微博上與他有過簡單的交流,討論過ansj_seg分詞器的一些小的bug和不足。ansj_seg基於中科院的 ictclas 中文分詞算法,智能、高效。雖然現在已經有ictclas 的for java版本,但是 ansj_seg從實現到使用來說要強大的多,而且作者自產自銷自用,很多細節和小功能都有考慮,在索引和自然語言分析方面都有很優秀的表現。我手頭的ansj_seg是自己修復了一些bug后的版本。ansj_seg可以作為ictclas 算法實現的分詞器的代表出場。
3,jcseg
jcseg分詞器使用的是mmseg算法和fmm算法,這個分詞器類似ansj_seg的很多地方,智能、人性化,個人感覺體驗要超過同門師兄弟mmseg4j,所以可以作為mmseg算法實現的分詞器的代表出場。
比賽開始:
中文全文檢索,需要考量索引和檢索的效果。一般來說索引要做到最細顆粒切分來保留更多的分詞、檢索要做到最大顆粒切分來保證搜索的准確度。
自然語言分析,一般要最大顆粒切分分詞,並且需要能夠發現新詞、特殊詞
原句:“禾農瑪咖禾農人123456測試人員禾農瑪咖1,2,3,4,125張小鵬和服務器一百五十個人都來了”
“禾農”、“瑪咖”是添加的個人詞庫的詞條,核心詞庫並不包含。
IKanalyzer分詞的效果(分詞用-間隔):
常規分詞(最細顆粒切分):禾農-瑪咖-禾農-農人-123456-測試-人員-禾農-瑪咖-1,2,3,4,125-1-2-3-4-125-張小-鵬-和服務-和服-服務器-服務-器-一百五十-一百五-十個人-十個-人都-都來了-都來-來了-爬山虎-爬山-虎
智能分詞(最大顆粒切分):禾農-瑪咖-禾-農人-123456-測試-人員-禾農-瑪咖-1,2,3,4,125-張小-鵬-服務器-一百五-十個人-都來了-爬山虎
ansj_seg分詞效果:
索引分詞:[禾/ng, 農瑪/nr, 咖/nw, 禾農/userDefine, 人/n, 123456/m, 測試人員/n, 測, 測試, 試, 人, 人員, 員, 禾農/userDefine, 瑪咖/userDefine, 1/m, ,, 2/m, ,, 3/m, ,, 4/m, ,, 125/m, 張小鵬/nr, 張, 小, 鵬, 和/c, 服務器/n, 服, 服務, 務, 器, 一百五/userDefine, 一, 百, 五, 十個人/userDefine, 十, 個, 個人, 人, 都來了/userDefine, 都, 來, 了, 爬山虎/n, 爬, 爬山, 山, 虎]
智能分詞:[禾/ng, 農瑪/nr, 咖/nw, 禾農/userDefine, 人/n, 123456/m, 測試人員/n, 禾農/userDefine, 瑪咖/userDefine, 1/m, ,, 2/m, ,, 3/m, ,, 4/m, ,, 125/m, 張小鵬/nr, 和/c, 服務器/n, 一百五/userDefine, 十個人/userDefine, 都來了/userDefine, 爬山虎/n]
ansj_seg實際上還有個非常強大的Nlp分詞,能夠很強大的發現新詞,但是性能不穩定,暫時不進行測試。
jcseg分詞效果:
簡單分詞:禾農-瑪咖-禾農-123456/en-測試-人員-禾農-瑪咖-1/en-2/en-3/en-4/en-125/en-張-鵬-和服-務-器-一百五十/m-150/m-個人-都-爬山虎
復雜分詞:禾農-瑪咖-禾農-123456/en-測試-人員-禾農-瑪咖-1/en-2/en-3/en-4/en-125/en-張小鵬/nr-服務器-一百五十/m-150/m-個人-都-爬山虎
評分:因為三種分詞器的停用詞各有不同,所以一些虛詞分出的效果不盡相同,不過並不影響評分。
1, 索引分詞的詞元。如果一元分詞過多,會造成搜索時候搜索到過多的無意義內容,並且會增加索引的體積
IKanalyzer即使最細顆粒切分也能保證盡可能保留二元分詞
ansj_seg簡單粗暴,凡是分割后大於2個字的詞都會切分成單個字,比如“爬山虎”會分割為“爬”,“山”,“虎”
jcseg簡單分詞一塌糊塗,可以說沒有認真做,很任性
2,智能分詞。避免出現歧義的詞,最常見的就是“和服”與“和服務器”。
IKanalyzer不具備智能分詞的任何功能,僅僅是根據詞庫進行分詞
ansj_seg智能分詞很優秀,能識別各種詞性進行智能分詞
jcseg智能分詞效果與ansj_seg類似,但是簡單分詞做得太差
3,人名、地名等特殊詞。做互聯網搜索尤其需要這塊功能
IKanalyzer完全不具備
ansj_seg具備並且效果很好
jcseg具備,但是簡單分詞不具備
4,自定義詞庫效果。非常重要的功能,人工干預來提高分詞准確度的利器
IKanalyzer的原理就是基於詞庫,所以效果很好
ansj_seg需要先根據核心詞庫分詞,分詞后再根據自定義詞庫進行分詞,不具備全切分功能,“禾農瑪咖”就是例子
jcseg類似IKanalyzer
5,數字和英文
只有jcseg做到數字智能分詞
6,速度
考慮到現在CPU性能普遍過剩,即使很大量的數據,分詞速度也不會出現本質的區別,所以這塊不是比較的重點。實際使用三者不相上下。
結論:從上述比賽結果和本人實際工作使用來看,ansj_seg是最美好的一個分詞器,智能、強悍,對索引和最大顆粒分割都照顧得很到位,詞庫的樹形讀取也堪稱經典(本人已挪用到IKanalyzer)。只是他的核心詞庫是經過修正的,理論上不支持自定義詞庫的。這是ictclas 的硬傷。原作者的補救方案是在核心詞庫分詞后用自定義詞庫進行分割,效果不盡如人意,讓自定義詞庫的用處大打折扣。本人與作者也討論過,他說是可以保留全切分的,但是目前已經不再更新代碼,令人遺憾。搜索這塊,按理說是 索引分詞》=檢索分詞,也就是說,索引分詞的結果,要大於並且包含檢索分詞,但是jcseg並沒有做到這一點。如果搜索只追求絕對准確度不考慮搜索結果最大化,jcseg效果還是很好的。在自然語言分析方面,jcseg勝出。
ansj_seg配配合停用詞,無論搜索還是自然語言分析,都是很強悍的存在,只是自定義詞庫的延后使用,降低了實際工作中的表現。本人之前全線搜索和推薦都用的是ansj_seg,近來由於客戶反映搜索准確度問題(其實就是“瑪咖”搜不到),只能選擇其他方案。多方比較后,決定用IKanalyzer,這是一個妥協的方案,但是目前來說也許是最好的方案,畢竟我們做的是站內搜索,不是海量互聯網搜索引擎(其實決心使用IKanalyzer的原因之一是,鼎鼎大名的知乎網用的也是IKanalyzer分詞器)。未來做推薦做分類可能會使用jcseg,畢竟只需要做最大顆粒分詞就好。
