Lucene使用IK中文分词

2023-11-11

Lucene使用IK中文分词

环境

也可以通过Maven或Gradle构建工程测试和验证
对于Lucene的最新版本,需要找到IK Analyzer对应的兼容版。

传送门 Lucene 6.6.6 Documentation

IK中文分词配置

Lucene 6.x使用IK分词需要继承Analyzer、Tokenizer,重新编写逻辑配置,再使用。分别配置子类IKAnalyzer6x、IKTokenizer6x

IKAnalyzer6x.java

package com.liuyu.lucene.ik;

import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.tokenattributes.TypeAttribute;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;

import java.io.IOException;

/**
 * @author huangliuyu
 * @description
 * @date 2021-04-21
 */
public class IKTokenizer6x extends Tokenizer {
    //IK分词器实现
    private IKSegmenter _IKImplement;
    //词元文本属性
    private final CharTermAttribute termAtt;
    //词元位移属性
    private final OffsetAttribute offsetAtt;
    //词分类属性
    //(该属性分类参考org.wltea.analyzer.core.Lexeme中的分类常量)
    private final TypeAttribute typeAtt;
    //记录最后一个词元的结束位置
    private int endPosition;

    //Lucene 6.x Tokenizer适配器类构造函数:实现Tokenizer接口
    public IKTokenizer6x(boolean useSmart) {
        super();
        offsetAtt=super.addAttribute(OffsetAttribute.class);
        termAtt=super.addAttribute(CharTermAttribute.class);
        typeAtt=super.addAttribute(TypeAttribute.class);
        _IKImplement=new IKSegmenter(input,useSmart);
    }


    public boolean incrementToken() throws IOException {
        //清除所有的词元属性
        super.clearAttributes();
        Lexeme nextLexeme=_IKImplement.next();
        if(null!=nextLexeme){
            //将Lexeme转成Attribute

            //设置词元文本
            termAtt.append(nextLexeme.getLexemeText());
            //设置词元长度
            termAtt.setLength(nextLexeme.getLength());
            //设置词元位移
            offsetAtt.setOffset(nextLexeme.getBeginPosition(),nextLexeme.getEndPosition());
            //记录分词的最后位置
            endPosition=nextLexeme.getEndPosition();
            //记录词元分类
            typeAtt.setType(nextLexeme.getLexemeText());
            //返回true告知还有下个词元
            return true;

        }
        //返回false告知词元输出完毕
        return false;
    }

    @Override
    public void reset() throws IOException {
        super.reset();
        _IKImplement.reset(input);
    }

    @Override
    public void end() throws IOException {
        int finalOffset=super.correctOffset(this.endPosition);
        offsetAtt.setOffset(finalOffset,finalOffset);
    }
}

IKAnalyzer6x.java

package com.liuyu.lucene.ik;


import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Tokenizer;

/**
 * @author huangliuyu
 * @date 2021-04-21
 * @description
 */
public class IKAnalyzer6x extends Analyzer {
    private boolean useSmart;

    public void setUseSmart(boolean useSmart) {
        this.useSmart = useSmart;
    }

    /**
     *  IK分词器Lucene Analyzer接口实现类
     *  默认细粒度切分算法
     */
    public IKAnalyzer6x(){
        this(false);
    }

    /**
     *  IK分词器Lucene Analyzer接口实现类
     *  当为true时,分词器进行智能切分
     * @param useSmart
     */
    public IKAnalyzer6x(boolean useSmart) {
        super();
        this.useSmart=useSmart;
    }

    @Override
    protected TokenStreamComponents createComponents(String fieldName) {
    	//使用配置好的ik Tokenizer
        Tokenizer _IKTokenizer=new IKTokenizer6x(this.useSmart);
        return new TokenStreamComponents(_IKTokenizer);
    }

}

使用和比较

这里使用 Lucene 6.X自带的中文智能分词器 SmartChineseAnalyzer与IK Analyzer作比较,演示使用情况

代码

