Lucene分词器
程序员文章站
2022-07-01 15:31:12
...
1.分词器概述
分词计算在倒排索引创建的过程中,起着非常重要的作用,不同分词计算需求,使用分词计算规则算法逻辑底层代码完全不相同的。lucene也不能完成世界上所有对分词器需求的计算,所以Lucene提供了分词器接口Analyzer,想要加入Lucene的逻辑,实现这个接口即可。
2.分词器案例
2.1 需要引入依赖
<dependency> <!-- 查询相关jar包 -->
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>6.0.0</version>
</dependency>
<dependency> <!-- lucene自带只能中文分词器jar包 -->
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-smartcn</artifactId>
<version>6.0.0</version>
</dependency>
2.2 使用不同分词器,实现分词计算打印展示
StandardAnalyzer-->标准分词器
- 英文:对词做加工,按照空格,标点分开
- 中文:字做加工
SimpleAnalyzer--->简单分词器
对空格/标点符号进行切分计算
- 英文:词加工
- 中文:段逻,句加工
WhitespaceAnalyzer--->空格分词器
- 按照空格处理数据
SmartChineseAnalyzer--->智能中文分词器
- 处理常用的中文词语
IKAnalyzer--->中文分词器
对于语言的发展,新的词语的出现,总是改变对分词计算的需求.引入基于词典的分词器---IKAnalzyer.可以对词典进行扩展,计算分词时,读取到词典的数据就可以计算该词语成为一个词项.
还支持停用词典:在停用词典中的词语,不会计算分词
例如: 敏感词,禁语,无意义词语
代码示例:
public class AnalyzerTest {
//完成方法,接收文本字符串,通过使用分词器的api将词项的文本属性
//打印出来
public void printTerm(Analyzer a, String msg) throws Exception {
//使用a实现对象,解析msg分词计算;
//String原数据转化成流对象
StringReader reader=new StringReader(msg);
//调用a这个分词的api将read流计算成词项
TokenStream token = a.tokenStream("test", reader);//分词不能独立存在,依托document数据
token.reset();
//拿到当前指针位置的词项的文本属性
OffsetAttribute offAttr = token.getAttribute(OffsetAttribute.class);
CharTermAttribute charAttr = token.getAttribute(CharTermAttribute.class);
while(token.incrementToken()){
System.out.println("偏移量起始位置:"+offAttr.startOffset());
System.out.println("偏移量结束位置:"+offAttr.endOffset());
System.out.println(charAttr.toString());
}
}
@Test
public void run() throws Exception {
//构造多个不同实现类的分词器
Analyzer a1=new StandardAnalyzer();
Analyzer a2=new SimpleAnalyzer();
Analyzer a3=new WhitespaceAnalyzer();
Analyzer a4=new SmartChineseAnalyzer();
//计算分词的文本字符串
String msg="how are you?Fine,thank you!And you?";
System.out.println("******************标准********************");
printTerm(a1,msg);
System.out.println("******************简单********************");
printTerm(a2,msg);
System.out.println("******************空格********************");
printTerm(a3,msg);
System.out.println("******************智能********************");
printTerm(a4,msg);
}
}
下一篇: lucene 分词器