您的位置:首页 > 其它

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

2012-06-15 10:55 453 查看
原文地址: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: