1、几种lucene提供的分词器
下面是几种分词器的代码实现示例。
import org.apache.lucene.analysis.*;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.analysis.core.KeywordAnalyzer;
import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.analysis.core.StopAnalyzer;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.FSDirectory;
import java.io.IOException;
import java.io.StringReader;
import java.nio.file.Paths;
/**
* Created by grant on 2019/9/18.
*/
public class VariousAnalyzer{
private static String str = "中华人民共和国简称中国, 是一个有13亿人口的国家";
public static void main(String[] args) throws IOException {
//标准分词器
Analyzer analyzer = null;
analyzer = new StandardAnalyzer();
System.out.println("标准分词:" + analyzer.getClass());
printAnalyzer(analyzer);
//空格分词
analyzer = new WhitespaceAnalyzer();
System.out.println("空格分词:" + analyzer.getClass());
printAnalyzer(analyzer);
//简单分词
analyzer = new SimpleAnalyzer();
System.out.println("简单分词:" + analyzer.getClass());
printAnalyzer(analyzer);
//二分法分词
analyzer = new CJKAnalyzer();
System.out.println("二分法分词:" + analyzer.getClass());
printAnalyzer(analyzer);
//关键词分词
analyzer = new KeywordAnalyzer();
System.out.println("关键词分词:"+ analyzer.getClass());
printAnalyzer(analyzer);
//停用词分词
analyzer = new StopAnalyzer();
System.out.println("停用词分词:"+ analyzer.getClass());
printAnalyzer(analyzer);
}
public static void printAnalyzer(Analyzer analyzer) throws IOException {
StringReader reader = new StringReader(str);
TokenStream toStream = analyzer.tokenStream(str,reader);
toStream.reset();//清空流
CharTermAttribute teAttribute = toStream.getAttribute(CharTermAttribute.class);
while (toStream.incrementToken()){
System.out.print(teAttribute.toString() +"|");
}
System.out.println("\n");
analyzer.close();
}
}
分词结果
标准分词:class org.apache.lucene.analysis.standard.StandardAnalyzer
中|华|人|民|共|和|国|简|称|中|国|是|一|个|有|13|亿|人|口|的|国|家|
空格分词:class org.apache.lucene.analysis.core.WhitespaceAnalyzer
中华人民共和国简称中国,|是一个有13亿人口的国家|
简单分词:class org.apache.lucene.analysis.core.SimpleAnalyzer
中华人民共和国简称中国|是一个有|亿人口的国家|
二分法分词:class org.apache.lucene.analysis.cjk.CJKAnalyzer
中华|华人|人民|民共|共和|和国|国简|简称|称中|中国|是一|一个|个有|13|亿人|人口|口的|的国|国家|
关键词分词:class org.apache.lucene.analysis.core.KeywordAnalyzer
中华人民共和国简称中国, 是一个有13亿人口的国家|
停用词分词:class org.apache.lucene.analysis.core.StopAnalyzer
中华人民共和国简称中国|是一个有|亿人口的国家|
2、两种典型应用广泛的中文分词器
public class IKvsSmartAnalyzer {
private static String str1 = "公路局正在治理解放大道路面积水问题";
private static String str2 = "IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包";
public static void main(String[] args) throws IOException {
Analyzer analyzer = null;
System.out.println("句子一:"+str1);
System.out.println("SmartChineseAnalyzer分词结果:");
analyzer = new SmartChineseAnalyzer();
printAnalyzer(analyzer,str1);
System.out.println("IKAnalyzer分词结果:");
analyzer = new IKAnalyzer(true);
printAnalyzer(analyzer,str1);
System.out.println("------------------");
System.out.println("句子二 "+ str1);
System.out.println("SmartChineseAnalyzer分词结果:");
analyzer = new SmartChineseAnalyzer();
printAnalyzer(analyzer,str2);
System.out.println("IKAnalyzer分词结果:");
analyzer = new IKAnalyzer(true);
printAnalyzer(analyzer,str2);
analyzer.close();
}
public static void printAnalyzer(Analyzer analyzer,String str) throws IOException {
StringReader reader = new StringReader(str);
TokenStream toStream = analyzer.tokenStream(str,reader);
toStream.reset();//清空流
CharTermAttribute teAttribute = toStream.getAttribute(CharTermAttribute.class);
while (toStream.incrementToken()){
System.out.print(teAttribute.toString() +"|");
}
System.out.println("\n");
analyzer.close();
}
}
句子一:公路局正在治理解放大道路面积水问题
SmartChineseAnalyzer分词结果:
公路局|正|在|治理|解放|大|道路|面积|水|问题|
IKAnalyzer分词结果:
公路局|正在|治理|大道|路面|积水|问题|
------------------
句子二 IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包
SmartChineseAnalyzer分词结果:
ikanalyz|是|一个|开|源|的|基于|java|语言|开发|的|轻量级|的|中文|分词|工具包|
IKAnalyzer分词结果:
ikanalyzer|是|一个|开源|的|基于|java|语言|开发|的|轻量级|中文|分词|工具包|