lucene4.0版本号以后 已经用TokenStreamComponents 代替了TokenStream流。里面包含了filter和tokenizer

在较复杂的lucene搜索业务场景下,直接网上下载一个作为项目的分词器,是不够的。那么怎么去评定一个中文分词器的好与差:一般来讲。有两个点。词库和搜索效率,也就是算法。

 lucene的倒排列表中,不同的分词单元有不同的PositionIncrementAttribute,假设两个词之间PositionIncrementAttribute距离为0。则为同义词;比方:我定义美国和中国这两个词在倒排列表中是同一个位置及距离为0,那么搜索美国的话,中国也能出来。

这就是同义词搜索原理。

下面代码(用mmseg的 Tokenizer 去切词之后,然后再做同义词):

先自己定义分词器:

package hhc;import java.io.Reader;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;import com.chenlb.mmseg4j.Dictionary;
import com.chenlb.mmseg4j.MaxWordSeg;
import com.chenlb.mmseg4j.analysis.MMSegTokenizer;/*** 写一个分词器,一般能够參照原来分词器是怎么写法的* @author hhc**/
public class MySameAnalyzer extends Analyzer{//同义词private SamewordContext samewordContext=null;public MySameAnalyzer(SamewordContext samewordContext){this.samewordContext=samewordContext;}@Overridepublic TokenStream tokenStream(String fieldName, Reader reader) {// Dictionary dic=Dictionary.getInstance();return new MySameTokenFilter(new MMSegTokenizer(new MaxWordSeg(dic), reader),samewordContext);}}

然后再对TokenStream流做同义词处理

package hhc;import java.io.IOException;
import java.util.Stack;import org.apache.lucene.analysis.TokenFilter;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
import org.apache.lucene.util.AttributeSource;public class MySameTokenFilter extends TokenFilter {// 分词单元信息private CharTermAttribute cta = null;// 位置信息private PositionIncrementAttribute pia = null;// 状态private AttributeSource.State current;// 同义词集合private Stack<String> sames = null;private SamewordContext samewordContext=null;protected MySameTokenFilter(TokenStream input,SamewordContext samewordContext) {super(input);cta = input.addAttribute(CharTermAttribute.class);pia = input.addAttribute(PositionIncrementAttribute.class);sames=new Stack<String>();this.samewordContext=samewordContext;}@Overridepublic boolean incrementToken() throws IOException {try {if (sames!=null&&sames.size()> 0) {// 删除对象在堆栈,然后返回的对象上的函数值。而且获取这个同义词String str = sames.pop();// 还原状态restoreState(current);cta.setEmpty();cta.append(str);pia.setPositionIncrement(0);return true;}// 假设流中没有数据了。if (!input.incrementToken())return false;/*** 流中有数据的话,进行对应的同义词*/// 处理切分出来的词的信息if (existAddSameword(cta.toString())) {// 把当前状态先保存current = captureState();}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}return true;}/*** 推断是否该分词单元存在* * @param word* @return*/private boolean existAddSameword(String word) {String[] words=samewordContext.getSameword(word);if (words != null) {for (String s : words) {sames.push(s);}return true;}return false;}}

转载于:https://www.cnblogs.com/zsychanpin/p/6789050.html

lucene构建同义词分词器相关推荐

  1. Lucene实现自定义中文同义词分词器

    ---------------------------------------------------------- lucene的分词_中文分词介绍 ------------------------ ...

  2. lucene6中配置IK Analyzer同义词分词器

    首先需要基础知识 intellij idea中为lucene6配置IK Analyzer分词器 说到同义词分词器,从原理角度来说要了解了Analyzer Analyzer分词的原理 Analyzer类 ...

  3. Lucene5学习之自定义同义词分词器简单示例

    同义词功能在全文搜索时的意义,大家应该都懂的.今天中文我就试着写了一个同义词分词的示例demo,其实主要代码还是参考Lucene in Action 这本英文版书籍的随书代码,只不过Lucenen i ...

  4. Lucene.Net+盘古分词器(详细介绍)(转)

    Lucene.Net+盘古分词器(详细介绍)(转) Lucene.Net+盘古分词器(详细介绍) 本章阅读概要 1.Lucenne.Net简介 2.介绍盘古分词器 3.Lucene.Net实例分析 4 ...

  5. 如何在基于Lucene的中文分词器中添加自定义词典(如Paoding、mmseg4j、IK Analyzer)...

    如何在基于Lucene的中文分词器中添加自定义词典(如Paoding.mmseg4j.IK Analyzer) 2013-07-08 21:54:29|  分类: 计算机 |字号 订阅 1. 使用Pa ...

  6. lucene(3)——版本5.X写中文同义词分词器

    最基本的内容 如果你存储到硬盘的话,那么目录下就有这么几个文件 _0.fnm存储域的名字信息 _0.fdt域store.YES的数据信息 _0.fdx域store.YES的数据信息 _0.fdx保存字 ...

  7. org.wltea.analyzer.lucene.IKAnalyzer(IK分词器)

    问题原因 : solr自带的jetty启动缺少IK分词器的jar包 解决方法 : 去下载一个 ik-analyzer-solr5-5.x.jar,放在/home/solr-7.7.3/server/s ...

  8. ES学习(五)同义词分词器dynamic synonym for ElasticSearch

    dynamic synonym for ElasticSearch elasticsearch动态同义词插件是添加一个同义词过滤器在给定间隔(默认60秒)来重新加载同义词文件(本地文件或远程文件). ...

  9. Lucene初学——3. 分词器学习

    1.demo public class AnalyzerStudy {private static String str = "分词器测试 Lucene 案例 开发 by future fo ...

最新文章

  1. golang 开发常见坑
  2. wsasend发送不可靠_架构师总结:kafka 如何保证数据的可靠性和一致性
  3. 使用AT SELECTION-SCREEN事件验证用户输入条件的反思
  4. linux 环境下配置python虚拟环境
  5. Qt中UDP通信的简单示例
  6. Vue_案例_交互添加_利用子组件调用父组件的添加方法实现---vue工作笔记0023
  7. SSH三大框架的概述
  8. 微软亚研院 | 智能信息检索综述
  9. jqueryui时间插件_jQueryUI Progressbar插件
  10. hdu 5919 主席树保留区间数的种类数目
  11. 2021-08-3126. 删除有序数组中的重复项 数组
  12. MySQL(14)-----运算符和优先级
  13. SDN是什么,与传统分布式网络有什么区别
  14. Aho-Corasick Automaton · AC自动机
  15. 谷歌搜索中一些十分有趣的特效现象
  16. 猜数字小游戏——算法学习
  17. 全国计算机等级考试二级 C 语言 程序设计考试大纲
  18. 深入学习TCPIP协议
  19. python初中生可以自学吗_怎样引导中学生学好Python语言-百度经验
  20. 《失控》(凯文·凯利)阅读分享

热门文章

  1. 欧拉函数的求法(线性筛法?)
  2. python读取文件r_python read文件的r和rb的区别
  3. u盘循环冗余能修复吗_古董修复能修复吗?-恩平 - 商业服务
  4. mysql 5.7.18-winx64_mysql 5.7.18 winx64安装配置方法图文教程
  5. mysql 选项_mysql常用选项
  6. 进程创建函数fork()和vfork()
  7. javascript如何实现功能的分析
  8. end-to-end 的神经网络
  9. 困扰一周的奇葩bug:重复相似代码多,导致单片机程序跑飞
  10. STM32 GPIO的原理、特性、选型和配置