package com.liuyu.lucene.ik;

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.tokenattributes.CharTermAttribute;

import java.io.IOException;
import java.io.StringReader;

/**
 * @author huangliuyu
 * @date 2021-04-21
 * @description
 */
public class IkVSSmartCn {
    private static String str1 = "公路局正在治理解放大道路面积水问题。";
    private static String str2 = "IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。";

    public static void main(String[] args) throws IOException {
        Analyzer analyzer = null;

        System.out.println("句子一:" + str1);

        System.out.println("SmartChineseAnalyzer分词结果:");
        analyzer = new SmartChineseAnalyzer();
        printAnalyzer(analyzer, str1);

        System.out.println("IKAnalyzer分词结果:");
        analyzer = new IKAnalyzer6x(true);
        printAnalyzer(analyzer, str1);

        System.out.println();
        System.out.println("-------------------------------------------------");
        System.out.println();

        System.out.println("句子二:" + str2);

        System.out.println("SmartChineseAnalyzer分词结果:");
        analyzer = new SmartChineseAnalyzer();
        printAnalyzer(analyzer, str2);

        System.out.println("IKAnalyzer分词结果:");
        analyzer = new IKAnalyzer6x(true);
        printAnalyzer(analyzer, str2);

    }


    public static void printAnalyzer(Analyzer analyzer, String str) throws IOException {
        StringReader reader = new StringReader(str);
        TokenStream toStream = analyzer.tokenStream(str, reader);
        toStream.reset();//清空流

        CharTermAttribute teAttribute = toStream.getAttribute(CharTermAttribute.class);

        while (toStream.incrementToken()) {
            System.out.print(teAttribute.toString() + "|");
        }
        System.out.println("\n");
        analyzer.close();
    }

}

效果
Lucene使用IK分词效果

由效果可见IK Analyzer的中文分词效果要比Lucene SmartChineseAnalyzer的好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lucene使用IK中文分词 的相关文章

