一,IK Analyzer(暗黑的“不朽之王Immortal King”) :IK Analyzer 是更多的考虑了互联网用户在产品及名址信息搜索这块的应用,IK特别适用于搜索商家,产品,名址,如商品交易,美食,娱乐,电子地图等,因为它是基于这样 的应用诞生的。IK在一开始的设计的时候,它有一个隐形的目标,是对数词,量词,专有名词的增强处理,这是由于它的基于web gis搜索的需求定位决定的。在IKQueryparser 中,它不是简单的返回所有分词结果的组合,而是建立起一个分词树,将有可能的组合放在一起,它的输出会类似于这样:(“永和” && “服装” && “饰品”) || (“和服”&& “装饰”), 通过这个搜索逻辑去索引中进行匹配。二,JE-MManalyzer:它的算法具有歧义分析,比较适合做垂直搜索和信息挖掘。他的中文名称是“极易”,开发者的理念是-简单即是美。 三,中科院的分词器(ICTCLAS):中科院的分词器很牛,其切分结果明显基于语义分析。下载地址 :http://ictclas.org/Down_OpenSrc.asp 四,paoding:paoding的结构设计的非常灵活,适合于对其进行开源改造。 五,mmseg4j:单从mmseg4j 的项目介绍上看,它是一个很纯粹的基于词典分词的实现,既有细粒度的切分,也有最大长度的切分。应该说,是一个学习词典分词的很好的典范。IK分词多些但速度比paoding差些。=========================

3. 用户自定义词库:

paoding :支持不限制个数的用户自定义词库,纯文本格式,一行一词,使用后台线程检测词库的更新,自动编译更新过的词库到二进制版本,并加载imdict :暂时不支持用户自定义词库。但 原版 ICTCLAS 支持。支持用户自定义 stop wordsmmseg4j :自带sogou词库,支持名为 wordsxxx.dic, utf8文本格式的用户自定义词库,一行一词。不支持自动检测。 -Dmmseg.dic.pathik : 支持api级的用户词库加载,和配置级的词库文件指定,无 BOM 的 UTF-8 编码,\r\n 分割。不支持自动检测。

4. 速度(基于官方介绍,非自己测试)

paoding :在PIII 1G内存个人机器上,1秒 可准确分词 100万 汉字imdict :483.64 (字节/秒),259517(汉字/秒)mmseg4j : complex 1200kb/s左右, simple 1900kb/s左右ik :具有50万字/秒的高速处理能力

5. 算法和代码复杂度

paoding :svn src 目录一共1.3M,6个properties文件,48个java文件,6895 行。使用不用的 Knife 切不同类型的流,不算很复杂。imdict :词库 6.7M(这个词库是必须的),src 目录 152k,20个java文件,2399行。使用 ICTCLAS HHMM隐马尔科夫模型,“利用大量语料库的训练来统计汉语词汇的词频和跳转概率,从而根据这些统计结果对整个汉语句子计算最似然(likelihood)的切分”mmseg4j : svn src 目录一共 132k,23个java文件,2089行。MMSeg 算法 ,有点复杂。ik : svn src 目录一共6.6M(词典文件也在里面),22个java文件,4217行。多子处理器分析,跟paoding类似,歧义分析算法还没有弄明白。

6. 文档

paoding :几乎无。代码里有一些注释,但因为实现比较复杂,读代码还是有一些难度的。imdict : 几乎无。 ICTCLAS 也没有详细的文档,HHMM隐马尔科夫模型的数学性太强,不太好理解。mmseg4j : MMSeg 算法 是英文的,但原理比较简单。实现也比较清晰。ik : 有一个pdf使用手册,里面有使用示例和配置说明。

7. 其它

paoding :引入隐喻,设计比较合理。search 1.0 版本就用的这个。主要优势在于原生支持词库更新检测。主要劣势为作者已经不更新甚至不维护了。imdict :进入了 lucene trunk,原版 ictclas 在各种评测中都有不错的表现,有坚实的理论基础,不是个人山寨。缺点为暂时不支持用户词库。mmseg4j : 在complex基础上实现了最多分词(max-word),但是还不成熟,还有很多需要改进的地方。ik : 针对Lucene全文检索优化的查询分析器IKQueryParser

8. 结论

个人觉得,可以在 mmseg4j 和 paoding 中选一个。关于这两个分词效果的对比,可以参考:

http://blog.chenlb.com/2009/04/mmseg4j-max-word-segment-compare-with-paoding-in-effect.html

或者自己再包装一下,将 paoding 的词库更新检测做一个单独的模块实现,然后就可以在所有基于词库的分词算法之间无缝切换了。

ps,对不同的 field 使用不同的分词器是一个可以考虑的方法。比如 tag 字段,就应该使用一个最简单的分词器,按空格分词就可以了。

======================================

对paoding je、IK等进行测试,发现JE使用时一不注意就容易出现在索引或者检索时内存泄漏,其加载字典时花费内存45m左右,所以在运行时一般会在环境下设置内存参数 -Xmx256M等方法解决 paoding 比较麻烦的是要设置字典的环境变量,一般做法是新建环境变量 PAODING_DIC_HOME 再加入字典路径(如 F:\paoding-analysis\dic) 这种方法在项目移位后还得配置字典环境,麻烦 可以直接把paoding源文件夹下的paoding-dic-home.properties拷贝的你自己的 项目src文件夹下,然后将paoding-dic-home.properties文件中的 #paoding.dic.home=dic修改成 paoding.dic.home=F:/paoding-analysis/dic即可 当然你可以自己建一个名为paoding-dic-home.properties的文件 在里面加入一条语句paoding.dic.home=F:/paoding-analysis/dic(字典路径,自己换) 别忘记拷贝lib文件夹下的jar文件到项目中, commons-logging.jar一定不能少 ----------------------------下面是对同一个文件分词时间消耗 Time taken for PaoDing Analyzer behaviour : 1156 milli seconds Time taken for IK Analyzer behaviour : 1531 milli seconds Time taken for JE Analyzer behaviour : 1719 milli seconds