Lucene分词实现(二次开发流程)

深度学习文本预处理利器:Tokenizer详解 Tokenizer是一个用于向量化文本,将文本转换为序列的类。计算机在处理语言文字时,是无法理解文字含义的,通常会把一个词(中文单个字或者词)转化为一个正整数,将一个文本就变成了一个序列,然后再对序列进行向量化,向量化后的数据送入模型处理。 阅读详情

 

转自:http://hi.baidu.com/zhumulangma/item/fcb2851542a2b924f7625c32

 

Lucene分词实现(二次开发流程)

1.1  分词流程

在Lucene3.0中,对分词主要依靠Analyzer类解析实现。Analyzer内部主要通过TokenStream类实现。Tonkenizer类、TokenFilter类是TokenStream的两个子类。Tokenizer处理单个字符组成的字符流,读取Reader对象中的数据,处理后转换成词汇单元。TokneFilter完成文本过滤器的功能,但在使用过程中必须注意不同的过滤器的使用的顺序。

 

 

 

 

 

1.2  分词扩展具体流程

1.2.1  Analyzer类分析

 

(1)所有的分词器都需要继承于Analyzer抽象类,它定义了tokenStream抽象方法。

 

public abstract class Analyzer {
   public abstract TokenStream tokenStream(String fieldName, Reader reader);
  public TokenStream reusableTokenStream(String fieldName, Reader reader){}
}

该抽象类规定了Analyzer需要实现的一些方法。

 

(2)public abstract TokenStream tokenStream(String fieldName, Reader reader);

 

该方法需要自定义的分词器去实现,并返回TokenStream,即将对象以Reader的方式输入分词为fieldName字段。

 

TokenStream:分词流,即将对象分词后所得的Token在内存中以流的方式存在,也说是说如果在取得Token必须从TokenStream中获取,而分词对象可以是文档文本,也可以是查询文本。

 

参数说明:

fieldName——字段名,也就是你建索引的时候对应的字段名,比如:Field f = new Field("title","hello",Field.Store.YES, Field.Index.TOKENIZED);这句中的"title";

reader——java.io.Reader对象;

 

(3)public TokenStream reusableTokenStream(String fieldName, Reader reader)。设置为可复用TokenStream,将同一线程中前面时间的TokenStream设置为可复用。那些无必要同一时刻使用多个TokenStream的调用者使用这个方法,可以提升性能。

 

(4)接着,在tokenStream()方法实现中使用Tonkenizer和TokenFilter,例如StandardAnalyzer类中的tokenStream实现:

 

TokenStream result = new StandardTokenizer(reader);//表示用StandardTokenizer对这个要分词的reader进行处理,然后返回一个TokenStream对象

 


result = new StandardFilter(result);//表示对生成的TokenStream对象进行标准过滤(Filter)


result = new LowerCaseFilter(result);//表示对上面由"StandardFilter"过滤后的TokenStream对象再进行次过滤,转化为小写

 

result = new StopFilter(result, stopSet);//接下来再进行次过滤,去掉停止词

 


(5)、return result;//得到最终结果由此可以看出,主要的分词环节是Tokenizer类执行,而Filter负责数据的预处理和分词后处理且数量不限。

 

1.2.2  TokenStream类分析

 

TokenStream是一个抽象类,枚举词序列,要么是从一个文档的域得来,要么是从一个查询文本中得到。主要任务有:

(1)获取下一Token;

(2)重设流(可选);

(3)关闭流,释放资源;


 public Token next();//取得词序列中的下一个词

 public Token next(final Token reusableToken);//输入可复用的Token,作为初始参数,可以返回一个新的Token

 public void reset();

 public void close();

 //在Lucene3以后,next方法改为了incrementToken,并增加了end方法。

 public abstract boolean incrementToken() throws IOException;

 public void end() throws IOException;

 


 

 

1.2.3  Tokenizer类分析

Tokenizer类是继承于TokenStream的一个抽象类,是一个输入为Reader的TokenStream。

