IKanalyzer、ansj_seg、jcseg三種中文分詞器的實戰較量


選手: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,畢竟只需要做最大顆粒分詞就好。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM