来源:http://hi.baidu.com/silyt/blog/item/50be8bfd01746c41d6887d89.html
Lucene几种中文分词的总结
2008-04-07 09:10
IK_CAnalyzer下载地址:http://cn.ziddu.com/download.php?uid=ZrKcmJepZbOb4palZLKWlJiiZaycmps%3D4
目前最新版本的lucene自身提供的StandardAnalyzer已经具备中文分词的功能,但是不一定能够满足大多数应用的需要。 另外网友谈的比较多的中文分词器还有: CJKAnalyzer ChineseAnalyzer IK_CAnalyzer(MIK_CAnalyzer) 还有一些热心网友自己写的比较不错的分词器在此就不说了,有兴趣的可以自己研究研究。 以上三个中文分词器并不是lucene2.2.jar里提供的。 CJKAnalyzer和ChineseAnalyzer分别是lucene-2.2.0目录下contrib目录下analyzers的lucene-analyzers-2.2.0.jar提供的。分别位于cn和cjk目录。 IK_CAnalyzer(MIK_CAnalyzer)是基于分词词典,目前最新的1.4版本是基于lucene2.0开发的。以上分词器各有优劣,比较如下: import java.io.Reader; import java.io.StringReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.StopFilter; import org.apache.lucene.analysis.Token; import org.apache.lucene.analysis.TokenFilter; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.cjk.CJKAnalyzer; import org.apache.lucene.analysis.cn.ChineseAnalyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.mira.lucene.analysis.IK_CAnalyzer; import org.mira.lucene.analysis.MIK_CAnalyzer;
public class All_Test { private static String string = "中华人民共和国在1949年建立,从此开始了新中国的伟大篇章。"; public static void Standard_Analyzer(String str) throws Exception{ Analyzer analyzer = new StandardAnalyzer(); Reader r = new StringReader(str); StopFilter sf = (StopFilter) analyzer.tokenStream("", r); System.out.println("=====StandardAnalyzer===="); System.out.println("分析方法:默认没有词只有字(一元分词)"); Token t; while ((t = sf.next()) != null) { System.out.println(t.termText()); } } public static void CJK_Analyzer(String str) throws Exception{ Analyzer analyzer = new CJKAnalyzer(); Reader r = new StringReader(str); StopFilter sf = (StopFilter) analyzer.tokenStream("", r); System.out.println("=====CJKAnalyzer===="); System.out.println("分析方法:交叉双字分割(二元分词)"); Token t; while ((t = sf.next()) != null) { System.out.println(t.termText()); } } public static void Chiniese_Analyzer(String str) throws Exception{ Analyzer analyzer = new ChineseAnalyzer(); Reader r = new StringReader(str); TokenFilter tf = (TokenFilter) analyzer.tokenStream("", r); System.out.println("=====chinese analyzer===="); System.out.println("分析方法:基本等同StandardAnalyzer(一元分词)");
Token t; while ((t = tf.next()) != null) { System.out.println(t.termText()); } } public static void ik_CAnalyzer(String str) throws Exception{ // Analyzer analyzer = new MIK_CAnalyzer(); Analyzer analyzer = new IK_CAnalyzer(); Reader r = new StringReader(str); TokenStream ts = (TokenStream)analyzer.tokenStream("", r); System.out.println("=====IK_CAnalyzer===="); System.out.println("分析方法:字典分词,正反双向搜索"); Token t; while ((t = ts.next()) != null) { System.out.println(t.termText()); } } public static void main(String[] args) throws Exception{ String str = string; System.out.println("我们测试的字符串是:"+str); Standard_Analyzer(str); CJK_Analyzer(str); Chiniese_Analyzer(str); ik_CAnalyzer(str); }
} 分词结果如下: 我们测试的字符串是:中华人民共和国在1949年建立,从此开始了新中国的伟大篇章。 =====StandardAnalyzer==== 分析方法:默认没有词只有字(一元分词) 中 华 人 民 共 和 国 在 1949 年 建 立 从 此 开 始 了 新 中 国 的 伟 大 篇 章 =====CJKAnalyzer==== 分析方法:交叉双字分割(二元分词) 中华 华人 人民 民共 共和 和国 国在 1949 年建 建立 从此 此开 开始 始了 了新 新中 中国 国的 的伟 伟大 大篇 篇章 =====chinese analyzer==== 分析方法:基本等同StandardAnalyzer(一元分词) 中 华 人 民 共 和 国 在 年 建 立 从 此 开 始 了 新 中 国 的 伟 大 篇 章 =====IK_CAnalyzer==== 分析方法:字典分词,正反双向搜索 中华人民共和国 中华人民 中华 华人 人民共和国 人民 人 共和国 共和 1949年 建立 从此 开始 新中国 中国 伟大 大篇 篇章 如果 ik_CAnalyzer(String str) 里采用 Analyzer analyzer = new MIK_CAnalyzer(); 那么该方法的分词结果是:
中华人民共和国 1949年 建立 从此 开始 新中国 伟大 大篇 篇章
可以看到各种分词结果各不相同,根据应用的需要可以选择合适的分词器。 关于IKAnalyzer的介绍可以参考: http://blog.csdn.net/dbigbear/archive/2007/01/24/1492380.aspx
IK_CAnalyzer下载地址:http://cn.ziddu.com/download.php?uid=ZrKcmJepZbOb4palZLKWlJiiZaycmps%3D4 |
========================================================
来源:http://lucene-group.group.javaeye.com/group/blog/165287
关键字: lucene 开源 中文分词 源码下载 ikanalyzer
使用说明: 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());
- }
- }
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 = 无家可归