java lucene分词器,7、自定义分词和中文分词(lucene笔记)

一、自定义分词器

这里我们自定义一个停用分词器,也就是在进行分词的时候将某些词过滤掉。

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);

}

说明:从测试结果中我们可以很容易看出自定义分词器和默认分词器之间的区别,自定义分词相比默认分词器多了我们自定义的词语。

6b2cf6eceb43

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值