1. IKAnalyzer3.0介绍
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文本分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。
1.1 IKAnalyzer3.0特性
采用了特有的“正向迭代最细粒度切分算法“,具有50万字/秒的高速处理能力。
采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。
优化的词典存储,更小的内存占用。支持用户词典扩展定义
针对Lucene全文检索优化的查询分析器IKQueryParser(作者吐血推荐);采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。
1.2 分词效果示例
文本原文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
作者博客: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/
GoogleCodeSVN下载:http://ik-analyzer.googlecode.com/svn/trunk/
2.2 安装部署
IKAnalyzer安装包包含:
.IKAnalyzer3.0GA.jar
IKAnalyzer.cfg.xml
它的安装部署十分简单,将IKAnalyzer3.0GA.jar部署于项目的lib目录中;IKAnalyzer.cfg.xml文件放置在代码根目录(对于web项目,通常是WEB-INF/classes目录,同hibernate、log4j等配置文件相同)下即可。
2.3 Lucene用户快速入门
代码样例
IKAnalyzerDemo
Demo/**
*IKAnalyzerDemo*@paramargs*/
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;
/**
* /*@authorlinly
**/
public class IKAnalyzerDemo {
public static void main(String[] args) {
// LuceneDocument的域名
String fieldName = "text";// 检索内容
String text = "IKAnalyzer是一个结合词典分词和文法分词的中文分词开源工具包。它使用了全新的正向迭代最细粒度切分算法。";
// 实例化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:IKAnalyzer是一个结合词典分词和文法分词的中文分词开源工具包。它使用了全新的正向迭代最细粒度切分算法。>>