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,毕竟只须要作最大颗粒分词就好。

相关文章
相关标签/搜索