Lucene分词器

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

    }

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值