Lucene關於幾種中文分詞的總結

原文地址:http://topic.csdn.net/u/20070714/13/84db902a-9128-4b1b-8dd8-a631f15db931.html
前提:文章基於lucene2.2。 
目前最新版本的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 

發佈了110 篇原創文章 · 獲贊 16 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章