其职责是:

(1)接收输入流并根据输入流进行词切分。因此,该类是定制分词器的核心之一。

 

Public abstractclass Tokenizer extends TokenStream {

  protected Reader input;//增加了输入流Reader

  protected Tokenizer() {}

  protected Tokenizer(Reader input) {

    this.input = input;

  }

   publicvoid close() throws IOException {

    input.close();

  }

 

  /**设置input到一个新的Reader*/

  publicvoid reset(Reader input) throws IOException {

    this.input = input;

  }

}


 

在Tokenizer类中,核心的方法是next方法,以CharTokenizer为例。

 

publicfinal Token next(final Token reusableToken) throws IOException {

    assert reusableToken != null;

    reusableToken.clear();

    int length = 0;

    int start = bufferIndex;//起始位置

    char[] buffer = reusableToken.termBuffer();

    while (true) {

      if (bufferIndex >= dataLen) {//如果缓冲取大于数据长度,再读取到缓冲区

        offset += dataLen;

        dataLen = input.read(ioBuffer);

        if (dataLen == -1) {

          if (length > 0)

            break;

          else

            returnnull;

        }

         = 0;

      }

      finalchar c = ioBuffer[bufferIndex++];//无论如何都取一个字符

      if (isTokenChar(c)) {// if it's a token char

        if (length == 0)                               // start of token

          start = offset + bufferIndex - 1;

        elseif (length == buffer.length)

          buffer = reusableToken.resizeTermBuffer(1+length);

        buffer[length++] = normalize(c); // buffer it, normalized

        if (length == MAX_WORD_LEN) // buffer overflow!

          break;

      } elseif (length > 0) // at non-Letter w/ chars

        break;                  // return 'em

    }

    reusableToken.setTermLength(length);

    reusableToken.setStartOffset(start);

    reusableToken.setEndOffset(start+length);

    return reusableToken;

  }


 

1.2.4 TokenFilter类分析

 

TokenFilter类继承于TokenStream,其输入是另一个TokenStream,主要职责是对TokenStream进行过滤,例如去掉一些索引词、替代同义索引词等操作。

 

1.2.5  Token类分析

(1)Token属性

   lucene里定义了几种基本属性:

 

1)TermAttribute:表示token的字符串信息。比如"I'm";

 

2)TypeAttribute:表示token词典类别信息,默认为“Word”,比如I'm就属于<APOSTROPHE>,有撇号的类型;

 

3)OffsetAttribute:表示token的首字母和尾字母在原文本中的位置。比如I'm的位置信息就是(0,3),需要注意的是startOffset与endOffset的差值并不一定就是termText.length(),因为可能term已经用stemmer或者其他过滤器处理过;

 

4)PositionIncrementAttribute:这个有点特殊,它表示tokenStream中的当前token与前一个token在实际的原文本中相隔的词语数量,用于短语查询。比如: 在tokenStream中[2:a]的前一个token是[1:I'm ],它们在原文本中相隔的词语数是1,则token="a"的PositionIncrementAttribute值为1;

 

5)PayloadAttribute,payload即负载量意思,是每个term出现一次则存储一次的元数据,它存储于特定term的posting list内部。

 

6)FlagsAttribute,用于在Tokenizer链之前传递标记(因为前面一个操作可能会影响后面的操作)。那么这个属性有什么用呢,用处很大的。加入我们想搜索一个短语student apples(假如有这个短语)。很显然,用户是要搜索出student apples紧挨着出现的文档。这个时候我们找到了某一篇文档(比如上面例子的字符串)都含有student apples。但是由于apples的PositionIncrementAttribute值是5,说明肯定没有紧挨着。

 

(2)核心方法

      前面几个属性都作为其成员变量。

      set、get方法

      hashCode方法

    (为什么要HASH?便于另一种方式去映射,常用的HASH算法有哪些?)

     其典型的hash代码是code = code * 31 + startOffset,

      copyTo方法

      复制到另一个AttributeImpl中。

      reflectWith方法

     属性反射,从Token对象中解析得出属性。

 

