IKAnalyzer 作者林良益访谈实录

关于开源访谈

开源访谈是开源中国推出的一系列针对国内优秀开源软件作者的访谈,以文字的方式记录并传播。我们希望开源访谈能全面的展现国内开源软件、开源软件作者的现状,着实推动国内开源软件的应用与发展。

【嘉宾简介】

IKAnalyzer 作者林良益访谈实录_第1张图片

林良益 一位资深的Java程序员,多个开源项目的发起者。有11年的程序开发和设计经验。从事过电信,证券,政府,互联网等多个领域的系统开发与设计。现任畅游福州分公司(17173)java系统架构师。

【软件简介】

IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出 了3个大版本。最初,它是以开源项目 Lucene为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。

【访谈实录】

1.    先介绍一下你自己吧,包括学习经历和工作经历
我是2001年福州大学计算机系毕业的。毕业到现在12年,我一直从事的是 Java 方面的开发,期间有做过电信行业的,政府行业的,也有证劵行业的系统。从2006年开始接触互联网,最早的时候做了一个WebGIS地图的网站,有点像 Google Map 这样的网站。到了2010年加入了搜狐福州分公司的17173,去年被畅游收购了。

2.    你是在17173做后台的架构是吗?
是,我们的网站有 PHP 和 Java 两块。那么 Java 这块就是我负责设计的。

