分词器概括
分词器是创建倒排索引的基础。分词是对语言中有含义的信息单元切分出来。但是世界上有那么多语言,不可能有一种分词器可以理解所有语言,对所有语言进行准确分词。所以,Lucene为了让其它个人或组织开发的不同分词器提供了一套接口规范——Analyzer。只要实现了这个接口的分词器,就可以加入到Lucene的分词家族中。
分词器测试
我们通过一个小的案例,来看一下不同的分词器的分词效果。
创建Maven工程,引入相关依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>liwen.zhao</groupId>
<artifactId>LuceneTest</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<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>
<dependency> <!-- lucene工具包 -->
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>6.0.0</version>
</dependency>
<dependency> <!-- lucene核心包 -->
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
</project>
代码实现:
package liwen.zhao;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.core.SimpleAnalyzer;
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.analysis.tokenattributes.OffsetAttribute;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Map;
public class LuceneTest {
Map<String, Analyzer> analyzerMap;
@Before
public void initAnalyzer(){
Analyzer standardAnalyzer=new StandardAnalyzer(); //标准分词器
Analyzer simpleAnalyzer=new SimpleAnalyzer(); //简单分词器
Analyzer whitespaceAnalyzer=new WhitespaceAnalyzer(); //空格分词器
Analyzer smartChineseAnalyzer=new SmartChineseAnalyzer(); //智能中文分词器
analyzerMap=new HashMap<String, Analyzer>();
analyzerMap.put("标准分词器",standardAnalyzer);
analyzerMap.put("简单分词器",simpleAnalyzer);
analyzerMap.put("空格分词器",whitespaceAnalyzer);
analyzerMap.put("智能中文分词器",smartChineseAnalyzer);
}
@Test
public void analyzerTest(){
String msg="我是中国人";
for( String key : analyzerMap.keySet() ) {
System.out.println( key + "---------------------->");
StringReader stringReader=new StringReader(msg);
TokenStream tokenStream = analyzerMap.get(key).tokenStream("field1", stringReader);
try {
tokenStream.reset();
OffsetAttribute offsetAttribute = tokenStream.getAttribute(OffsetAttribute.class);
CharTermAttribute charTermAttribute = tokenStream.getAttribute(CharTermAttribute.class);
while (tokenStream.incrementToken()){
System.out.println("偏移量起始位置:"+offsetAttribute.startOffset());
System.out.println("偏移量结束位置:"+offsetAttribute.endOffset());
System.out.println(charTermAttribute.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
输出内容:
简单分词器---------------------->
偏移量起始位置:0
偏移量结束位置:5
我是中国人
标准分词器---------------------->
偏移量起始位置:0
偏移量结束位置:1
我
偏移量起始位置:1
偏移量结束位置:2
是
偏移量起始位置:2
偏移量结束位置:3
中
偏移量起始位置:3
偏移量结束位置:4
国
偏移量起始位置:4
偏移量结束位置:5
人
智能中文分词器---------------------->
偏移量起始位置:0
偏移量结束位置:1
我
偏移量起始位置:1
偏移量结束位置:2
是
偏移量起始位置:2
偏移量结束位置:4
中国
偏移量起始位置:4
偏移量结束位置:5
人
空格分词器---------------------->
偏移量起始位置:0
偏移量结束位置:5
我是中国人
不同的分词器对中文分词的测试结果总结:
1. 标准分词器–StandardAnalyzer:对字做加工。
2. 简单分词器–SimpleAnalyzer:对段落进行加工。
3. 空格分词器–WhitespaceAnalyzer:安装空格处理数据,如果没有空格就输出原文。
4. 智能中文分词器–SmartChineseAnalyzer:对常用中文段落进行分词。