前提:文章基于lucene2.2。 目前最新版本的lucene自身提供的StandardAnalyzer已經(jīng)具備中文分詞的功能,但是不一定能夠滿足大多數(shù)應用的需要。 另外網(wǎng)友談的比較多的中文分詞器還有: CJKAnalyzer ChineseAnalyzer IK_CAnalyzer(MIK_CAnalyzer) 還有一些熱心網(wǎng)友自己寫的比較不錯的分詞器在此就不說了,有興趣的可以自己研究研究。 以上三個中文分詞器并不是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開發(fā)的。以上分詞器各有優(yōu)劣,比較如下: 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); } } 分詞結(jié)果如下: 我們測試的字符串是:中華人民共和國在1949年建立,從此開始了新中國的偉大篇章。 =====StandardAnalyzer==== 分析方法:默認沒有詞只有字(一元分詞) 中 華 人 民 共 和 國 在 1949 年 建 立 從 此 開 始 了 新 中 國 的 偉 大 篇 章 =====CJKAnalyzer==== 分析方法:交叉雙字分割(二元分詞) 中華 華人 人民 民共 共和 和國 國在 1949 年建 建立 從此 此開 開始 始了 了新 新中 中國 國的 的偉 偉大 大篇 篇章 =====chinese analyzer==== 分析方法:基本等同StandardAnalyzer(一元分詞) 中 華 人 民 共 和 國 在 年 建 立 從 此 開 始 了 新 中 國 的 偉 大 篇 章 =====IK_CAnalyzer==== 分析方法:字典分詞,正反雙向搜索 中華人民共和國 中華人民 中華 華人 人民共和國 人民 人 共和國 共和 1949年 建立 從此 開始 新中國 中國 偉大 大篇 篇章 如果 ik_CAnalyzer(String str) 里采用 Analyzer analyzer = new MIK_CAnalyzer(); 那么該方法的分詞結(jié)果是: 中華人民共和國 1949年 建立 從此 開始 新中國 偉大 大篇 篇章 可以看到各種分詞結(jié)果各不相同,根據(jù)應用的需要可以選擇合適的分詞器。 關(guān)于IKAnalyzer的介紹可以參考: http://blog.csdn.net/dbigbear/archive/2007/01/24/1492380.aspx 文章來源:永恒論壇-h(huán)ttp://www. http://www./Article.htm?cId=2&fId=3&aId=88 |
|