http://code.google.com/p/ki-analyzer/
ki-analyzer是基于ik-analyzer修改而来的分词库。在我之前使用ik时,因为ik提供的分词效果不能满足我 的需求,就在ik之上做了一层封装。这种封装既丑陋并且低效,而随着我的分词需求和ik提供的效果渐行渐远,就打算着手修改ik词库,便有了ki- analyzer。ki-analyzer当然不能适合所有人,就像ik-analyzer不能适合我一样,但如果你正在寻找一个开源的分词程序,可以看 看ki-analyzer是否能适合你,以多一种选择。
和ik-analyzer相比,已实现的ki-analyzer的特点如下:
- 对于汉字分词,ik除了支持基本词库匹配以外,还格外处理了可能存在的姓氏、后缀、量词的分析。如果可以将此 理解为词性标注,那么它显然做的不够彻底,最为重要的名词、动词、形容词没有被标注出来,使得这种分析毫无实用价值。所以,ki-analyzer直接去 掉了相关代码,将这些不可识别的汉字标注为TYPE_CJK_UNKNOWN。
2,ik只支持全中文的词 库,这使得诸如"酷6"、"乐phone"等不能被分成一个词。而我觉得,词库应该支持的不单单是汉字组合,而可以是任意有效字符的组合,也就说,支持的 是短语匹配,比如"酷6"、"c#"、".net"、"data mine"都应该可以被切割出来。在我的主题词提取场景中,这种短语粒度的切割就很有必要,否则我只能在分词之上检查每个词条,看是否有构成短语的情况。 而就搜索应用来说,这种切割对于查询来说也会得到更好的效果。ki-analyzer对此做了支持。
3,ik内置了一个基本词库,并支持通过配置文件和程序接口外挂词库。ki-analyzer对此更 进一步,可以不使用程序提供的内置词库而在外置基本词库。另外,分出的词条Lexeme多出一个属性表示该词条是不是来自扩展词库的。以我的应用场景举 例,我除了有一个基本词库,还有一个扩展的IT领域词库,而在分词时,我是希望知道这个词条是来自哪个词库的,以便我做不同处理。
4,ik的IKSegmentation的构造函数有一个isMaxWordLength参数,表示 切出的词是不要最大粒度的。对于搜索应用来说,建索引时可以将isMaxWordLength=false,查询时将 isMaxWordLength=true。当isMaxWordLength=true,ik在输出词条前会过滤掉文本位置完全属于另一个词条的词条。 ki-analyzer将isMaxWordLength扩展成三个参数:isMaxCJKLength、isMaxLetterLength、 isMaxPhraseLength,可以针对应用场景分别设置。
ki-analyzer将要实现的功能:
- ki作者吐血推荐的IKQueryParser是个与或组合切词的parser,它对中文切词很合适,但对英 文切词,这种与或关系显然不如短语更合适。另外,受数量词的影响,IKQueryParser有时切出的词并不完整。因为我目前还没有将 ki-analyzer用到搜索场景中,所以对IKQueryParser还未做修改,接下来会做这方面的修改。
2,对于短语切词,将来会支持stemer功能。
ki-analyzer使用了maven,分成ki-core和ki-lucene两个包,目前ki-core已在测试使用中,计划成熟后会发布到nexus的仓库中。关于ki-analyzer的使用文档,后续会补充上。