欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Lucene05-分词器

程序员文章站 2023-11-16 16:17:04
Lucene05-分词器 1、概念 Analyzer(分词器)的作用是把一段文本中的词按规则取出所包含的所有词。对应的是Analyzer类,这是一个抽象类,切分词的具体规则是由子类实现的,所以对于不同的语言(规则),要用不同的分词器。如下图 注意:在创建索引时会用到分词器,在使用字符串搜索时也会用到 ......

lucene05-分词器

 

1、概念

analyzer(分词器)的作用是把一段文本中的词按规则取出所包含的所有词。对应的是analyzer类,这是一个抽象类,切分词的具体规则是由子类实现的,所以对于不同的语言(规则),要用不同的分词器。如下图

 Lucene05-分词器

 注意:在创建索引时会用到分词器,在使用字符串搜索时也会用到分词器,这两个地方要使用同一个分词器,否则可能会搜索不出结果。所以当改变分词器的时候,需要重新建立索引库

2、常见的中文分词器

中文的分词比较复杂,因为不是一个字就是一个词,而且一个词在另外一个地方就可能不是一个词,如在帽子和服装中,和服就不是一个词。对于中文分词,通常有三种方式:单字分词、二分法分词、词典分词

2.1 单字分词

就是按照中文一个字一个字地进行分词,效率比较低。如:我们是中国人,效果:。(standardanalyzer就是这样)

analyzer analyzer2 = new standardanalyzer();

2.2 二分法分词

按两个字进行切分,把相邻的两个字组成词分解出来,效率也比较低。而且很多情况下分的词不对。如:我们是中国人,效果:我们们是是中中国国人。(cjkanalyzer就是这样)

analyzer analyzer3 = new cjkanalyzer(version.lucene_30);

2.3 词库分词(ikanalyzer)

按某种算法构造词,然后去匹配已建好的词库集合,如果匹配到就切分出来成为词语。通常词库分词被认为是最理想的中文分词算法。如:我们是中国人,效果为:我们中国人。(使用极易分词的mmanalyzer。可以使用极易分词,或者是庖丁分词分词器、ikanalyzer)。

analyzer analyzer4 = new ikanalyzer();

基本上可以把词分出来(经常用的分词器)

 

3、idea集成ikanalyzer

3.1 添加maven依赖

        <!-- ik分词器-->
        <dependency>
            <groupid>com.github.magese</groupid>
            <artifactid>ik-analyzer</artifactid>
            <version>7.4.0</version>
        </dependency>

 

3.2 添加配置文件

停用词和扩展词以及配置文件

 Lucene05-分词器

ext_stopword.dic为停用词的词库,词库里的词都被当作为停用词使用。

ext_dict.dic 为扩用词的词库,词库里的词都被当作为扩用词使用。

停用词:有些词在文本中出现的频率非常高。但对本文的语义产生不了多大的影响。例如英文的aantheof等。或中文的”的、了、呢等”。这样的词称为停用词。停用词经常被过滤掉,不会被进行索引。在检索的过程中,如果用户的查询词中含有停用词,系统会自动过滤掉。停用词可以加快索引的速度,减少索引库文件的大小。

扩展词:就是不想让哪些词被分开,让他们分成一个词。比如传智播客、传智

ikanalyzer.cfg.xmlikanalyzer的配置文件。

 

3.3 测试分词器

添加测试类

Lucene05-分词器

代码如下:

import org.apache.lucene.analysis.analyzer;
import org.apache.lucene.analysis.tokenstream;
import org.apache.lucene.analysis.cjk.cjkanalyzer;
import org.apache.lucene.analysis.standard.standardanalyzer;
import org.apache.lucene.analysis.tokenattributes.chartermattribute;
import org.junit.test;
import org.wltea.analyzer.lucene.ikanalyzer;

import java.io.ioexception;
import java.io.stringreader;

/**
 * @author pc-black
 * @version v1.0
 * @date 2019/7/20 18:39
 * @description todo
 **/
public class analayzertest {
    @test
    public void testikanalyzer()throws ioexception {
        //使用lucene 自带的标准分词器...
        ikanalyzer analyzer = new ikanalyzer();
//        analyzer analyzer=new cjkanalyzer();
//        analyzer analyzer=new standardanalyzer();
        analyzer(analyzer,"最贵的苹果4");
    }

    public static void analyzer(analyzer analyzer, string str) throws ioexception {
        stringreader reader = new stringreader(str);
        //处理单个字符组成的字符流,读取reader对象中的数据,处理后转换成词汇单元
        tokenstream tokenstream = analyzer.tokenstream(str, reader);
        // 清空流
        try {
            tokenstream.reset();
        } catch (ioexception e) {
            e.printstacktrace();
        }
        chartermattribute attribute = tokenstream.getattribute(chartermattribute.class);
        try {
            while (tokenstream.incrementtoken()) {
                system.out.print(attribute.tostring()+"|");
            }
        } catch (ioexception e) {
            e.printstacktrace();
        }
    }
}

 

单字分词器

 Lucene05-分词器

二分法分词

 Lucene05-分词器

ik分词

 Lucene05-分词器