天天看點

lucene分詞多種方法

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

lucene分詞多種方法