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 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值