IKAnalyzer中文分词器介绍_第1页
IKAnalyzer中文分词器介绍_第2页
IKAnalyzer中文分词器介绍_第3页
IKAnalyzer中文分词器介绍_第4页
IKAnalyzer中文分词器介绍_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

IKAnalyzer3 2 8 中文分词器介绍中文分词器介绍 2012 年 3 月 2 日 1 IKAnalyzer 简介简介 IKAnalyzer 是一个开源基于 JAVA 语言的轻量级的中文分词第三方工具 包 从 2006 年推出已经经历了三个较为完整的版本 目前最新版本为 3 2 8 它基于 lucene 为应用主体 但是 它也支持脱离 lucene 成为一个独 立的面向 JAVA 的分词工具 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 文件可以扩展专有词库及停止词库 配置如下 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的 BaseTokenizerFactory类 而org wltea analyzer lucene IKAnalyzer继承了lucene的 Analyzer类 8 在在 solr1 4 中使用中使用 IKQueryParser 由于 Solr 默认的 Query Parser 生成的 Query 一般是 短语查询 导致只 有很精确的结果才被搜索出来 比如默认情况下 库里有 北京爱皮科技有限公 司 用户搜索词为 爱皮公司 solr是不会把结果显示出来的 所以 必须分 别扩展 QParserPlugin QParser 代码如下 IKQParserPlugin import mon params SolrParams import mon util NamedList 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 args 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 mon params CommonParams import 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 IKQParser 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 getDefaultSearchFieldName 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 和其他中文分词器的比较和其他中文分词器的比较 目前流行的几大开源分词器主要有 paoding mmseg4j IKAnalyzer 它们三个 都是基于 JAVA 语言开发的 总体上来说没有谁最好 各有优劣 Paoding 开发者及活跃度 SVN 最后更新时间 2010 年 4 月 29 日 基本停止维护更新 速度 在 PIII 1G 内存个人机器上 1 秒 可准确分词 100 万 汉字 算法和代码复杂度 采用基于 不限制个数 的词典文件对文章进行有效切分 使能够将对词汇分类定义 7000 行左右 JAVA 代码 技术实现上和 IK 类似 文档 无 用户自定义词库 支持不限制个数的用户自定义词库 自动检测词库的更新 自带词库 22W 个 Lucene 和 solr 的支持 支持 Lucene3 0 和 solr 的集成需自己写代码扩展 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 IK 分词弱点 缺点分词弱点 缺点 总体来说 IK 是一个很不错的中文分词工具 但它自身也存在一些缺点 比如

温馨提示

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

评论

0/150

提交评论