目前最新版本的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
文章來源:永恒論壇-http://www.yyhweb.com
http://www.yyhweb.com/Article.htm?cId=2&fId=3&aId=88
