在学习自定义分词前,都需要了解分词的流程,以及如何显示分词的信息。
主要的几大分词器
1.StandardAnalyzer 标准分词器
2.SimpleAnalyzer 简单分词器
3.StopAnalyzer 停止分词器
4.WhiterSpaceAnalyzer 空格分词器
分词原理
分词流程
TokenFilter进行过滤操作,获取有用的信息
Tokenizer可以将Reader读取进来的文字流转化为一个一个的短语单元
分词信息
AnalyzerUtils
package com.yellowcong.demo;
import java.io.IOException;
import java.io.StringReader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
import org.apache.lucene.analysis.tokenattributes.TypeAttribute;
public class AnalyzerUtils {
private AnalyzerUtils(){}
public static void displayToken(String str,Analyzer a) throws IOException{
//获取分词的流 ,其中content 是 流的名称,可以随便写
TokenStream stream = a.tokenStream("", new StringReader(str));
//创建一个属性,将这个属性添加到流中
CharTermAttribute cta = stream.addAttribute(CharTermAttribute.class);
//重置TokenStream 到流的开始
//没有这句报错
stream.reset();
while(stream.incrementToken()){
System.out.print("["+cta.toString()+"]");
}
System.out.println();
}
//产看所有的属性信息
public static void displayAllTokeInfo(String str,Analyzer a) throws IOException{
//获取流
TokenStream stream = a.tokenStream("content", new StringReader(str));
//添加位子信息 存储语汇单元的位置距离
PositionIncrementAttribute ps = stream.addAttribute(PositionIncrementAttribute.class);
//添加分词信息 存储语汇单元位子的偏移量
OffsetAttribute oa = stream.addAttribute(OffsetAttribute.class);
//添加字符信息 存储语汇单元信息
CharTermAttribute cta = stream.addAttribute(CharTermAttribute.class);
//添加类型信息 获取分词器的类型
TypeAttribute ta = stream.addAttribute(TypeAttribute.class);
//将流重置为开始位置
stream.reset();
while(stream.incrementToken()){
System.out.println(cta.toString()+"位置信息"+ps.getPositionIncrement()+"\t"+
"分词信息:["+oa.startOffset()+"--"+oa.endOffset()+"]\t"+
"类型信息"+ta.type());
}
System.out.println();
}
}
测试
package com.yellowcong.demo;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.util.Version;
/**
* 创建用户:狂飙的yellowcong<br/>
* 创建日期:2017年12月3日<br/>
* 创建时间:下午4:30:07<br/>
* 机能概要:
*/
public class Demo8 {
public static void main(String[] args) throws Exception {
StandardAnalyzer an = new StandardAnalyzer(Version.LUCENE_45);
String text = "doubi 哈哈";
AnalyzerUtils.displayToken(text, an);
AnalyzerUtils.displayAllTokeInfo(text, an);
}
}
显示结果
测试2
package junit.test;
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.analysis.StopAnalyzer;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.util.Version;
import org.junit.Test;
import com.yellowcong.utils.AnalyzerUtils;
public class TestAnalyze {
@Test
public void test01() throws IOException{
//标准分词器
Analyzer a1 = new StandardAnalyzer(Version.LUCENE_35); //标准分词器
Analyzer a2 = new StopAnalyzer(Version.LUCENE_35); //停用分词器
Analyzer a3 = new SimpleAnalyzer(Version.LUCENE_35);//简单分词器
Analyzer a4 = new WhitespaceAnalyzer(Version.LUCENE_35);//空格分词器
String str = "I love you the litter girl";
AnalyzerUtils.displayToken(str, a1);
AnalyzerUtils.displayToken(str, a2);
AnalyzerUtils.displayToken(str, a3);
AnalyzerUtils.displayToken(str, a4);
}
@Test
public void test02() throws IOException{
//标准分词器
Analyzer a1 = new StandardAnalyzer(Version.LUCENE_35); //标准分词器
Analyzer a2 = new StopAnalyzer(Version.LUCENE_35); //停用分词器
Analyzer a3 = new SimpleAnalyzer(Version.LUCENE_35);//简单分词器
Analyzer a4 = new WhitespaceAnalyzer(Version.LUCENE_35);//空格分词器
String str = "我是逗逼,你不懂"; //其中中文不适用,只有标准的分割的词
AnalyzerUtils.displayToken(str, a1);
AnalyzerUtils.displayToken(str, a2);
AnalyzerUtils.displayToken(str, a3);
AnalyzerUtils.displayToken(str, a4);
}
@Test
public void test03() throws IOException{
//标准分词器
Analyzer a1 = new StandardAnalyzer(Version.LUCENE_35); //标准分词器
Analyzer a2 = new StopAnalyzer(Version.LUCENE_35); //停用分词器
Analyzer a3 = new SimpleAnalyzer(Version.LUCENE_35);//简单分词器
Analyzer a4 = new WhitespaceAnalyzer(Version.LUCENE_35);//空格分词器
String str = "I love you the litter girl"; //其中中文不适用,只有标准的分割的词
AnalyzerUtils.displayAllTokeInfo(str, a1);
AnalyzerUtils.displayAllTokeInfo(str, a2);
AnalyzerUtils.displayAllTokeInfo(str, a3);
AnalyzerUtils.displayAllTokeInfo(str, a4);
}
}
TokenStream.reset
这个重置,以前没有,现在需要设定,如果不设定,就会报错。
//将流重置为开始位置
stream.reset();
报错信息
Exception in thread "main" java.lang.NullPointerException
at org.apache.lucene.analysis.standard.StandardTokenizerImpl.zzRefill(StandardTokenizerImpl.java:921)
at org.apache.lucene.analysis.standard.StandardTokenizerImpl.getNextToken(StandardTokenizerImpl.java:1128)
at org.apache.lucene.analysis.standard.StandardTokenizer.incrementToken(StandardTokenizer.java:173)
at org.apache.lucene.analysis.standard.StandardFilter.incrementToken(StandardFilter.java:49)
at org.apache.lucene.analysis.core.LowerCaseFilter.incrementToken(LowerCaseFilter.java:54)
at org.apache.lucene.analysis.util.FilteringTokenFilter.incrementToken(FilteringTokenFilter.java:82)
at com.yellowcong.demo.AnalyzerUtils.displayToken(AnalyzerUtils.java:25)
at com.yellowcong.demo.Demo8.main(Demo8.java:19)