全文检索技术_Lucene分词器

本文介绍了Lucene的分词器基础,包括Analyzer接口规范,以及通过实例展示了不同分词器如标准分词器、简单分词器、智能中文分词器和空格分词器的分词效果和特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分词器概括

    分词器是创建倒排索引的基础。分词是对语言中有含义的信息单元切分出来。但是世界上有那么多语言,不可能有一种分词器可以理解所有语言,对所有语言进行准确分词。所以,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:对常用中文段落进行分词。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值