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

1.1 IK Analyzer 3.0结构设计 

1.2 IK Analyzer 3.0特性

  • 采用了特有的“正向迭代最细粒度切分算法“,具有80万字/秒的高速处理能力
  • 采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。
  • 优化的词典存储,更小的内存占用。支持用户词典扩展定义
  • 针对Lucene全文检索优化的查询分析器IKQueryParser(作者吐血推荐);采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。

1.3 分词效果示例

文本原文1:
IK-Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了3个大版本。
分词结果:
ik-analyzer | 是 | 一个 | 一 | 个 | 开源 | 的 | 基于 | java | 语言 | 开发 |  的 | 轻量级 | 量级 | 的 | 中文 | 分词 | 工具包 | 工具 |  从  | 2006 | 年 | 12 | 月 | 推出 | 1.0  | 版 | 开始 | ikanalyzer | 已经 |  推出 | 出了 |  3  |  个大 |  个 | 版本

文本原文2:
永和服装饰品有限公司
分词结果:
永和 | 和服 | 服装 | 装饰品 | 装饰 | 饰品 | 有限 |  公司

文本原文3:
作者博客:linliangyi2007.javaeye.com   电子邮件:linliangyi2005@gmail.com
分词结果:
作者 | 博客 |  linliangyi2007.javaeye.com |  2007 |  电子邮件 |  电子 |  邮件 |  地址 |  linliangyi2005@gmail.com |  2005

2.使用指南

2.1下载地址
GoogleCode开源项目 :http://code.google.com/p/ik-analyzer/
GoogleCode SVN下载:http://ik-analyzer.googlecode.com/svn/trunk/

2.2安装部署
IK Analyzer安装包包含:
1. 《IKAnalyzer中文分词器V3.0使用手册》(即本文档)
2. IKAnalyzer3.0GA.jar
3. IKAnalyzer.cfg.xml
它的安装部署十分简单,将IKAnalyzer3.0GA.jar部署于项目的lib目录中;IKAnalyzer.cfg.xml文件放置在代码根目录(对于web项目,通常是WEB-INF/classes目录,同hibernate、log4j等配置文件相同)下即可。

2.3 Lucene用户快速入门

代码样例

Java代码  
  1. /**
  2. * IK Analyzer Demo
  3. * @param args
  4. */
  5. import java.io.IOException;
  6. import org.apache.lucene.analysis.Analyzer;
  7. import org.apache.lucene.document.Document;
  8. import org.apache.lucene.document.Field;
  9. import org.apache.lucene.index.CorruptIndexException;
  10. import org.apache.lucene.index.IndexWriter;
  11. import org.apache.lucene.search.IndexSearcher;
  12. import org.apache.lucene.search.Query;
  13. import org.apache.lucene.search.ScoreDoc;
  14. import org.apache.lucene.search.TopDocs;
  15. import org.apache.lucene.store.Directory;
  16. import org.apache.lucene.store.LockObtainFailedException;
  17. import org.apache.lucene.store.RAMDirectory;
  18. //引用IKAnalyzer3.0的类
  19. import org.wltea.analyzer.lucene.IKAnalyzer;
  20. import org.wltea.analyzer.lucene.IKQueryParser;
  21. import org.wltea.analyzer.lucene.IKSimilarity;
  22. /**
  23. * @author linly
  24. *
  25. */
  26. public class IKAnalyzerDemo {
  27. public static void main(String[] args){
  28. //Lucene Document的域名
  29. String fieldName = "text";
  30. //检索内容
  31. String text = "IK Analyzer是一个结合词典分词和文法分词的中文分词开源工具包。它使用了全新的正向迭代最细粒度切分算法。";
  32. //实例化IKAnalyzer分词器
  33. Analyzer analyzer = new IKAnalyzer();
  34. Directory directory = null;
  35. IndexWriter iwriter = null;
  36. IndexSearcher isearcher = null;
  37. try {
  38. //建立内存索引对象
  39. directory = new RAMDirectory();
  40. iwriter = new IndexWriter(directory, analyzer, true , IndexWriter.MaxFieldLength.LIMITED);
  41. Document doc = new Document();
  42. doc.add(new Field(fieldName, text, Field.Store.YES, Field.Index.ANALYZED));
  43. iwriter.addDocument(doc);
  44. iwriter.close();
  45. //实例化搜索器
  46. isearcher = new IndexSearcher(directory);
  47. //在索引器中使用IKSimilarity相似度评估器
  48. isearcher.setSimilarity(new IKSimilarity());
  49. String keyword = "中文分词工具包";
  50. //使用IKQueryParser查询分析器构造Query对象
  51. Query query = IKQueryParser.parse(fieldName, keyword);
  52. //搜索相似度最高的5条记录
  53. TopDocs topDocs = isearcher.search(query , 5);
  54. System.out.println("命中:" + topDocs.totalHits);
  55. //输出结果
  56. ScoreDoc[] scoreDocs = topDocs.scoreDocs;
  57. for (int i = 0; i < topDocs.totalHits; i++){
  58. Document targetDoc = isearcher.doc(scoreDocs[i].doc);
  59. System.out.println("内容:" + targetDoc.toString());
  60. }
  61. } catch (CorruptIndexException e) {
  62. e.printStackTrace();
  63. } catch (LockObtainFailedException e) {
  64. e.printStackTrace();
  65. } catch (IOException e) {
  66. e.printStackTrace();
  67. } finally{
  68. if(isearcher != null){
  69. try {
  70. isearcher.close();
  71. } catch (IOException e) {
  72. e.printStackTrace();
  73. }
  74. }
  75. if(directory != null){
  76. try {
  77. directory.close();
  78. } catch (IOException e) {
  79. e.printStackTrace();
  80. }
  81. }
  82. }
  83. }
  84. }
/*** IK Analyzer Demo* @param args*/
import java.io.IOException;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.RAMDirectory;
//引用IKAnalyzer3.0的类
import org.wltea.analyzer.lucene.IKAnalyzer;
import org.wltea.analyzer.lucene.IKQueryParser;
import org.wltea.analyzer.lucene.IKSimilarity;/*** @author linly**/
public class IKAnalyzerDemo {public static void main(String[] args){//Lucene Document的域名String fieldName = "text";//检索内容String text = "IK Analyzer是一个结合词典分词和文法分词的中文分词开源工具包。它使用了全新的正向迭代最细粒度切分算法。";//实例化IKAnalyzer分词器Analyzer analyzer = new IKAnalyzer();Directory directory = null;IndexWriter iwriter = null;IndexSearcher isearcher = null;try {//建立内存索引对象directory = new RAMDirectory();   iwriter = new IndexWriter(directory, analyzer, true , IndexWriter.MaxFieldLength.LIMITED);Document doc = new Document();doc.add(new Field(fieldName, text, Field.Store.YES, Field.Index.ANALYZED));iwriter.addDocument(doc);iwriter.close();//实例化搜索器   isearcher = new IndexSearcher(directory);            //在索引器中使用IKSimilarity相似度评估器isearcher.setSimilarity(new IKSimilarity());String keyword = "中文分词工具包";//使用IKQueryParser查询分析器构造Query对象Query query = IKQueryParser.parse(fieldName, keyword);//搜索相似度最高的5条记录TopDocs topDocs = isearcher.search(query , 5);System.out.println("命中:" + topDocs.totalHits);//输出结果ScoreDoc[] scoreDocs = topDocs.scoreDocs;for (int i = 0; i < topDocs.totalHits; i++){Document targetDoc = isearcher.doc(scoreDocs[i].doc);System.out.println("内容:" + targetDoc.toString());}            } catch (CorruptIndexException e) {e.printStackTrace();} catch (LockObtainFailedException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally{if(isearcher != null){try {isearcher.close();} catch (IOException e) {e.printStackTrace();}}if(directory != null){try {directory.close();} catch (IOException e) {e.printStackTrace();}}}}
}

执行结果:
命中:1
内容:Document<stored/uncompressed,indexed,tokenized<text:IK Analyzer是一个结合词典分词和文法分词的中文分词开源工具包。它使用了全新的正向迭代最细粒度切分算法。>>

2.4 关键API说明

 类org.wltea.analyzer.lucene.IKAnalyzer
说明:IK分词器的主类,是IK分词器的Lucene Analyzer类实现。
该类使用方法请参考 “代码样例”章节

 类org.wltea.analyzer.lucene.IKQueryParser
 public static Query parse(String field , String query) throws IOException
说明:单条件,单Field查询分析
参数1 :String field,  查询的目标域名称
参数2 :String query , 查询的关键字
返回值:构造一个单条件,单Field查询器

 public static Query parseMultiField(String[] fields , String query) throws IOException
说明:多Field,单条件查询分析
参数1 :String[] fields,  多个查询的目标域名称的数组
参数2 :String query , 查询的关键字
返回值:构造一个多Field,单条件的查询器