使用LUCENE快速实现属于自己的英文分词程序——附简单实现 简单的英文分词程序现在已经有很多现成的JAR包实现了此功能,最流行的就是LUCENE里的analysis包,analysis包里包含许多类型的分词器、过滤器、分析器,可以让我们自由组合实现我们需要的功能。 使用LUCENE的analysis包,可以快速实现按照字符分割的英文分词,附带过滤停用词功能的分词器(有默认的停用词表,也可以自己指定,指定方式有多种:包括停用词表的文本文档;把停用词加 阅读详情

相关推荐

Lucene分词原理与代码实例讲解

Lucene分词原理与代码实例讲解 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 关键词: Lucene,分词,文本搜索,倒排索引,Java 1. 背景介绍

AI天才研究院 1305

Lucene教程--Analyzer分析器详解

Analyzer分析器 1Analyzer使用时机 1.1创建索引时使用Analyzer 输入关键字进行搜索,当需要让该关键字与文档域内容所包含的词进行匹配时需要对文档域内容进行分析,需要经过Analyzer分析器处理生成语汇单元(Token)。分析器分析的对象是文档中的Field域。当Field的属性tokenized(是否分词)为true时会对Field值进行分

好好学java 4420

Mac无管理员权限安装NVM全攻略(附国内镜像加速)

本文详细介绍了在Mac电脑无管理员权限的情况下,如何通过Git克隆方式安装Node版本管理工具NVM,并配置国内镜像源以加速下载。攻略涵盖环境检查、安装步骤、Shell环境变量配置、镜像加速设置以及常用命令和常见问题解决方案,帮助开发者绕过权限限制,高效管理Node.js版本。

weixin_29296241的博客 487

Lucene分词实现---Analyzer、TokenStream(Token、Tokenizer、Tokenfilter)

一  分清概念:    1   TokenStream是用来走访Token的iterator(迭代器) ,               Tokenizer继承自TokenStream,其输入为Reader 。              TokenFilter继承自TokenStream,其作用是用来完成对TokenStream的过滤操作,譬如 去StopWords,将Token变为小

单向街的夏天 2441

PTrade数据交互全流程详解:从本地文件上传到定时导出交易数据

本文详细解析了PTrade量化交易平台的数据交互全流程,涵盖从本地文件自动上传交易指令到定时导出成交数据的完整链路。通过文件媒介实现本地策略与云端实盘的安全、稳定对接,并提供了构建自动化、稳健数据流水线的实战配置方案与代码示例,助力量化工作流平滑过渡至实盘。

gg901的博客 881

Flexible H-Tree(灵活 H 树)与 Multi-Tap 时钟流程解析

通过灵活 H 树与多抽头技术的结合,复杂时钟架构可在保持电气对称性的同时适应不规则布局,为高性能、低功耗 SoC 设计提供高效的时钟网络解决方案。

weixin_45371279的博客 1911

tokenizer简介

本文介绍了现代NLP中有关tokenizer的内容

芳樽里的歌的博客 2万+

基于大疆TSDK与Pix4D的热红外数据工程化处理:从RJPG到温度正射影像的完整工作流

本文详细介绍了基于大疆TSDK与Pix4D的热红外数据工程化处理完整工作流。通过Python脚本自动化解析RJPG格式的热红外图像,提取并转换其中的原始辐射数据为包含真实温度信息的TIFF文件,再结合Pix4Dmapper进行批量拼接,最终生成可直接用于GIS分析的温度正射影像图。该流程解决了手动处理效率低下、参数校准复杂等难题,实现了从原始数据到定量分析成果的高效、准确、可重复生产。

weixin_29161785的博客 374

《Lucene In Action》第四章.Analysis(分词)

<br />原文http://www.coder4.com/archives/761<br /> <br />简单来说,Analysis就是把field Text转化成基本的Term的形式。<br />通过分词,将Text转化为Token,Token+对应的Field即为Term。<br />分词的处理包括:萃取、丢弃标点、移除发音、小写、移除常用单词、去除变形(去掉过去时等)等。<br />本章将介绍如何使用内置的分词器,以及如何根据语言、环境等特点创建自己的分词器。4.1  使用Analysis<br

搜索引擎、个性化推荐、大数据相关学习笔记| 1096

5分钟快速验证lvgl界面:VScode模拟器极简配置法(免环境变量版)

本文介绍了一种5分钟快速验证LVGL界面的极简配置方法,使用VSCode模拟器免环境变量配置,适合UI设计师和产品经理快速预览界面效果。通过预编译的SDL2库和配置好的VSCode工程模板,实现开箱即用的LVGL界面验证,大幅提升工作效率。

weixin_30790841的博客 314

Windows环境下DataEase一站式安装指南(含WSL2+Docker配置)

本文详细介绍了在Windows环境下通过WSL2和Docker快速部署DataEase的完整教程。从WSL2配置、Docker环境搭建到DataEase离线安装,逐步指导用户完成一站式部署,特别适合需要快速搭建数据分析平台的开发者。教程包含常见问题解决方案和性能优化技巧,帮助用户高效使用这款国产开源数据可视化工具。

weixin_42526166的博客 392

中文分词---2011-10-25 22:42 Lucene分词实现(二次开发流程)

转自:http://hi.baidu.com/zhumulangma/item/fcb2851542a2b924f7625c32 1.1  分词流程 在Lucene3.0中,对分词主要依靠Analyzer类解析实现。Analyzer内部主要通过TokenStream类实现。Tonkenizer类、TokenFilter类是TokenStream的两个子类。Tokenizer处理单个字符组成的

数学屌丝走在it的道路上 1057

VisionMaster4.2.0与C#控件开发实战:从入门到精通的完整指南

本文详细介绍了VisionMaster4.2.0与C#控件开发的实战指南,从基础环境搭建到核心控件使用,再到高级功能实现。通过VmFrontendControl、VmGlobalToolControl等核心控件的深入解析,帮助开发者快速掌握机器视觉应用开发技巧,提升开发效率。特别适合需要集成VisionMaster4.2.0 SDK进行视觉系统开发的C#程序员。

weixin_42665725的博客 381

Lucene.Net 分词器选择指南:盘古分词 vs 结巴分词

在构建基于Lucene.Net的中文搜索引擎时,分词器的选择直接影响搜索效果和性能。盘古分词(PanGu)和结巴分词(jieba)是两个主流选择,以下是它们的深度对比与选择建议。盘古分词:适合搜索场景优先、需要与Lucene.Net深度集成的项目结巴分词:适合需要NLP扩展能力、对准确率要求更高的场景最终建如果项目以搜索为核心且需高性能 → 选择盘古分词如果需处理复杂语义且能接受性能损耗 → 选择结巴分词。

李赛赛的专栏 3713

Taro React组件使用(5) —— RuiPasswordInput 密码输入框显示隐藏和清空

初始化时,需要将传入的 value 赋值给当前组件的 value, 不能直接修改 props 的 value;在组件内输出组件内的变量时,最好先判断输出函数是否定义,再输出,否则很容易引起报错。

止于至善 891

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

基于lucene的案例开发:分词器介绍

在lucene创建索引的过程中,分词技术是一个十分重要的环节,介绍了7中比较常见的分词技术 CJKAnalyzer、KeywordAnalyzer、SimpleAnalyzer、StopAnalyzer、WhitespaceAnalyzer、StandardAnalyzer、IKAnalyzer

小鸡慢慢的专栏 7896

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Lucene分词器详解

Lucee4.0和ikAnalyzer分词器

小好的博客 4117

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Lucene实现中文分词

在之前的文章中已经介绍过Lucene了,这里就不多做介绍。一、中文分词的原理中文分词是将一个汉字序列切分为一个一个单独的词。分词就是讲连续的字序列安装一定的规范重新组合成词序列的过程。随着机器学习的发展,很多分词的方法都已经被科研人员实现,也越来越精确。分词的精确性一定程度上影响了搜索引擎的查全率与查准率,当然这是在你的中文分词运用在搜索引擎的前提之下。分词的算法可以分为:基于字符串匹配的分词方法...

jhonve的博客 1252

Lucene实现分词

1、我使用的jar为IKAnalyzer2012_u6.jar 请自行百度下载,并引用到项目中 2、pom.xml 添加引用 &amp;lt;dependency&amp;gt; &amp;lt;!-- 查询相关jar包 --&amp;gt; &amp;lt;groupId&amp;gt;org.apache.lucene&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;

Arno的博客 1124

了解和实现 Lucene 分词器

说明:本文所涉及的 Lucene 类型来源于 Apache Lucene 4.3.0 版本。 Lucene 分词器是通过继承 Tokenizer 类型来实现的,Tokenizer 类型的继承结构如下。 图中与分词器实现相关的类型一共有三个:AttributeSource、TokenStream 和 Tokenizer,这三个类型在我们实现的分词器

dong976209075的专栏 4571

lucene 获取分词后的关键词

使用不同的分词器, 最后得到的关键词不同, 需要的时间也不同 需要中文分词是, 用IKAnalyzer是不错的选择, 但相比时间, 我的电脑上大概分词需要800+ms 分词器工作流程: 输入文本(What's your name?)     →关键词划分(What's ; your ; name), 不同分词器分法不同         →消除停用词()

java 5295

Lucene分词原理与实现:搜索技术的基石

在搜索引擎的世界里,分词是让机器“理解”人类语言的第一步。作为Apache Lucene(搜索领域的“瑞士军刀”)的核心组件,分词器(Analyzer)通过将连续文本拆解为有意义的词元(Token),直接决定了搜索的召回率与准确率。本文将从生活场景出发,拆解Lucene分词的底层逻辑,结合代码示例与流程图,揭示“文本到词元”的魔法过程,并探讨中文分词的特殊挑战与解决方案。无论你是搜索系统开发者,还是想理解“为什么搜‘苹果’能找到手机也能找到水果”的技术爱好者,本文都将为你揭开搜索技术的第一块基石。

专注搜索引擎技术 976

Lucene的Field域、分词器

1.1 分词器介绍  在对文档(Document)中的内容进行索引前,需要对域(Field)中的内容使用分析对象(分词器)进行分词 。分词的目的是为了索引,索引的目的是为了搜索。过程是先分词,再过滤。 分词:将Document中Field域的值切分成一个一个的单词。具体的切分方法(算法)根据使用的 分词器而不同。 过滤:去除标点符号,去除停用词(的、啊、是、is、the、a等),词的大写转...

huangyh技术栈 1408

Lucene系列三:Lucene分词器详解、实现自己的一个分词器

一、Lucene分词器详解 1. Lucene-分词器API (1)org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分词处理的TokenStream(分词处理器)。通过调用它的如下两个方法,得到输入文本的分词处理器。 public finalTokenStreamtokenStream(Stringf...

HelloWorld搬运工 1360

java lucene分词器,7、自定义分词和中文分词(lucene笔记)

一、自定义分词器这里我们自定义一个停用分词器,也就是在进行分词的时候将某些词过滤掉。MyStopAnalyzer.javapackage cn.itcast.util;import java.io.Reader;import java.util.Set;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analy...

weixin_33111267的博客 964

Lucene 自定义分词器

package com.lucene.util;    import java.io.Reader;  import java.util.Set;    import org.apache.lucene.analysis.Analyzer;  import org.apache.lucene.analysis.LetterTokenizer;  import org.apache.l

screensky的专栏 4393
上一篇: 判断一个字符是否是CJK(中,日,韩的象形文字)
下一篇: ListView总结
longyi_java
博客等级 码龄20年 24粉丝 127原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值