使用说明:
IKAnalyzer 基于lucene2.0 版本API 开发,实现了以词典分词为基础的正反向全切分算法,是Lucene Analyzer 接口的实现,代码使用例子如下:
-
import org.mira.lucene.analysis.IK_CAnalyzer <------- 引用类
import .....
public class IKAnalyzerTest extends TestCase {
RAMDirectory directory;
private IndexSearcher searcher;
public void setUp() throws Exception {
directory = new RAMDirectory();
IndexWriter writer = new IndexWriter(directory,
new IK_CAnalyzer(), <------- 实例化类
true);
Document doc = new Document();
doc.add(Field.Keyword("title", " 中文分词测试"));
doc.add(Field.Text("description", "Illidium Space Modulator"));
writer.addDocument(doc);
writer.close();
searcher = new IndexSearcher(directory);
}
public void testTermQuery() throws Exception {
Query query = new TermQuery(new Term("title", " 中文分词"));
Hits hits = searcher.search(query);
assertEquals(1, hits.length());
}
}
分词效果测试,命令行如下:
java -classpath IKAnalyzer.jar;lucene-core-2.0.0.jar org.mira.lucene.analysis.IK_CAnalyzer 中华人民共和国香港特别行政区
性能与特性:
1. 正向全切分算法,42 万汉字字符/ 每秒的处理能力(IBM ThinkPad 酷睿I 1.6G 1G 内存 WinXP )
2. 对数量词、地名、路名的优化处理
3. 对未知词汇采用自识别结合二元切分算法,确保搜索召回率
V 2.0.2 修订 Bata 版对二元切分的缺陷
正向全切分分词器:org.mira.lucene.analysis.IK_CAnalyzer (适合建索引时使用)
正向最大全切分分词器:org.mira.lucene.analysis.MIK_CAnalyzer (适合用户输入检索时使用)
下面演示“ 正向最大全切分分词器” 效果:
例子:中华人民共和国香港特别行政区
0 - 7 = 中华人民共和国
7 - 14 = 香港特别行政区
例子:据路透社报道,印度尼西亚社会事务部一官员星期二(29 日) 表示,日惹市附近当地时间27 日晨5 时53 分发
生的里氏6.2 级地震已经造成至少5427 人死亡? ,20000 余人受伤,近20 万人无家可归。
1 - 4 = 路透社
4 - 6 = 报道
7 - 12 = 印度尼西亚
12 - 14 = 社会
14 - 17 = 事务部
17 - 18 = 一
18 - 20 = 官员
20 - 23 = 星期二
24 - 27 = 29 日
28 - 30 = 表示
31 - 34 = 日惹市
34 - 36 = 附近
36 - 40 = 当地时间
40 - 43 = 27 日
43 - 44 = 晨
44 - 46 = 5 时
46 - 49 = 53 分
48 - 50 = 分发
49 - 51 = 发生
52 - 54 = 里氏
54 - 58 = 6.2 级
58 - 60 = 地震
60 - 62 = 已经
62 - 64 = 造成
64 - 66 = 至少
66 - 71 = 5427 人
71 - 73 = 死亡
74 - 79 = 20000
79 - 81 = 余人
81 - 83 = 受伤
84 - 85 = 近
85 - 89 = 20 万人
89 - 93 = 无家可归
import org.mira.lucene.analysis.IK_CAnalyzer <------- 引用类
import .....
public class IKAnalyzerTest extends TestCase {
RAMDirectory directory;
private IndexSearcher searcher;
public void setUp() throws Exception {
directory = new RAMDirectory();
IndexWriter writer = new IndexWriter(directory,
new IK_CAnalyzer(), <------- 实例化类
true);
Document doc = new Document();
doc.add(Field.Keyword("title", " 中文分词测试"));
doc.add(Field.Text("description", "Illidium Space Modulator"));
writer.addDocument(doc);
writer.close();
searcher = new IndexSearcher(directory);
}
public void testTermQuery() throws Exception {
Query query = new TermQuery(new Term("title", " 中文分词"));
Hits hits = searcher.search(query);
assertEquals(1, hits.length());
}
}