随机推荐

  • 正则表达式验证和跨域postmessage

    1 用正则表达式验证用户名
  • Hexagon GDB Debugger介绍(47)

    Hexagon GDB Debugger介绍 47 4 5 2 8 Python 中的命令 4 5 2 9 Writing new convenience functions 4 5 2 8 Python 中的命令 新的调试器命令可以在Py
  • 10.Vue中绑定class属性,模板中传递class属性

    文章目录 class 对象类型 动态绑定 动态切换 动静结合 关于写法 数组类型 多个绑定 在组件上使用 单根组件 多根组件 attrs class 因为class属性的特殊性 可以有多个值 在将v bind 用于 class 时 Vue
  • RTTI

    自从1993年Bjarne Stroustrup 注1 提出有关C 的RTTI功能之建议 以及C 的 例外处理 exception handling 需要RTTI 最近新推出的C 或多或少已提供RTTI 然而 若不小心使用RTTI 可能会导
  • 【Https】keytool 导入证书到 本地 Exception: Input not an X.509 certificate

    文章目录 1 背景 本文为博主九师兄 QQ 541711153 欢迎来探讨技术 原创文章 未经允许博主不允许转载 1 背景 首先参考这篇文章 Spring Spring Boot 支持 Https 根据这篇文章生成了这个文件 然后根绝这个文
  • MFC中简单上位机框架搭建

    项目源码下载地址 http download csdn net download zhuzemin45 12005663 文章主要分三个部分 一 非模态 模态 对话框创建 二 标签页创建 三 Button调用多标签页的非模态对话框 1 非模
  • “百钱买百鸡”编程详解。

    1 题目描述 百钱买百鸡 是我国古代的著名数学题 3 文钱可以买 1 只公鸡 2 文钱可以买一只母鸡 1 文钱可以买 3 只小鸡 用 100 文钱买100 只鸡 那么各有公鸡 母鸡 小鸡多少只 2 分析 计算机无法通过直接的计算得出具体的数
  • QTimer与事件循环和多线程

    定时器的源码分析 startTimer返回定时器的ID 在定时时间到了后 收到一个QTimerEvent 并覆盖虚函数timerEvent进行处理 该QTimerEvent包括了定时器ID 看QTimer的源码就明白了 QObject st
  • java创建自定义类的数组

    java创建自定义类的数组 错题笔记 学习动态规划做例题hdu 2602遇到的问题 创建自定义类后 新建一个自定义类的数组 向数组赋值时报如下错误 java lang NullPointerException Cannot assign f
  • 【Qt】一篇全面的信号和槽函数机制总结

    信号和槽函数机制 文章目录 信号和槽函数机制 一 信号和槽机制简介 二 信号 2 1 信号的发出 2 2 信号的处理 三 槽函数 3 1 带有默认参数的信号和槽函数 3 2 使用 QObject connect 将信号连接到槽函数的三种方法
  • integer operation result is out of range

    程序中 有如下定义 define UART1 EN 1 lt lt 31 编译后编译器报错 integer operation result is out of range 经查资料是由于溢出所致 宏定义默认常量是有符号型 当左移31位时
  • kerberos认证过程

    KDC Key Distribution Center 密钥分发中心 里面包含两个服务 AS和TGS AS Authentication Server 身份认证服务 TGS Ticket Granting Server 票据授予服务 TGT
  • [python] 使用scikit-learn工具计算文本TF-IDF值

    在文本聚类 文本分类或者比较两个文档相似程度过程中 可能会涉及到TF IDF值的计算 这里主要讲述基于Python的机器学习模块和开源工具 scikit learn 希望文章对你有所帮助 相关文章如下 python爬虫 Selenium获取
  • 铨顺宏RFID:试卷管理中RFID技术智能系统发挥着什么样的作用

    1 项目背景 在我国的教育招生考试中 试卷的管理一直是比较棘手的问题 它涉及试卷的组卷 印刷 封包 运输 发放 回收 入库 阅卷以及历史保存等一系列复杂的流程 且数量巨大 到目前为止 我国的试卷管理主要还是采取的人工管理方式 势必存在安全形
  • 随机抽奖小程序

    本实例使用随机数字生成5位抽奖号码 并显示在窗体的5个文本框中 当用户单击 开始 按钮时 将启动一个线程对象为5个文本框生成随机数字 单击 抽奖 按钮时 线程对象停止运行 并且将准确的中奖号码显示在信息文本框中 开发一个抽奖小工具的实例 1
  • 基于PaddleClas的PP-LCNet实现车辆颜色及车型属性识别

    目录 源码 yolov5源码 1 环境准备 2 数据准备 3 车辆检测
  • 目标检测评价指标合集

    目标检测评价指标 混淆矩阵 confusion matrix 可谓是贯穿了整个目标检测评价体系 衍生了一系列的目标检测评价指标 如精确率 precision 准确率 accuracy 召回率 recall F1 score ROC AUC指
  • ag-grid 学习笔记四:ag-grid方法(重设行数据、增删改、反选、新增列、插入新行、合计行接口、遍历行对象、获取置顶行数量、获取底部合计行对象、获取行对象、刷新、单元格焦点)

    一 setRowData重新设置表格行数据 重新设置表格数据很简单 只需要调用 gridOptions api setRowData 数据集 接口传入数据即可 以下函数为调用方式 function resetGrid 新的数据项 var N
  • Hackinglab(鹰眼)——基础关

    目录 1 key在哪里 2 再加密一次你就得到key啦 3 猜猜这是经过了多少次加密 4 据说MD5加密很安全 真的是么 5 种族歧视 6 HAHA浏览器 7 key究竟在哪里呢 8 key又找不到了 9 冒充登陆用户 10 比较数字大小
  • Lucene使用IK中文分词

    Lucene使用IK中文分词 环境 Lucene 6 x IKAnalyzer2012 u6 也可以通过Maven或Gradle构建工程测试和验证 对于Lucene的最新版本 需要找到IK Analyzer对应的兼容版 传送门 Lucene