Lucene分词有多种实现,满足不同需求的分词。
package com.zhh.analyzer;
import java.io.StringReader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.TermAttribute;
import org.apache.lucene.util.Version;
public class AnalyzerDemo {
public static void main(String[] args) throws Exception {
Analyzer analyzer2 = new WhitespaceAnalyzer(); //空格分词
Analyzer analyzer3 = new StandardAnalyzer(Version.LUCENE_30); //单字分中文
String indexString1 = "中国建设银行 深发银行 广东发展银行";
String indexString2 = "这是一届创造奇迹、超越梦想的奥运会.......";
String indexString3 = "Welcome to Beijing";
showAnalyzerResult(analyzer3,indexString3);
showAnalyzerResult(analyzer2,indexString1);
showAnalyzerResult(analyzer3,indexString1);
showAnalyzerResult(analyzer2,indexString2);
showAnalyzerResult(analyzer3,indexString2);
}
public static void showAnalyzerResult(Analyzer analyzer, String str) throws Exception {
System.out.println("\n" + analyzer.getClass().getSimpleName());
StringReader reader = new StringReader(str);
TokenStream ts = analyzer.tokenStream(str, reader);
TermAttribute termAttribute =ts.getAttribute(TermAttribute.class);
while (ts.incrementToken()) {
System.out.println(termAttribute.term());
}
}
}
在这里主要记录中文分词。
常见的中文分词有 极易分词,庖丁分词,IKAnalyzer
由于极易分词早就不更新了,最高支持到Lucene2.4版。
Lucene版本间向下兼容比较差,造成分词器选用时必须找对版本。
极易分词只支持1.9-2.4版,未测试
IKAnalyzer分词 2012版不支持,采用3.2.8版
在使用2012版时异常:ClassNotFoundException: org.apache.lucene.analysis.tokenattributes.CharTermAttribute
庖丁分词 使用 paoding-analysis-2.0.4-beta.zip 版时异常
Exception in thread "main" java.lang.AbstractMethodError: org.apache.lucene.analysis.TokenStream.incrementToken()Z
换用svn里源码版正常 http://paoding.googlecode.com/svn/trunk/paoding-analysis/
package com.zhh.analyzer;
import java.io.StringReader;
import net.paoding.analysis.analyzer.PaodingAnalyzer;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.TermAttribute;
import org.wltea.analyzer.lucene.IKAnalyzer;
/**
* 中文分词
* @author zhh
* 极易分词不支持Lucene3 不作测试
*
*/
public class ChineseAnalyzer {
public static void main(String[] args) throws Exception{
String strZH = "核心提示:据媒体报道," +
"美国正在计划大规模扩张在亚洲的导弹防御系统。" +
"8月23日,美国国务院回应称,此举意在抵御来自朝鲜的导弹威胁," +
"而不是针对中国。美国表示,美国通过美中军事对话以及美中战略与" +
"经济对话等机制,已经就该导弹防御系统的意图与中国进行了广泛的对话。";
Analyzer analyzer01 = new IKAnalyzer(true); //当为true时,分词器进行智能切分
Analyzer analyzer02 = new PaodingAnalyzer();
showAnalyzerResult(analyzer01, strZH);
showAnalyzerResult(analyzer02, strZH);
}
public static void showAnalyzerResult(Analyzer analyzer, String str) throws Exception {
long start = System.currentTimeMillis();
System.out.println("\n" + analyzer.getClass().getSimpleName());
StringReader reader = new StringReader(str);
TokenStream ts = analyzer.tokenStream("", reader);
TermAttribute termAttribute =ts.getAttribute(TermAttribute.class);
long end = System.currentTimeMillis();
long time = end - start;
System.out.println("耗时:" + time + "ms");
while (ts.incrementToken()) {
System.out.print(termAttribute.term() + "|");
}
}
}
运行结果:
IKAnalyzer
耗时:1125ms
核心|提示|据|媒体报道|美国|正在|计划|大规模|扩张|张在|亚洲|的|导弹|防御|系统|8|月|23|日|美国|国务院|回应|称|此举|意在|抵御|来自|朝鲜|的|导弹|威胁|而|不是|针对|中国|美国|表示|美国|通过|美中|中军|军事|对话|以及|美中|战略|与|经济|对话|等|机制|已经|就|该|导弹|防御|系统|的|意图|与|中国|进行了|广泛|的|对话|
PaodingAnalyzer
耗时:0ms
核心|提示|媒体|报道|美国|正在|计划|大|规模|扩张|张在|亚洲|导弹|防御|系统|8|月|23|日|美国|国务|国务院|回应|称|此举|意在|抵御|来自|朝鲜|导弹|威胁|而不|不是|针对|中国|美国|表示|美国|通过|美中|中军|军事|对话|美中|战略|经济|对话|等|机制|已经|就|导弹|防御|系统|系统的|意图|中国|进行|行了|广泛|对话|