IK Analyzer 3.0 中文分词器 - Lucene索引
1.IK Analyzer 3.0介绍
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特性
- 采用了特有的“正向迭代最细粒度切分算法“,具有50万字/秒的高速处理能力。(IK3.1以上版本已优化至65万字/秒)
- 采用了多子处理器分析模式,支持:英文字母(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.iteye.com 电子邮件:linliangyi2005@gmail.com
分词结果:
作者 | 博客 | linliangyi2007.iteye.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代码
- /**
- * 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.IKAnalyzerl
说明:IK分词器的主类,是IK分词器的Lucene Analyzer类实现。
该类使用方法请参考 “代码样例”章节
类org.wltea.analyzer.lucene.IKQueryParserl
publicn static Query parse(String field , String query) throws IOException
说明:单条件,单Field查询分析
参数1 :String field, 查询的目标域名称
参数2 :String query , 查询的关键字
返回值:构造一个单条件,单Field查询器
public static Queryn parseMultiField(String[] fields , String query) throws IOException
说明:多Field,单条件查询分析
参数1 :String[] fields, 多个查询的目标域名称的数组
参数2 :String query , 查询的关键字
返回值:构造一个多Field,单条件的查询器
public static Queryn 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的查询器
publicn static Query parseMultiField(String[] fields , String[] queries) throws IOException
说明:多Field,多条件查询分析
参数1 :String[] fields, 多个查询的目标域名称的数组
参数2 :String[] queries , 对应多个查询域的关键字数组
返回值:构造一个多Field,多条件的查询器
n 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的查询器
l 类org.wltea.analyzer.lucene.IKSimilarity
说明: IKAnalyzer 的相似度评估器。该类重载了DefaultSimilarity的coord方法,提高词元命中个数在相似度比较中的权重影响,即,当有多个词元得到匹配时,文档的相似度将提高。
该类使用方法请参考 “代码样例”章节
l 类org.wltea.analyzer.IKSegmentation
说明: 这是IK分词器的核心类。它是真正意义上的分词器实现。IKAnalyzer的3.0版本有别于之前的版本,它是一个可以独立于Lucene的Java分词器实现。当您需要在Lucene以外的环境中单独使用IK中文分词 组件时,IKSegmentation正是您要找的。
public Lexeme next() throws IOExceptionn
说明:读取分词器切分出的下一个语义单元,如果返回null,表示分词器已经结束。
返回值:Lexeme 语义单元对象,即相当于Lucene的词元对象Token
l 类org.wltea.analyzer.Lexeme
说明: 这是IK分词器的语义单元对象,相当于Lucene中的Token词元对象。由于3.0版本被设计为独立于Lucene的Java分词器实现,因此它需要Lexeme来代表分词的结果。
public int getBeginPosition()n
说明:获取语义单元的起始字符在文本中的位置
返回值:int , 语义单元相对于文本的绝对起始位置
public int getEndPosition()n
说明:获取语义单元的结束字符的下一个位置
返回值:int , 语义单元相对于文本的绝对终止位置的下一个字符位置
public int getLength()n
说明:获取语义单元包含字符串的长度
返回值:int , 语义单元长度 = getEndPosition – getBeginPosition
public String getLexemeText()n
说明:获取语义单元包含字符串内容
返回值:String, 语义单元的实际内容,即分词的结果
3.词表扩展
目前,IK分词器自带的主词典拥有22万左右的汉语单词量。由于作者个人的精力有限,并没有对搜集到的词库进行全范围的筛选、清理。此外,对于分词组件应用场景所涉及的领域的不同,也需要各类专业词库的支持。为此,IK分词器提供了对词典的扩充支持。
基于API的词典扩充
IK分词器支持使用API编程模型扩充您的词典。如果您的词典是存储与数据库中,这个方式应该对您适用。API如下:
类org.wltea.analyzer.dic.Dictionaryl
说明: IK分词器的词典对象。它负责中文词汇的加载,内存管理和匹配检索。
public static voidn 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代码
-
<?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包的起始根路径。
分享到:
相关推荐
IKAnalyzer继承Lucene的Analyzer抽象类,使用IKAnalyzer和Lucene自带的分析器方法一样,将Analyzer测试代码改为IKAnalyzer测试中文分词效果。 如果使用中文分词器ik-analyzer,就需要在索引和搜索程序中使用一致的...
IKAnalyzer分词器版本 2012 兼容Lucene3.3以上版本 对solr1.4提供接口实现 使用IK分词器,应为该集群使用到的solr版本为4.10.3-cdh5.7.5,所以使用的 IK 包为IKAnalyzer2012FF_u1.jar,如果是3x的solr,使用IK...
IKAnalyzer分词器版本 2012 兼容Lucene3.3以上版本 对solr1.4提供接口实现 使用IK分词器,应为该集群使用到的solr版本为4.10.3-cdh5.7.5,所以使用的 IK 包为IKAnalyzer2012FF_u1.jar,如果是3x的solr,使用IK...
lucene-IKAnalyzer2012_u6-lukeall.rar压缩包中包含lucene-4.10.3依赖包、中文分词器IKAnalyzer2012_u6的依赖包和索引库查看工具lukeall-4.10.0.jar(将jar拷贝到相应的索引库中双击打开即可查看)。解压后就可以...
IKAnalyzer中文分词器 jar包 + 使用文档 + 配置文件 + doc
ik分词器2012和lucene的资源和jar包以及lucene索引查看工具
新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。 开发环境及项目框架介绍 IDE:Intellij IDEA 数据库:MySQL,建立名为lucene的数据库, () 项目框架:...
IKAnalyzer3.2.8分词器 源码,用户lucene索引开发中
* Apache Lucene全文检索和IKAnalyzer分词工具类 * <p>Company: 91注册码 * time:2014-04-22 * @author www.91zcm.com * @date * @version 1.1 */ public class LuceneUtil { /**索引创建的路径**/ ...
IKAnalyzer分词 2012版不支持,采用3.2.8版 在使用2012版时异常:ClassNotFoundException: org.apache.lucene.analysis.tokenattributes.CharTermAttribute 庖丁分词 使用 paoding-analysis-2.0.4-beta.zip 版时...
使用Lucene 分词器Jsceg IkAnalyzer jar包 ucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了...
C) 第三方的中文分词器:如PaodingAnalyzer、IKAnalyzer 4) IndexWriter.MaxFieldLength: 指定域值的最大长度。 a) UNLIMITED 无限制的。 b) LIMITED 有限制的。值为10000 5) Document: 索引的组成单元. 一...
Lucene 3.6.1: 中文分词、创建索引库、排序、多字段分页查询以及高亮显示源 希望对大家有帮助, 我自己建立的mysql数据库 使用了IKAnalyzer分词器源代码,大家可以自己设置停词,也可以自己改写算法
IkanalyzerIntegrated IKAnalyze中文分词器集成 扩展 IKAnalyzer的停用词和新词 博客学习地址: luceneIndexDetail Lucene索引详解(IndexWriter详解、Document详解、索引更新)博客学习地址: luceneSearchDetail ...
2.创建索引(使用中科院中文分词工具ICTCLAS) 3.查询(实现简单的查询界面) 实验环境 编译环境:eclipse-jee-mars-2-win32-x86_64 编程环境:jdk1.8.0_111 编程语言:java、jsp 机器内存:8G (4G+4G) 时钟主频:...
信大家,在项目中,肯定要用到搜索引擎,搜索引擎用到全文搜索,分词这些,做一个简单的搜索引擎肯定要下两个jar包。... IKAnalyzer2012FF_u1.jar 分词 lucene-core-4.4.0.jar 一个用Java写的全文索引引擎工具包
3.4 IKAnalyzer中文分词类库 7 3.5 索引与搜索核心算法 7 4 数据库连接技术 8 4.1 JDBC 8 4.2 本实验对数据库连接的封装 9 5 实验环境 9 6 本地文件全文搜索实验方案 10 6.1 系统简介 10 6.2 实现方案介绍 11 6.3 ...
IKAnalyzer分词器:一个比较出名的中文分词器 搜索结果排序 搜索结果摘要 条件搜索 SpringBoot SpringBoot就是为了简化我们的配置:约定大于配置 启动方式 在idea中直接使用启动 使用...
AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...
AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...