3.    你是什么时候开发 IKAnalyzer,为什么要做这样的一个项目?
这个应该是在2006年的时候,在WebGIS这个项目中,当时给福建省电信开发一个叫做号码百事通指路服务。这就需要对全省的兴趣点(POI)进行针对名称的搜索,这个数据量就很大,传统的数据库是无法满足这个需求的。于是关注到Lucene,也看了车东大牛的文章(http://www.chedong.com/tech/lucene.html),他上面有对中文分词做了相应的介绍,为什么Lucene要用中文分词,Lucene的搜索机制是怎么样的。刚开始的时候我们也是用车工的 CJK 二元分词,后面发现在地理信息的搜索上面不是很适合,后来就自己开发了一个。 

4.    什么是二元分词?
二元分词是按两个汉字一个词这样去分解。

5.    你为什么要取 IK 这个名字呢?
哈,IK 这个名字是来源于暗黑破坏神2这款游戏,它是游戏中武器装备的名字。刚好我在做这个分词器的时候,我也在玩这款游戏,而且刚好打到这个装备,很开心。我们想想 Java 也是开发人员在开发的过程中正好在喝咖啡,所以就叫了 Java 这个名字。所以那时候我也在想,给这个分词器命名的话,我就把它命名为 Immortal King,中文名叫不朽之王,是那个装备的名称。这个名字就是这么来的。

6.    你能否大概解释一下Lucene还有 IK 要解决一个什么问题,以及大致的原理?
我们传统的数据库是把文本整段存在库里面,当是搜索一个词的时候,它使用这个词去大文本里面去匹配,这个匹配过程速度很慢。Lucene是一个全文搜索引擎,它的思路是倒过来的。它做的事情分成两个阶段。第一阶段是把文章,也就是长文本在存储的时候建索引。建索引的过程要把文本按照词来切分。切分的时候是按词源切分,再把每个词都作为索引,指出词在文章中的位置以及跟哪些文章相关联。当有大量文章进来的时候,你可以想象一下有一个字典,这个字典是按照词来排序,每个词都会记录有哪些文章引用到我了,以及文章的哪些部分。这个索引的过程就是Lucene做的一个存储过程。那在这个存储过程中,对于英文而言基本上按照空格来切分就可以了,但是中文是连续性的,所以计算机就需要一个能够识别中文词汇的程序和算法,这就是中文分词器。分词器在文章进入到数据库的时候,对它进行分词。比如用户输入了“咖啡牛排”,那分词器就要把这个切分成“咖啡”和“牛排”。

7.    市面上还有一些其他的分词器,那在你看来 IK 有什么优势和特点呢?
IK 最早的时候侧重于名称的搜索,到后期开始向通用的分词器演化。在 IK 2.0 出来的时候,它的速度应该是比较快的,当时能做到每秒60万汉字的处理速度。再后来就是 IK 的词典也比较有优势,匹配算法比较快。IK 的结构也能让你简单的添加和定制词典。一个词,一个换行这样就能生成一个词典,而其他算法需要有词频度的支持,或者把词典编译成“双数组Trie”结构。到了最新的 IK 2012版本,它的优势还在于有一定的歧义识别功能。举个例子,“质量和服务”。在切分的时候可以是“质量、和、服务”也可以是“质量、和服、务”,那最新版的 IK 是可以识别这样的歧义,目前的测试数据统计可以做到95%的准确率。这个和中科院的分词器(98%)来比还是有差距,但是对于中小规模,或者主要业务不是自然语言处理这样的一个公司来说,它是很好用的,它的词表很好管理。虽然搜狗或者百度有很强大的搜索引擎,但是你要执行它的整套算法是要对大量语料进行训练,这个过程是很漫长的。大部分企业是没有能力去建立这样的词库的。而 IK 的词库管理很简单,你有新词的话就往里面添加,它不需要什么词频度,词性等等复杂的定义,所以用户的入门门槛比较低。它的配置也是几个分词器中最简单的一种,这也是为什么在国内比较容易让大家接受。 

8.    也就是说如果我想添加“屌丝、白富美、高富帅”这些新词的话,只要把这几个词添加到词库文件就行了是吗?
是的,最好的方式是通用词典 API 这样一个简单的维护,它就可以实时的添加,而不需要你定义词性,比如形容词,名词之类的。当然这个算法也有一定的对于未知词语自动识别的能力,例如姓名,数量词,阿拉伯数字等等,这种是规则性匹配。所以匹配方式一共有两种,一种是规则性匹配,一种是词库性匹配。 

9.    那你在这个项目中有没有用一些特殊的或者创新的技术?
是有一些。一个是词典的数据结构的设计使得用户很容易的及时添加和删除词典。还有 IK 对于词典的搜索匹配是非常快的,完成22万个词的匹配大约只要80毫秒,词典匹配算法也是很重要的一块。另外就是 IK 的字符串扫描算法也很快,它不需要对字符串进行回溯扫描。就是它只需要从头到尾扫描一次,假如它发现一个词可能前面有另外一个词存在,它不需要把指针指到前面去重新扫描,具有一次扫描出所有结果的能力。另外就是我刚才说的排除歧义的功能,用到了一些“有向图”和“博弈树”的算法。这个是和地图导航很类似的算法。它把所有切出来有可能出现的词语组成了一个词源图,通过词源图权重的博弈(比大小),能够很快的识别出哪些词语的正确性更高。这样就能在一个有歧义的分词结果中找出最有可能正确的结果。 

10.   这些算法和数学的东西,有没有发表过一些论文呢?
目前还没有,我把这些写成代码,并且有比较详细的注释。 

11.    目前看来 IK 用的人还是比较多的,你是怎么推广的?
我最早是在 CSDN 和JavaEye论坛上发布帖子的方式推广,后面的话基本就是口碑了。IK 做的比较早,当时国内开源的中文分词器比较少,可能是占了一个先机吧。 

12.    开源中国目前用的是 IK,还有其他比较大的项目中用了这个产品吗?
最早我也把它用于电信级的搜索服务。我目前的公司使用的站内搜索,论坛敏感词的过滤也用了这个产品。之前也有网友告诉我,中国联通的一些项目也用了 IK 这个分词器。

13.    目前参与开发和维护 IK 的人员有哪些?
目前还是我一个人。不过我要感谢一直以来使用 IK 和帮助 IK 的网友,他们在 IK 的很多版本的演化过程中做了很多测试和 bug 反馈,提了很多建议。这也达到了我做开源的一个目的,就是让更多的人参与进来。虽然 IK 的开发是我一个人,但其实它的很多创意和想法是来自于网友的。

14.    在这期间没有人跟你提过说要跟你一起开发,或者给你提交代码?
确实是比较少。这也是我觉得中国开源不成熟的地方。中国很多人做事喜欢自己牵头,让他们去加入一个项目的话,可能从兴趣上不那么强烈。作为使用者,他们愿意出谋划策,让你吸收他的建议,做一个更适用于他的版本。

15.    本来这个问题我要放到后面再问,现在你正好提到,那就先讨论一下。国外的很多开源项目的话是一人发起众人参与,而国内的话基本上就是发起人自己在玩,你怎么看这个现象以及背后的原因呢?
首先我觉得国内对开源软件有一些误解。当初我进一个公司的时候,我们提议用开源软件,他们的第一反应就是免费,他们认为开源软件就是免费的。我一直在解释,开源不等于免费,开源有免费也有收费的。比如 Linux 和 MySQL,它们是开源的,但是它们也提供付费服务。国内的人喜欢把开源等同于免费,并等价于不稳定,质量不好。开源只是一种软件开发的方式,跟免费和质量是没有关系的。这是大部分国人理解的误区。当然也有一些人问我说他想参与某个项目的开发,应该怎么做。我认为参与开源项目的方式有很多,除了代码开发之外,还有文档,测试,bug提交等等。我认为真正影响开源在国内的普及是两个大环境的原因。一个是公司环境,一个是法律环境。目前国内只有很少以公司名义推出开源项目,例如淘宝,新浪,百度。而国外的话,很多开源项目要么是商业公司支持,要么是基金会的形式支持。所以很多国外的程序员是把做开源项目作为一种职业的。可能也是因为国人把开源等同于免费,所以商业公司就不愿意做开源项目。另外就是知识产权和相关的法律在国内的宣传是不够的。我如果想要给 IK 申请什么专利或者知识产权的话,我都不知道从何处入手,它能保护我哪些权利。我能做的就只能是把国外的开源协议附在我的项目里面。我相信很多人都跟我一样,对于著作权、版权之类的都是搞不清楚的。所以由于公司环境和法律环境的问题,导致了个人开源软件作者在为开源投入的时候,很难得到精神层面和物质层面的认可,只能依靠作者个人的激情去维持,但这是不长久的,特别是有生活压力的情况下。 

16.    你在 IK 这个项目上要花费多少精力呢?
一般来说,我一个月可能有一周的时间在这个项目上。我会把它结合到我的正式工作上,因为我工作中的很多开发是跟这个项目有关联的。如果工作上有需要的话,我会比较集中的开发这一块,如果工作的项目和这个无关的话我有可能几个月都不会做 IK 的开发,只是回复网友的邮件。当然如果有一些新的想法和思路的话,我也会做一些实践。IK 其实有很多没有发布的试用性版本。

17.    你有通过 IK 这个项目获得收入吗?
没有。曾经有人给我邮件说有捐款的意向,但是后来还是不了了之了。 

18.    IK 这个项目和你目前的全职工作有冲突吗?
没有,反而我觉得有一定的相关性。这个项目在我的工作中用到,反过来我在其他项目上用到的技术也可能被添加到 IK 中去。
19.    那也就是说你老板是知道你在做这个项目的?
是,但是我在工作时间是不会去做这个项目的。我认为工作时间做的东西会有版权的问题,所以我都是下班时间做。如果公司要用 IK 的代码的话,我会留公司的版权注释。还有就是我会用 jar 包的形式打包,而不是跟公司的源码混在一起。

20.    你有没有考虑过目前 IK 的用户量很大,你可以卖商业授权?
我有过这样的想法,但是不清楚如何操作,包括法律相关的问题,我刚才也提到过。 

21.    你对 IK 将来的发展有没有一个规划?
暂时没有,还是以维护为主。

22.    你在 Java 方面应该有不少研究和体会,那么你能不能给广大 Java 的初学者一些建议?
我的建议是从 Java 最基础的概念学起,不要太纠结于各种 Web 框架。对于算法和数据结构也需要学习和了解,因为任何一个项目你一旦深入必定涉及到算法和数据结构。

23.    你鼓励新手做开源项目吗?有什么建议?
我非常鼓励新手做开源项目,哪怕只是一时的激情。我希望中国的程序员都能够或多或少的加入到开源中来。每个人的力量都很小,但是只要大家都来做,我相信中国迟早也会形成向国外那样比较好的开源的氛围。在方法上的话,我建议做开源项目要贴近自己的工作。例如你的工作是做 C++ 的,那么你应该做 C++ 相关的项目。如果你的工作是游戏相关的,那你就应该做游戏相关的开源项目。假如你的工作是 C++,但你去做一个 PHP 的开源项目,这样可能会让你的精力顾不过来,也会使你的热情比较快的耗尽。IK 之所以能坚持六年是因为我一直以来的工作或多或少的都会跟这个项目有所接触。

24.    你对开源中国有什么意见或者建议?
刚才我们说到商业授权,版权等等的问题。这次在访谈之前我就在想,开源中国能否为开源作者提供相关的培训或者做一件让开源作者,开源软件使用者,还有开源中国这样的平台三方都受益的事情。我相信很多开源作者都是个人开始发起,并没有商业的追求,但是做大以后就有这样(获得一定收益)的可能性存在。那如果有人或者机构做这方面的一个引导,可以让开源项目朝这个方向发展就很好。 

你可能感兴趣的:(IKAnalyzer 作者林良益访谈实录)