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

選手:IKanalyzer、ansj_seg、jcsegjava

硬件:i5-3470 3.2GHz 8GB win7 x64算法

比賽項目:一、搜索;二、天然語言分析服務器

 

選手介紹:性能

  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 算法實現的分詞器的表明出場。spa

    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,畢竟只須要作最大顆粒分詞就好。

相關文章
相關標籤/搜索