Lucene关于几种中文分词的总结

前提:文章基于lucene2.2
目前最新版本的lucene自身提供的StandardAnalyzer已经具备中文分词的功能,但是不一定能够满足大多数应用的需要。
另外网友谈的比较多的中文分词器还有:
CJKAnalyzer
ChineseAnalyzer
IK_CAnalyzer
MIK_CAnalyzer
还有一些热心网友自己写的比较不错的分词器在此就不说了,有兴趣的可以自己研究研究。
以上三个中文分词器并不是lucene2.2.jar里提供的。
CJKAnalyzer
ChineseAnalyzer分别是lucene-2.2.0目录下contrib目录下analyzerslucene-analyzers-2.2.0.jar提供的分别位于cncjk目录
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   render   =   new   StringReader(str);                  
                        StopFilter   stopFilter   =   (StopFilter)   analyzer.tokenStream( " ",   render  );
                        System.out.println( "=====StandardAnalyzer==== ");
                        System.out.println( "
分析方法:默认没有词只有字(一元分词) ");
                        Token   token;                  
                      while   ((token   =   stopFilter.next())   !=   null)   {                  
                                    System.out.println(token.termText());                  
                        }              
            }
          public   static   void   CJK_Analyzer(String   str)   throws   Exception{
                        Analyzer   analyzer   =   new   CJKAnalyzer();                  
                        Reader   render   =   new   StringReader(str);                  
                        StopFilter   stopFilter   =   (StopFilter)   analyzer.tokenStream( " ",   render);
                        System.out.println( "=====CJKAnalyzer==== ");
                        System.out.println( "
分析方法:交叉双字分割(二元分词) ");
                        Token   token;                  
                      while   ((token   =   stopFilter.next())   !=   null)   {                  
                                    System.out.println(token.termText());                  
                        }               
            }
          public   static   void   Chiniese_Analyzer(String   str)   throws   Exception{
                        Analyzer   analyzer   =   new   ChineseAnalyzer();                  
                        Reader   render   =   new   StringReader(str);                  
                        TokenFilter   tokenFilter   =   (TokenFilter)   analyzer.tokenStream( " ",   render);
                        System.out.println( "=====chinese   analyzer==== ");
                        System.out.println( "
分析方法:基本等同StandardAnalyzer(一元分词) ");
                        Token   token;                  
                      while   ((token   =   tokenFilter.next())   !=   null)   {                  
                                    System.out.println(token.termText());                  
                        }              
            }
          public   static   void   ik_CAnalyzer(String   str)   throws   Exception{
//                     Analyzer   analyzer   =   new   MIK_CAnalyzer();
                        Analyzer   analyzer   =   new   IK_CAnalyzer();
                        Reader   reader   =   new   StringReader(str);  
                        TokenStream   tokenStream   =   (TokenStream)analyzer.tokenStream( " ",   reader);
                        System.out.println( "=====IK_CAnalyzer==== ");
                        System.out.println( "
分析方法:字典分词,正反双向搜索 ");
                        Token   token;        
                      while   ((token   =   tokenStream.next())   !=   null)   {        
                                  System.out.println(tokenStream.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://topic.csdn.net/u/20070714/13/84db902a-9128-4b1b-8dd8-a631f15db931.html

你可能感兴趣的:(apache,.net,Blog,Lucene)