 public static Query parseMultiField(String[] fields , String query ,  BooleanClause.Occur[] flags) throws IOException
说明:多Field,单条件,多Occur查询分析
参数1 :String[] fields,  多个查询的目标域名称的数组
参数2 :String query , 查询的关键字
参数3 :BooleanClause.Occur[] flags , 查询条件的组合方式(Or/And)
返回值:构造一个多Field,单条件,多Occur的查询器

 public static Query parseMultiField(String[] fields , String[] queries) throws IOException
说明:多Field,多条件查询分析
参数1 :String[] fields,  多个查询的目标域名称的数组
参数2 :String[] queries , 对应多个查询域的关键字数组
返回值:构造一个多Field,多条件的查询器

 public static Query parseMultiField(String[] fields , String[] queries , BooleanClause.Occur[] flags) throws IOException
说明:多Field,多条件,多Occur查询
参数1 :String[] fields,  多个查询的目标域名称的数组
参数2 :String[] queries , 对应多个查询域的关键字数组
参数3 :BooleanClause.Occur[] flags , 查询条件的组合方式(Or/And)
返回值:构造一个多Field, 多条件, 多Occur的查询器

 类org.wltea.analyzer.lucene.IKSimilarity
说明: IKAnalyzer 的相似度评估器。该类重载了DefaultSimilarity的coord方法,提高词元命中个数在相似度比较中的权重影响,即,当有多个词元得到匹配时,文档的相似度将提高。
该类使用方法请参考 “代码样例”章节

 类org.wltea.analyzer.IKSegmentation
说明: 这是IK分词器的核心类。它是真正意义上的分词器实现。IKAnalyzer的3.0版本有别于之前的版本,它是一个可以独立于Lucene的Java分词器实现。当您需要在Lucene以外的环境中单独使用IK中文分词 组件时,IKSegmentation正是您要找的。
 public Lexeme next() throws IOException
说明:读取分词器切分出的下一个语义单元,如果返回null,表示分词器已经结束。
返回值:Lexeme 语义单元对象,即相当于Lucene的词元对象Token

 类org.wltea.analyzer.Lexeme
说明: 这是IK分词器的语义单元对象,相当于Lucene中的Token词元对象。由于3.0版本被设计为独立于Lucene的Java分词器实现,因此它需要Lexeme来代表分词的结果。
 public int getBeginPosition()
说明:获取语义单元的起始字符在文本中的位置
返回值:int , 语义单元相对于文本的绝对起始位置

 public int getEndPosition()
说明:获取语义单元的结束字符的下一个位置
返回值:int , 语义单元相对于文本的绝对终止位置的下一个字符位置

 public int getLength()
说明:获取语义单元包含字符串的长度
返回值:int , 语义单元长度 = getEndPosition – getBeginPosition

 public String getLexemeText()
说明:获取语义单元包含字符串内容
返回值:String, 语义单元的实际内容,即分词的结果

3.词表扩展

目前,IK分词器自带的主词典拥有22万左右的汉语单词量。由于作者个人的精力有限,并没有对搜集到的词库进行全范围的筛选、清理。此外,对于分词组件应用场景所涉及的领域的不同,也需要各类专业词库的支持。为此,IK分词器提供了对词典的扩充支持。

基于API的词典扩充
IK分词器支持使用API编程模型扩充您的词典。如果您的词典是存储与数据库中,这个方式应该对您适用。API如下:

 类org.wltea.analyzer.dic.Dictionary
说明: IK分词器的词典对象。它负责中文词汇的加载,内存管理和匹配检索。
 public static void loadExtendWords(List<String> extWords)
说明:加载用户扩展的词汇列表到IK的主词典中,增加分词器的可识别词语。
参数1:List<String> extWords , 扩展的词汇列表
返回值:无

3.2基于配置的词典扩充
IK分词器还支持通过配置IKAnalyzer.cfg.xml文件来扩充您的专有词典。

1. 部署IKAnalyzer.cfg.xml
IKAnalyzer.cfg.xml部署在代码根目录下(对于web项目,通常是WEB-INF/classes目录)同hibernate、log4j等配置文件相同。

2. 词典文件的编辑与部署
分词器的词典文件格式是无BOM的UTF-8编码的中文文本文件,文件扩展名不限。词典中,每个中文词汇独立占一行,使用\r\n的DOS方式换行。(注,如果您不了解什么是无BOM的UTF-8格式, 请保证您的词典使用UTF-8存储,并在文件的头部添加一空行)。您可以参考分词器源码org.wltea.analyzer.dic包下的.dic文件。

词典文件应部署在Java的资源路径下,即ClassLoader能够加载的路径中。(推荐同IKAnalyzer.cfg.xml放在一起)

3. IKAnalyzer.cfg.xml文件的配置

Xml代码  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
  3. <properties>
  4. <comment>IK Analyzer 扩展配置</comment>
  5. <!--用户可以在这里配置自己的扩展字典-->
  6. <entry key="ext_dict">/mydict.dic ; /mypack/mydict2.dic ; /com/mycompany/dic/mydict3.dic ;</entry>
  7. </properties>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>  <comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典--><entry key="ext_dict">/mydict.dic ; /mypack/mydict2.dic ; /com/mycompany/dic/mydict3.dic ;</entry>
</properties>

在配置文件中,用户可一次配置多个词典文件。文件名使用“;”号分隔。文件路径为相对java包的起始根路径。

(全文终)

下载 :IKAnalyzer3.1.1稳定版完整包.rar

更多详细请参看《IKAnalyzer中文分词器V3.1.1使用手册.pdf》

最新:IKAnalyzer3.2.3稳定版已经发布,支持Lucene3.0和solr1.4
IK Analyzer 3.2.3版本修订

在3.2.0版本基础上,更新如下:
1.优化词典匹配算法,将IK分词器速度提高至80万字/秒
2.添加对韩文、日文的支持,采用单字切分
3.增加IKQueryParser的 setMaxWordLength 方法,使其支持最大词长切分

PS:如果您使用的是Solr1.3或者v2.9之前的Lucene,请下载IK Analyzer3.1.6GA使用! IK Analyzer3.2.X仅支持Lucene3.0以上版本。

下载地址

IKAnalyzer3.2.3稳定版发布包

IKAnalyzer3.2.3稳定版源代码

lucene 2.9以前用户请使用 IKAnalyzer V3.1.6GA

IKAnalyzer3.2.0稳定版已经发布,支持Lucene3.0和solr1.4
链接:http://www.javaeye.com/topic/542987

V3.1.1GA -- V3.1.5GA 版本变更一览

  • 1.添加“正向最大切分算法”。
  • 2.完善IK Analyzer对solr1.3版本的集成支持
  • 3.改进对文件名、邮件地址、英文数字混合字串的切分算法
  • 4.新增对停止词(stopword)的自定义扩展
  • 5.支持对JDK1.5的版本的集成

V3.1.6GA版本变更:
新增IK Analyzer对solr1.4版本的集成支持

1.新增org.wltea.analyzer.solr.IKTokenizerFactory14,支持solr1.4的TokenizerFactory接口配置

 类org.wltea.analyzer.solr.IKTokenizerFactory14
说明:该类继承与solr1.4的BaseTokenizerFactory,是IK分词器对solr1.4项目TokenizerFactory接口的扩展实现。从版本V3.1.6起。
属性:isMaxWordLength。该属性决定分词器是否采用最大词语切分。

solr1.4配置样例
使用IKAnalyzer的配置

Xml代码  
  1. <schema name="example" version="1.1">
  2. ……
  3. <fieldType name="text" class="solr.TextField">
  4. <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
  5. </fieldType>
  6. ……
  7. </schema>
<schema name="example" version="1.1">
……
<fieldType name="text" class="solr.TextField"><analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
……
</schema>

使用IKTokenizerFactory14的配置

Xml代码  
  1. <fieldType name="text" class="solr.TextField" >
  2. <analyzer type="index">
  3. <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory14" isMaxWordLength="false"/>
  4. ……
  5. </analyzer>
  6. <analyzer type="query">
  7. <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory14" isMaxWordLength="true"/>
  8. ……
  9. </analyzer>
  10. </fieldType>
<fieldType name="text" class="solr.TextField" ><analyzer type="index"><tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory14" isMaxWordLength="false"/>
……</analyzer><analyzer type="query"><tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory14" isMaxWordLength="true"/>……</analyzer>
</fieldType>

下载 :IKAnalyzer3.1.6GA完整包

更多详细请参看《IKAnalyzer中文分词器V3.1.6使用手册》

转载于:https://www.cnblogs.com/shitou/archive/2011/04/29/2032754.html

IK Analyzer 中文分词器相关推荐

  1. 采访IK Analyzer 中文分词器开源项目作者林良益(十三)

    转自: http://www.iteye.com/magazines/43-ik-analyzer 众所周知,全文搜索几乎已经成为每个网站的必须提供的基本功能之一,用Lucene构造一个"索 ...

