关于Tokenizer与TokenFilter的区别

  

  TokenStream是一个能在被调用后产生语汇单元流的类,但是 TokenStream 类有两个不同的类型:Tokenizer 类和
TokenFilter 类。这两个类都是从抽象类TokenStream类继承而来。

  Tokenizer 对象通过Java.io.Reader 对象读取字符创建语汇单元,而TokenFilter
类则负责处理输入的语汇单元,然后通过新增、删除或者修改属性的方式来产生新的语汇单元。

  当分词器从tokenStream 方法或者 reusableTokenStream 方法返回tokenStream
对象后,它就开始用一个tokenizer对象创建初始的语汇单元流,然后再链接到任意数量的tokenFilter对象来修改这些语汇单元。这被称为分词器链。

Tokenizer是一个以Reader为输入的TokenStream;而TokenFilter是一个以另一个TokenStream为输入的TokenStream。

  表面上看两者只是输入不同,但正因为这一点,Tokenizer被用来做初级的文本处理,它把从Reader读入的原始文本通过一些简单的办法处理成一个个初级的token;TokenFilter则以Tokenizer为输入(因为Tokenizer继承自TokenStream),用一些规则过滤掉不符合要求的token(像StopFilter中的停用词),产生最终的token
stream。

  还记得前文说的WhitespaceAnalyzer和SimpleAnalyzer引用的都是Tokenizer,StopAnalyzer和StandardAnalyzer引用的都是TokenFilter吗?这就是因为前二者处理规则比较简单,用Tokenizer把Reader的输入经过一步处理就够了;后二者处理要复杂一些,需要用到TokenFilter,而TokenFilter在Tokenizer处理的基础上进行一些过滤,这样才能满足后二者的需要。

  另外,引用他人的解释

  Lucene
Analyzer包含两个核心组件,Tokenizer以及TokenFilter。两者的区别在于,前者在字符级别处理流,而后者则在词语级别处理流。Tokenizer是Analyzer的第一步,其构造函数接收一个Reader作为参数,而TokenFilter则是一个类似拦截器的东东,其参数可以使TokenStream、Tokenizer,甚至是另一个TokenFilter。整个Lucene
Analyzer的过程如下图所示:

  

  

  上图中的一些名词的解释如下表所示:





















说明
Token 表示文中出现的一个词,它包含了词在文本中的位置信息
Analyzer 将文本转化为TokenStream的工具
TokenStream 文本符号的流
Tokenizer 在字符级别处理输入符号流
TokenFilter 在字符级别处理输入符号流,其输入可以是TokenStream、Tokenizer或者TokenFilter

关于Tokenizer与TokenFilter的区别,布布扣,bubuko.com

时间: 2024-10-13 12:48:11

关于Tokenizer与TokenFilter的区别的相关文章

Lucene中TokenStream,Tokenizer,TokenFilter,TokenStreamComponents与Analyzer

TokenStream extends AttributeSource implements Closeable: incrementToken,end,reset,close Tokenizer直接继承至TokenStream,其输入input是一个reader TokenFilter也直接继承TokenStream,但input是一个TokenStream. TokenStreamComponents其实是将tokenizer和tokenfilter包装起来的(也可以只是tokenizer,

Lucene分词器

Lucene分析器的基类为Analyzer,Analyzer包含两个核心组件:Tokenizer和 TokenFilter.自定义分析器必须实现Analyzer类的抽象方法createComponents(String)来定义TokenStreamComponents.在调用方法tokenStream(String, Reader)的时候,TokenStreamComponents会被重复使用. 自定义分析器首先需要继承Analyzer类,代码如下: public class HAnalyzer

Lucene的分析过程

转自:http://www.open-open.com/lib/view/open1348033848724.html Lucene的分析过程 回顾倒排索引的构建 收集待建索引的原文档(Document) 将原文档传给词条化工具(Tokenizer)进行文本词条化 将第二步得到的词条(Token)传给语言分析工具(Linguistic modules)进行语言学预处理,得到词项(Term) 将得到的词项(Term)传给索引组件(Indexer),建立倒排索引 注:详细文档->倒排索引的理论过程见

lucene分词流程

这一个星期花时间好好学习了一下lucene/solr,今天好好总结一下,写点文章记录点重要的东西,以便日后不至于丈二和尚摸不着头脑, 这一篇文章主要是简单的介绍一下lucene分词过程中的分词流程,和一些简单原理的讲解,希望不妥这处读者能够指正,不胜感激!! (一)主要分词器 WhitespaceAnalyzer.StopAnalyzer.SimpleAnalyzer.KeywordAnalyzer,他们都的父类都是Analazer,在Analazer类中有一个抽象方法叫做tokenStream

【Java】Lucene检索引擎详解

基于Java的全文索引/检索引擎——Lucene Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能. Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究.他贡献出的Lucene的目标是为各

lucene3.5实现自定义同义词分词器

最近一直在学Lucene3.5,感觉里面的知识真的很棒.今天就和大家一起分享一下我们自己来实现一个同义词的分词器. 一个分词器由多个Tokenizer和TokenFilter组成,这篇文章讲解的就是我们利用这两个特性实现自己的一个简单的同义词分词器,不妥之处请大家指出. 一.设计思路 什么叫同义词搜索呢?比如我们在搜 "中国" 这个词的时候,我们也可以搜索 "大陆" 这个词,后者搜索的要包含 "中国" 这个单词的文章, 前者搜索的要包含 &quo

lucene分词器中的Analyzer,TokenStream, Tokenizer, TokenFilter

分词器的核心类: Analyzer:分词器 TokenStream: 分词器做好处理之后得到的一个流.这个流中存储了分词的各种信息,可以通过TokenStream有效的获取到分词单元. 以下是把文件流转换成分词流(TokenStream)的过程 首先,通过Tokenizer来进行分词,不同分词器有着不同的Tokenzier,Tokenzier分完词后,通过TokenFilter对已经分好词的数据进行过滤,比如停止词.过滤完之后,把所有的数据组合成一个TokenStream:以下这图就是把一个re

solr介绍一:Analyzer(分析器)、Tokenizer(分词器)

首先,不知道大家在前面的例子中没有试着搜索文本串,就是在第二节,我们添加了很多文档.如果字段值是一个文本.你如果只搜索这个字段的某个单词,是不是发现搜不到? 这就是因为我们没有配置Analyzer,因此在搜索的时候会“全匹配”.可以从直观感觉上理解为SQL的  like和= 的区别. 通过前面这段引文,我们就能知道:Analyzer就是分析我们的文本的. 一般来说:solr.TextField类型的字段才需要分析器. 最简单的配置分析器的如下: [html] view plaincopy <fi

Solr中的概念:分析器(analyzer)、字符过滤器(character filter)、分词器(Tokenizer)、词元过滤器(Token Filter)、 词干化(Stemming)

文本中包含许多文本处理步骤,比如:分词,大写转小写,词干化,同义词转化和许多的文本处理. 文本分析既用于索引时对一文本域的处理,也用于查询时查询字符串的文本处理.文本处理对搜索引擎的搜索结果有着重要的影响,特别是对如召回率的影响. 文本分析是将一个文本域的值转化为一个词序列.词是Lucene实际索引和搜索时的最小单元.分析作用于索引时原始的输入值,将转化后的词顺序保存到Lucene的索引结构中.文本分析也同样作用于查询时所输入的查询串中的查询词和查询短语,转化后的词将用于查询Lucene的索引.