众所周知,全文搜索几乎已经成为每个网站的必须提供的基本功能之一,用Lucene构造一个“索引-查询”的应用是常见的java解决方案,目前由linliangyi2007创立的IK Analyzer是最好的Lucene 中文分词器之一。
首先介绍一下IKAnalyzer:IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer 已经推出了3个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。 最近刚刚发布了 3.1.1Stable稳定版本,新版本的IKAnalyzer 则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。
linliangyi2007 (林良益) 是一位资深的Java开发者和优秀开源开发者, JavaEye非常荣幸的采访了他。
linliangyi2007 (林良益) 博客: http://linliangyi2007.iteye.com/
欢迎大家推荐更多开源项目给我们,支持中国的开源项目发展,发站内短信给JavaEye管理员或者发信到
[email protected],谢谢。
JavaEye:1. hi,linliangyi2007 你好,非常荣幸能够采访你。你能介绍一下IK Analyzer 中文分词器开源项目是如何创立的吗?
linliangyi2007:好的,这个要从和lucene的结缘开始说起了,大概05年左右,开始是为了完成一个电信的信息管理系统,里面需要用到全文检索的。后来发现对中文搜索,lucene没有很好的分词支持。当时我发现最棒的就是车东的CJK了,应该说,他的blog文章对我的IK Analyzer 诞生起了很大的影响。 后来,我们公司开始做一个基于web gis的本地信息搜索网站的互联网应用,这就促使我萌生了自己写一个中文分词器的想法。最开始是基于对词典的匹配,后来对词典中未出现的词语就有了进一步处理的想法,IK Analyzer 的设计理念也是一步一步形成的。这期间也结合了很多互联网用户的搜索体验的反馈。
有趣的是,我的两位好朋友,也就是paoding分词器的作者和JE-MMAnalyzer分词器的作者,都在基本相同的时期开始了各自的分词器研究。 三个人也就热火朝天的讨论开了,有交流,也有比较。因为有了这样一个圈子和氛围,也使的IK分词器一直从06年底开始,不断的更新到现在。 大家的处理速度,算法的优化,还有词典的整理一直在持续。当然,由于大家都有自己的工作(吃饭问题很实际啊),期间都有一段时间,暂停了项目的发展,IK2.0是在07年初发布的,3.0则到了09年, 最近刚刚发布了 3.1.1Stable稳定版本。
JavaEye:2. IK Analyzer 中文分词器项目的特点和应用的主要方面是哪些?新版本做了哪些修正?
linliangyi2007:
IK Analyzer 是更多的考虑了互联网用户在产品及名址信息搜索这块的应用,IK特别适用于搜索商家,产品,名址,如商品交易,美食,娱乐,电子地图等,因为它是基于这样的应用诞生的。IK在一开始的设计的时候,它有一个隐形的目标,是对数词,量词,专有名词的增强处理,这是由于它的基于web gis搜索的需求定位决定的。 如果持续使用IK的用户,应该会发现,IK的早期版本对数量词,专有名词的切分,是整体输出的,举个例子:“2009年12月”,在IK1.x版本的时候,是作为一个词元输出的,对未知的路名,人名,商店,公司名称都是如此,因此很多用户说,IK早先版本的分词效果“看起来”特别好,注意,我这里说的是“看起来", 但搜索起来就未必了。
由于lucene搜索的倒排搜索结构,决定了lucene搜索的速度优势在于“全词匹配”而非like匹配,这就造成了过于粗粒度的输出分词结果好看,但用户经常搜索不到东西,在饱受公司客户“无情的”打击之后,IK后续的版本对此做了很大的改进。后期版本的切分越来越细碎,越来越不“漂亮”了,这点在3.0尤其明显,但保证了用户在分词搜索中的召回率。问题是,这点的改进会带来另一方面的负面影响,词打得太散,搜索的准确度下降了,为此IK3.0从问题的另一角度来提供了相对的解决方案。
JavaEye:3. 能否详细介绍一下这个解决方案?
linliangyi2007:
好的,使用lucene搜索的开发者应该注意到,分词器在其中扮演着两个角色:一个是在lucene建立索引库时候,对文档进行切分。这时候,细粒度的切分,保证信息能尽可能的被“查找到”;另一个使用分词器的过程,实在用户输入搜索关键字的过程。分词器要多关键字进行分词,而后同索引匹配。 IK3.0就在这个地方为用户提供了一个相对优化的搜索方式,一个是IKQueryParser,这个也是我在blog中吐血推荐的, 呵呵。对于大多普通的搜索应用,它能为用户提供不错的搜索关键字组合。
举个例子,用户搜索“永和服装饰品”,对于分词器而言,它会切分出“永和”“和服”“服装”“装饰”“饰品”等。但分词器没有判断的能力(实际上,目前所有的分词器,即便有部分排除歧义的功能,也不完善),如果强制分词器进行排歧义处理,则可能会得出完全错误的结果。IK则是尝试给出所有可能的方案,在IKQueryparser 中,它不是简单的返回所有分词结果的组合,而是建立起一个分词树,将有可能的组合放在一起,它的输出会类似于这样:(“永和” && “服装” && “饰品”) || (“和服”&& “装饰”), 通过这个搜索逻辑去索引中进行匹配,在现实中,我们完全可以假设只有合理的词元会搭配在一起, 那么,不合理的搭配,它的就可能不会出现,或者即使出现,但匹配度较低。 因此,IK3.0又给出了一个IKSimilarity的相似度评估器,来提高多词匹配的优先度,这样的搜索,就能形成高匹配度的文档,出现在前面,低匹配度的在后面,不合理的匹配就不出现的结果。这个也是自己的项目实战经历了。
IKSimilarity是实现了lucene Similarity的接口的,在进行搜索前,使用IndexSearch的API进行设置就好,这个在IK3.0的DEMO中有详细的例子说明,至此,IK3.0在尽可能保证文档召回率的前提下,实现了相关文档搜索匹配度的优先。当然,这不能绝对意义上杜绝不正确信息被搜索出来(PS:就目前各大主要搜索引擎的实现也是这样的)。在分词器的设计中,应该说不尽是IK,其他分词器的作者也是绞尽脑汁的想了很多, 但目前还没有特别完美的方案。对IK而言,我也收到了来至各方面用户的反馈,有用在互联网搜索领域的,有用于企业内部搜索的,还有做语言分析的,但就我个人的感觉而言,目前很难在一个分词器中,实现多种目标。
因此,我很赞同paoding的作者说的一句话,没有最好的分词器,只有最适合于某个领域的分词器。
JavaEye:4. 你能分析和比较一下类似的其他中文分词器项目吗?
linliangyi2007:简单说一下吧:
JE-MManalyzer:它的算法具有歧义分析,比较适合做垂直搜索和信息挖掘。他的中文名称是“极易”,开发者的理念是-简单即是美。
中科院的分词器:中科院的分词器很牛,其切分结果明显基于语义分析。
paoding:paoding的结构设计的非常灵活,适合于对其进行开源改造。
mmseg4j:单从mmseg4j 的项目介绍上看,它是一个很纯粹的基于词典分词的实现,既有细粒度的切分,也有最大长度的切分。应该说,是一个学习词典分词的很好的典范。
JavaEye:5. IK Analyzer 未来的roadmap是什么? 你对 IK Analyzer的规划和目标是什么?
linliangyi2007:就IK后期的roadmap而言,主要致力于两点,一个是词典的整理优化,这块工作量是巨大的,且是枯燥的,呵呵。3.1.版本后词条是27万,但其中有不少的“不合格”词语,需要被剔除。第二是,有可能引入词频和字频的统计算法,来优化对未知词语的处理,这个还处于理论阶段。
后期的想法,可能会考虑牺牲一定的性能,来换取分词效果,从企业应用和中小型互联网应用而言,10万汉字/秒以上的处理速度,应该都能够满足需求了。
JavaEye:6. 你对整个lucene搜索领域怎么看?能推荐几个你觉得比较关注的搜索领域热点吗?
linliangyi2007:lucene是一个相当优秀的全文检索核心框架,基于它的应用是很多的。就lucene自己而言,已经发展出了nutch(面向互联网),solr(面向企业集群)等多种应用,这些也都是全文索引领域最经常用到的。而实际上,lucene的索引特性还可以用在更多方面,比如,你可以用它了做web gis的地图引擎,这是一个已经成功实现的商用项目。
因此,对lucene的关注,我觉得应该开放自己的思维。因为索引在计算机应用中,领域是非常广泛的,大家应该不拘一格。这点要归功于google对数据搜索应用概念的推广,深入人心。
JavaEye:7. 未来搜索引擎的发展方向会有哪些呢?
linliangyi2007:大型互联网应用,比如google,他们的应该不仅是分词器了,应该是一个自然语言处理系统了,包括了自我学习能力。
先说搜索的内容形式,会多元化,实际上已经有国外的公司在研发了,基于音频的,图像的搜索,如通过歌词搜索音频内容,从搜索的用户体验上,会结合用户的使用习惯给出搜索结果。也就是说,在未来,有可能你和我在google上搜索相同的词语,出来的结果会有不同。
还有,就是搜索形式可能会更多,有针对特定类型信息的垂直搜索,信息挖掘,也可能是针对SNS方式的人际网络搜索。 其实搜索的本质就是按照用户的视角将纷繁的数据进行合理的组织,再呈现在用面前; 从最早的MIS系统的sql搜索,到现在,一直如此。至于搜索领域google这样的大公司,基于新的搜索技术的公司未来有可能有机会超过他们,我想,最终的网络世界一定是大一统的。大家以后应该是买数据赚钱,而不是服务了。服务的方式是有限的,服务的内容(数据)是无限的,是需要人们创造和提供的。
JavaEye:8. 目前IK Analyzer 是你一个人开发?还是有其他合作开发者?现在你平均每天花在IK Analyzer 上的时间大概是多久呢?
linliangyi2007:IK目前就我一人,我也一直在寻找合作者。(JavaEye: 希望什么样的合作者?)最关键的是兴趣和恒心吧。我基本上每天都会花至少30分钟来解答网友的问题,然后如果需要,就进行修订。平时有了新想法,就会进行试验,如果可行,就会发布新版本。有时候一天会有20多封邮件咨询问题,当然有时候一周才一封,呵呵。
JavaEye:9. 目前大概有多少用户在使用IK Analyzer?
linliangyi2007:初步估计从06年底到现在,应该有1万多用户。(JavaEye:很厉害
) 主要都是国内的,毕竟是中文的。
JavaEye:10. 为什么给这个项目起IK Analyzer 这个名字呢?
linliangyi2007:呵呵,这个问题问的好,我很喜欢Diablo,尤其是Diablo II,我玩暗黑7年了。暗黑中有个角色,野蛮人哦,它的终极套装就是“不朽之王Immortal King”,IK诞生的那一天,刚好是我打出一整套套装的那一天,于是就用这个套装的名字做纪念了,呵呵,感谢暴雪,感谢JavaEye,感谢CCAV。。。
听说java也是这么命名的,当时的设计人员正在喝java咖啡来着……
JavaEye:11. 你的开发环境是什么? 使用什么操作系统,和IDE?
linliangyi2007:我用Eclipse,操作系统多是windows,偶尔用linux, 客户多使用unix。
JavaEye:12. 通过开发IK Analyzer ,你对中国的软件开发人员做开源项目有什么感受和想法吗?
linliangyi2007:现在大家日常用的开发平台,95%以上都是国外的组织贡献的,中国在这块,是需要赶上的。中国的开源比前几年有了明显的发展,但还需要大家一起来参与。
希望大家能逐步型成贡献代码的习惯,其实开源不一定每个人都有做一个项目,参与其中就好, 哪怕就一小段的代码。linux能成功,它的很多核心代码都被阅读过,并通过网友们进行了补充和修订。中国的开源氛围薄弱,我觉得更多的是中国传统思想中,对知识保守的因素,师傅对徒弟都要留一手,何况是同业者呢。但我要说,思想的交互是互利的,知识在开放的氛围中增长的速度要远超过封闭的开发, 我经常跟我的同事进行头脑风暴,大家都很有收获的,碰撞后的思想,往往能产生意料之外的好结果。
JavaEye:13. 作为一个JavaEye老会员,你对JavaEye网站有什么建议和意见吗?
linliangyi2007:希望javaeye更专业更有深度。对新人创造更包容,更宽松的咨询空间,对老人们则是思想碰撞,温故知新的场所。