IKAnalyzer中文分词器介绍

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

IKAnalyzer3.2.8中文分词器介绍

2012年3月2日

1.IKAnalyzer简介

IKAnalyzer是一个开源基于JA V A语言的轻量级的中文分词第三方工具包,从2006年推出已经经历了三个较为完整的版本,目前最新版本为3.2.8,它基于lucene为应用主体,但是,它也支持脱离lucene,成为一个独立的面向JA V A的分词工具。

2.IKAnalyzer结构图

3.IKAnalyzer特性

a.算法采用“正向迭代最细粒度切分算法”,支持细粒度和最大词长两种分词

方式,速度最大支持80W字/秒(1600KB/秒)。

b.支持多子处理器分析模式:中文、数字、字母,并兼容日文、韩文。

c.较小的内存占用,优化词库占有空间,用户可自定义扩展词库。

d.扩展lucene的扩展实现,采用歧义分析算法优化查询关键字的搜索排列组

合,提高lucene检索命中率。

4.关键类介绍

org.wltea.analyzer.lucene.IKAnalyzer

IK分词主类,基于Lucene的Analyzer接口实现。

org.wltea.analyzer.lucene.IKQueryParser

IK分词器提供的Query解析、构造工具类,其中parseMultiField

函数(所有的重载函数)为关键函数。

org.wltea.analyzer.IKSegmentation

IK分词器的核心类,真正分词的实现类。

5.IK分词算法理解

根据作者官方说法IK分词器采用“正向迭代最细粒度切分算法”,分析它的源代码,可以看到分词工具类IKQueryParser起至关重要的作用,它对搜索关键词采用从最大词到最小词层层迭代检索方式切分,比如搜索词:“中华人民共和国成立了”,首先到词库中检索该搜索词中最大分割词,即分割为:“中华人民共和国”和“成立了”,然后对“中华人民共和国”切分为“中华人民”和“人民共和国”,以此类推。最后,“中华人民共和国成立了”切分为:“中华人民| 中华| 华人| 人民| 人民共和国| 共和国| 共和| 成立| 立了”,当然,该切分方式为默认的细粒度切分,若按最大词长切分,结果为:“中华人民共和国| 成立| 立了”。核心算法代码如下:

boolean accept(Lexeme _lexeme){

/*

* 检查新的lexeme 对当前的branch 的可接受类型

* acceptType : REFUSED 不能接受

* acceptType : ACCEPTED 接受

* acceptType : TONEXT 由相邻分支接受

*/

int acceptType = checkAccept(_lexeme);

switch(acceptType){

case REFUSED:

// REFUSE 情况

return false;

case ACCEPTED :

if(acceptedBranchs == null){

//当前branch没有子branch,则添加到当前branch下

acceptedBranchs = new ArrayList(2);

acceptedBranchs.add(new TokenBranch(_lexeme));

}else{

boolean acceptedByChild = false;

//当前branch拥有子branch,则优先由子branch接纳

for(TokenBranch childBranch : acceptedBranchs){

acceptedByChild = childBranch.accept(_lexeme) || acceptedByChild;

}

//如果所有的子branch不能接纳,则由当前branch接纳

if(!acceptedByChild){

acceptedBranchs.add(new TokenBranch(_lexeme));

}

}

//设置branch的最大右边界

if(_lexeme.getEndPosition() > this.rightBorder){

this.rightBorder = _lexeme.getEndPosition();

}

break;

case TONEXT :

//把lexeme放入当前branch的相邻分支

if(this.nextBranch == null){

//如果还没有相邻分支,则建立一个不交叠的分支

this.nextBranch = new TokenBranch(null);

}

this.nextBranch.accept(_lexeme);

break;

}

return true;

}

从代码中可以了解到,作者采用了递归算法(代码中加粗的部分)切分搜索词。若词存在子词则递归该函数,继续切分。

6.词库的扩展

IK本身带有27W的词库,对于词库的扩展目前支持两种方式,分别是配置文件和API扩展,同时提供了对用户自定义停止词的扩展支持。针对数据库存储字库,采用这种方式比较好。

基于API词库扩展:

类名:org.wltea.analyzer.dic.Dictionary

函数:public static void loadExtendWords(List extWords)

加载用户扩展的词汇列表到IK的主词典中。

函数:public static void loadExtendStopWords(List extStopWords)

加载用户扩展的停止词列表。

基于配置的词库扩展:

IKAnalyzer.cfg.xml文件可以扩展专有词库及停止词库。配置如下:

相关文档
最新文档