  2. 【Elasticsearch】Elasticsearch analyzer 中文 分词器

    1.概述 转载: https://blog.csdn.net/tzs_1041218129/article/details/77887767 分词器首先看文章:[Elasticsearch]Elast ...

  3. lucene6中配置IK Analyzer同义词分词器

    首先需要基础知识 intellij idea中为lucene6配置IK Analyzer分词器 说到同义词分词器,从原理角度来说要了解了Analyzer Analyzer分词的原理 Analyzer类 ...

  4. Lucene 中文分词器概述 与 Ik-Analyzer 使用教程

    目录 中文分词器简述 Ik-Analyzer 概述与特性 Ik-Analyzer 下载与使用 创建索引 查询索引 Ik-Analyzer 官方示例源码 中文分词器简述 1.Apache Lucene  ...

  5. 玩转ES,一文教你掌握IK中文分词器

    前言 ES默认的分词器对中文分词并不友好,所以我们一般会安装中文分词插件,以便能更好的支持中文分词检索. 而ES的中文分词器中,最流行的必然是IK分词器. 一.IK分词器介绍 IK分词器在是一款基于词 ...

  6. 中文分词器 jcseg 和 IK Analyzer

    为什么要使用lucene中文分词器 在 lucene 的开发过程中,常常会遇到分词时中文识别的问题,lucene提供了 lucene-analyzers-common-5.0.0.jar包来支持分词, ...

  7. 如何在基于Lucene的中文分词器中添加自定义词典(如Paoding、mmseg4j、IK Analyzer)...

    如何在基于Lucene的中文分词器中添加自定义词典(如Paoding.mmseg4j.IK Analyzer) 2013-07-08 21:54:29|  分类: 计算机 |字号 订阅 1. 使用Pa ...

  8. ElasticSearch中文分词器-IK分词器的使用

    IK分词器的使用 首先我们通过Postman发送GET请求查询分词效果 GET http://localhost:9200/_analyze {"text":"农业银行& ...

  9. python连接es_Elasticsearch --- 3. ik中文分词器, python操作es

    一.IK中文分词器 1.下载安装 2.测试 #显示结果 {"tokens": [ {"token" : "上海","start_o ...

最新文章

  1. 子域名绑定html,DEDE二级域名(多站点)绑定详解
  2. php 点击表头排序,TP5+ajax实现点击表格表头切换排序,带分页
  3. 如果一个按钮被覆盖如何响应?
  4. 程序员的数学--排列组合(2)
  5. 移动端 fixed 固定按钮在屏幕下方,然后按钮被键盘顶上来...顶上来了有没有~
  6. 编程书说的“Go程序员应该让聚合类型的零值也具有意义”是在讲什么
  7. JLink v8固件丢失修复教程
  8. 架构部署001---双机集群(HA)系统
  9. .net5 不支持winform_.NET 5.0 RC 2 发布,正式版将在11月.NET Conf大会上发布
  10. SpringMVC→简介、MVC、SpringMVC工作原理、Maven搭建第一个SpringMVC、请求参数接收、重定向、文件上传、AJAX异步访问、请求参数接收绑定JSON、@注解及传参
  11. s一般怎么称呼自己的m_上海平面设计工资一般是多少,我该怎么提升自己的平面设计能力?...
  12. 如何安装uclient_UClient客户端下载_UClient客户端官方下载-太平洋下载中心
  13. php storm netbean,的Android R.drawable找不到符号...(使用netbean)
  14. nohup与前台后台操作
  15. 专业C语言论坛,每天C语言1-专业自动化论坛-中国工控网论坛
  16. Python字符串的‘ ’,“ ”,''' '''
  17. tomcat启动失败!‘Staring Tomcat v8.0 Server at localhost' has encountered a problem. failed to start
  18. 小说作者推荐:忘却的悠合集
  19. UnityShader学习——非真实感渲染
  20. mybatis mapperLocations配置失效

热门文章

  1. OpenGL基础55:文字渲染
  2. bzoj 1045: [HAOI2008]糖果传递
  3. google浏览器不能登录
  4. dp动态规划_最短路径累加和最大问题
  5. 吴恩达神经网络和深度学习-学习笔记-24-在不同的划分上进行训练和测试+不匹配数据划分的偏差和方差
  6. AD显示隐藏管脚——谈mos管封装的一个坑处
  7. Win10 IoT Core 更改密码(PowerShell)
  8. 亚吉铁路 + 蒙内铁路
  9. SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.
  10. oracle删除数据库中的所有数据的拼接语句