关于lucene中文分词(转)

来源:http://hi.baidu.com/silyt/blog/item/50be8bfd01746c41d6887d89.html

Lucene几种中文分词的总结
2008-04-07 09:10

IK_CAnalyzer下载地址:http://cn.ziddu.com/download.php?uid=ZrKcmJepZbOb4palZLKWlJiiZaycmps%3D4

       

目前最新版本的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

IK_CAnalyzer下载地址:http://cn.ziddu.com/download.php?uid=ZrKcmJepZbOb4palZLKWlJiiZaycmps%3D4

========================================================

来源:http://lucene-group.group.javaeye.com/group/blog/165287

lucene开源中文分词器 IKAnalyzer2.0.2 共享及源码发布

关键字: lucene 开源 中文分词 源码下载 ikanalyzer 

使用说明:
IKAnalyzer基于lucene2.0版本API开发,实现了以词典分词为基础的正反向全切分算法,是Lucene Analyzer接口的实现,代码使用例子如下:
Java代码
  1. import org.mira.lucene.analysis.IK_CAnalyzer <------- 引用类   
  2. import .....   
  3.   
  4. public class IKAnalyzerTest extends TestCase {   
  5.   
  6.    RAMDirectory directory;   
  7.    private IndexSearcher searcher;   
  8.   
  9.    public void setUp() throws Exception {   
  10.   
  11.      directory = new RAMDirectory();   
  12.      IndexWriter writer = new IndexWriter(directory,   
  13.                       new IK_CAnalyzer(), <------- 实例化类   
  14.                           true);   
  15.   
  16.      Document doc = new Document();   
  17.      doc.add(Field.Keyword("title""中文分词测试"));   
  18.      doc.add(Field.Text("description""Illidium Space Modulator"));   
  19.      writer.addDocument(doc);   
  20.      writer.close();   
  21.      searcher = new IndexSearcher(directory);   
  22.   }   
  23.   
  24.   public void testTermQuery() throws Exception {   
  25.     Query query = new TermQuery(new Term("title""中文分词"));   
  26.     Hits hits = searcher.search(query);   
  27.     assertEquals(1, hits.length());   
  28.   }   
  29. }  


分词效果测试,命令行如下:
java -classpath IKAnalyzer.jar;lucene-core-2.0.0.jar org.mira.lucene.analysis.IK_CAnalyzer 中华人民共和国香港特别行政区

性能与特性:
1. 正向全切分算法,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I 1.6G 1G内存 WinXP)
2. 对数量词、地名、路名的优化处理
3. 对未知词汇采用自识别结合二元切分算法,确保搜索召回率

V 2.0.2 修订 Bata版对二元切分的缺陷

正向全切分分词器:org.mira.lucene.analysis.IK_CAnalyzer(适合建索引时使用)

正向最大全切分分词器:org.mira.lucene.analysis.MIK_CAnalyzer(适合用户输入检索时使用)

下面演示“正向最大全切分分词器”效果:

例子:中华人民共和国香港特别行政区
0 - 7 = 中华人民共和国
7 - 14 = 香港特别行政区


例子:据路透社报道,印度尼西亚社会事务部一官员星期二(29日)表示,日惹市附近当地时间27日晨5时53分发

生的里氏6.2级地震已经造成至少5427人死亡?,20000余人受伤,近20万人无家可归。
1 - 4 = 路透社
4 - 6 = 报道
7 - 12 = 印度尼西亚
12 - 14 = 社会
14 - 17 = 事务部
17 - 18 = 一
18 - 20 = 官员
20 - 23 = 星期二
24 - 27 = 29日
28 - 30 = 表示
31 - 34 = 日惹市
34 - 36 = 附近
36 - 40 = 当地时间
40 - 43 = 27日
43 - 44 = 晨
44 - 46 = 5时
46 - 49 = 53分
48 - 50 = 分发
49 - 51 = 发生
52 - 54 = 里氏
54 - 58 = 6.2级
58 - 60 = 地震
60 - 62 = 已经
62 - 64 = 造成
64 - 66 = 至少
66 - 71 = 5427人
71 - 73 = 死亡
74 - 79 = 20000
79 - 81 = 余人
81 - 83 = 受伤
84 - 85 = 近
85 - 89 = 20万人
89 - 93 = 无家可归
posted @ 2009-10-24 11:37  杨子宜  阅读(518)  评论(0编辑  收藏  举报