一、自定义分词器
这里我们自定义一个停用分词器,也就是在进行分词的时候将某些词过滤掉。
MyStopAnalyzer.java
package cn.itcast.util;
import java.io.Reader;
import java.util.Set;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.LetterTokenizer;
import org.apache.lucene.analysis.LowerCaseFilter;
import org.apache.lucene.analysis.StopAnalyzer;
import org.apache.lucene.analysis.StopFilter;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.util.Version;
public class MyStopAnalyzer extends Analyzer {
@SuppressWarnings("rawtypes")
private Set stops;//用于存放分词信息
public MyStopAnalyzer() {
stops = StopAnalyzer.ENGLISH_STOP_WORDS_SET;//默认停用的语汇信息
}
//这里可以将通过数组产生分词对象
public MyStopAnalyzer(String[] sws) {
//System.out.println(StopAnalyzer.ENGLISH_STOP_WORDS_SET);
stops = StopFilter.makeStopSet(Version.LUCENE_35, sws, true);//最后的参数表示忽略大小写
stops.addAll(StopAnalyzer.ENGLISH_STOP_WORDS_SET);
}
@Override
public TokenStream tokenStream(String fieldName, Reader reader) {
//注意:在分词过程中会有一个过滤器链,最开始的过滤器接收一个Tokenizer,而最后一个接收一个Reader流
//这里我们看到我们可以在过滤器StopFilter中接收LowerCaseFilter,而LowerCaseFilter接收一个Tokenizer
//当然如果要添加更多的过滤器还可以继续添加
return new StopFilter(Version.LUCENE_35, new LowerCaseFilter(Version.LUCENE_35,
new LetterTokenizer(Version.LUCENE_35, reader)), stops);
}
}
说明:
这里我们定义一个Set集合用来存放分词信息,其中在无参构造器我们将默认停用分词器中停用的语汇单元赋给stops,这样我们就可以使用默认停用分词器中停用的语汇。而我们通过一个字符串数组将我们自己想要停用的词传递进来,同时stops不接受泛型,也就是说不能直接将字符串数组赋值给stops,而需要使用makeStopSet方法将需要停用的词转换为相应的语汇单元,然后再添加给stops进行存储。
自定义的分词器需要继承Analyzer接口,实现tokenStream方法,此方法接收三个参数,第一个是版本,最后一个是停用的语汇单元,这里是stops,而第二个参数是别的分词器,因为分词过程中是一个分词器链。
测试:
TestAnalyzer.java
@Test
public void test04(){
//对中文分词不适用
Analyzer analyzer = new MyStopAnalyzer(new String[]{"I","you"});
Analyzer analyzer2 = new StopAnalyzer(Version.LUCENE_35);//停用分词器
String text = "how are you thank you I hate you";
System.out.println("************自定义分词器***************");
AnalyzerUtils.displayAllTokenInfo(text, analyzer);
System.out.println("************停用分词器***************");
AnalyzerUtils.displayAllTokenInfo(text, analyzer2);
}
说明:从测试结果中我们可以很容易看出自定义分词器和默认分词器之间的区别,自定义分词相比默认分词器多了我们自定义的词语。
1
二、中文分词器
这里我们使用MMSEG中文分词器,其分词信息使用的是搜狗词库。我们使用的是版本1.8.5.这个版本的包中有两个可用的jar包:
mmseg4j-all-1.8.5.jar
mmseg4j-all-1.8.5-with-dic.jar
其中第二个相比第一个多了相关的语汇信息,便于我们进行分词,当然我们可以使用第一个,但是这样便和默认分词器没有多大差别,我们在方法中直接测试:
@Test
public void test02(){
//对中文分词不适用
Analyzer analyzer1 = new StandardAnalyzer(Version.LUCENE_35);//标准分词器
Analyzer analyzer2 = n