IKAnalyzer中文分词器介绍_第1页
IKAnalyzer中文分词器介绍_第2页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 5/5IKAnalyzer中文分词器介绍 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.支持多子

2、处理器分析模式:中文、数字、字母,并兼容日文、韩文。 c.较小的内存占用,优化词库占有空间,用户可自定义扩展词库。 d.扩展lucene的扩展实现,采用歧义分析算法优化查询关键字的搜索排列组 合,提高lucene检索命中率。 4.关键类介绍 org.wltea.analyzer.lucene.IKAnalyzer IK分词主类,基于Lucene的Analyzer接口实现。 org.wltea.analyzer.lucene.IKQueryParser IK分词器提供的Query解析、构造工具类,其中parseMultiField 函数(所有的重载函数)为关键函数。 org.wltea.anal

3、yzer.IKSegmentation IK分词器的核心类,真正分词的实现类。 5.IK分词算法理解 根据官方说法IK分词器采用“正向迭代最细粒度切分算法”,分析它的源代码,可以看到分词工具类IKQueryParser起至关重要的作用,它对搜索关键词采用从最大词到最小词层层迭代检索方式切分,比如搜索词:“中华人民共和国成立了”,首先到词库中检索该搜索词中最大分割词,即分割为:“中华人民共和国”和“成立了”,然后对“中华人民共和国”切分为“中华人民”和“人民共和国”,以此类推。最后,“中华人民共和国成立了”切分为:“中华人民| 中华| 华人| 人民| 人民共和国| 共和国| 共和| 成立| 立了

4、”,当然,该切分方式为默认的细粒度切分,若按最大词长切分,结果为:“中华人民共和国| 成立| 立了”。核心算法代码如下: boolean accept(Lexeme _lexeme) /* * 检查新的lexeme 对当前的branch 的可接受类型 * acceptType : REFUSED 不能接受 * acceptType : ACCEPTED 接受 * acceptType : TONEXT 由相邻分支接受 */ int acceptType = checkAccept(_lexeme); switch(acceptType) case REFUSED: / REFUSE 情况 re

5、turn false; case ACCEPTED : if(acceptedBranchs = null) /当前branch没有子branch,则添加到当前branch下 acceptedBranchs = new ArrayList this.rightBorder) this.rightBorder = _lexeme.getEndPosition(); break; case TONEXT : /把lexeme放入当前branch的相邻分支 if(this.nextBranch = null) /如果还没有相邻分支,则建立一个不交叠的分支 this.nextBranch = new

6、TokenBranch(null); this.nextBranch.accept(_lexeme); break; return true; 从代码中可以了解到,采用了递归算法(代码中加粗的部分)切分搜索词。若词存在子词则递归该函数,继续切分。 6.词库的扩展 IK本身带有27W的词库,对于词库的扩展目前支持两种方式,分别是配置文件和API扩展,同时提供了对用户自定义停止词的扩展支持。针对数据库存储字库,采用这种方式比较好。 基于API词库扩展: 类名:org.wltea.analyzer.dic.Dictionary 函数:public static void loadExtendWord

7、s(List extStopWords) 加载用户扩展的停止词列表。 基于配置的词库扩展: IKAnalyzer.cfg.xml文件可以扩展专有词库及停止词库。配置如下: IK Analyzer 扩展配置 /mydict.dic; /com/mycompany/dic/mydict2.dic; /ext_stopword.dic 7.与solr的结合 可以说IK与solr的结合非常简单,只要把solr中的schema.xml添加如下代码即可: 或者是: 其中org.wltea.analyzer.solr.IKTokenizerFactory 继承了solr1.4的BaseTokenizerFa

8、ctory类,而org.wltea.analyzer.lucene.IKAnalyzer继承了lucene的Analyzer类。 8.在solr1.4中使用IKQueryParser 由于Solr 默认的Query Parser 生成的Query 一般是“短语查询”,导致只有很精确的结果才被搜索出来。比如默认情况下,库里有”北京爱皮科技有限公司”,用户搜索词为”爱皮公司”,solr是不会把结果显示出来的。所以,必须分别扩展:QParserPlugin、QParser,代码如下: IKQParserPlugin: import http:/./doc/be1f635477232f60ddcca1

9、79.html mon.params.SolrParams; import http:/./doc/be1f635477232f60ddcca179.html dList; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.search.QParser; import org.apache.solr.search.QParserPlugin; public class IKQParserPlugin extends QParserPlugin public void init(NamedList ar

10、gs) public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) return new IKQParser(qstr, localParams, params, req); IKQParser: import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.search.Query; import http:/./doc/be1f635477232f

11、60ddcca179.html monParams; import http:/./doc/be1f635477232f60ddcca179.html mon.params.SolrParams; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.search.QParser; import org.wltea.analyzer.lucene.IKQueryParser; class IKQParser extends QParser String defaultField; public IKQPa

12、rser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) super(qstr, localParams, params, req); public Query parse() throws ParseException String qstr = getString(); defaultField = getParam(CommonParams.DF); if (defaultField=null) defaultField = getReq().getSchema ().getDef

13、aultSearchFieldName(); Query query = null; query = IKQueryParser.parse(defaultField, qstr); return query; public String getDefaultHighlightFields() return defaultField = null ? null : new String defaultField; 将代码打包放到,solr-home的lib下面,配置solrconfig.xml里面:然后在下面增加ik即可。 9.和其他中文分词器的比较 目前流行的几大开源分词器主要有:paodi

14、ng、mmseg4j、IKAnalyzer,它们三个都是基于JA V A语言开发的,总体上来说没有谁最好,各有优劣。 Paoding 开发者及活跃度:SVN最后更新时间2010年4月29日,基本停止维护更新。速度:在PIII 1G内存个人机器上,1秒可准确分词100万汉字 算法和代码复杂度:采用基于不限制个数的词典文件对文章进行有效切分,使能够将对词汇分类定义,7000行左右JA V A代码。技术实现上和IK类似。 文档:无。 用户自定义词库:支持不限制个数的用户自定义词库,自动检测词库的更新。自带词库22W个。 Lucene和solr的支持:支持Lucene3.0,和solr的集成需自己写代

15、码扩展。mmseg4j 开发者及活跃度:SVN最后更新时间2011年6月29日。 速度:两种分词方法,Simple和Complex,目前complex 1200kb/s左右,simple 1900kb/s左右,但内存开销了50M左右。 算法和代码复杂度:MMSeg算法,2500行左右代码。 文档:MMSeg算法有英文文档,原理比较简单。 用户自定义词库:自带搜狗的词库,支持自定义词库,不支持自动检测。自带词库16W个。 Lucene和solr的支持:支持Lucene2.4、solr1.3 IKAnalyzer 开发者及活跃度:SVN最后更新时间2011年4月15日。 速度:每秒80W字。 算法和代码复杂度:正向迭代最细粒度切分算法,4500行左右代码。 文档:有一个中文使用手册。 用户自定义词库:支持自定义词库,不支持自动检测。自带词库27W个。Lucene和solr的支持:支持Lucene3.0、solr1.4 综上所述,IKAnalyzer具有一定的优势。 10.I K分词弱点、缺点 总体来说,IK是一个很不错的中文分词工具,但它自身也存在一些缺点,比如:a.对歧义分词还需要扩展、

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论