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

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

大家好,又见面了,我是你们的朋友全栈君。分词器的核心类:


Analyzer:
分词器


TokenStream:
分词器做好处理之后得到的一个流。这个流中存储了分词的各种信息,可以通过TokenStream有效的获取到分词单元。


以下是把文件流转换成分词流(TokenStream)的过程

首先,通过Tokenizer来进行分词,不同分词器有着不同的Tokenzier,Tokenzier分完词后,通过TokenFilter对已经分好词的数据进行过滤,比如停止词。过滤完之后,把所有的数据组合成一个TokenStream;以下这图就是把一个reader转换成TokenStream:lucene分词器中的Analyzer,TokenStream, Tokenizer, TokenFilter

这个TokenStream中存有一些属性,这些属性会来标识这个分词流的元素。

在这个流里 有很多属性。下面截了lucene4.10.1源码中的图:

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

     其中有3个重要的属性,CharTermAttribute(保存相印的词汇),OffsetAttribute(保存各个词汇的偏移量),PositionIncrementAttribute(保存各个词与词之间的位置增量,如果为0,可以做同义词搜索)。是由这3个属性来控制这些分词信息
    Tokenzier 主要负责接收Reader,将Reader进行分词操作,有如下一些实现类

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

TokenFilter  将分词的出来的单元,进行各种各样的过滤。 


代码如下:

<span style="font-size:14px;">package hhc;

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

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
import org.apache.lucene.analysis.tokenattributes.TypeAttribute;

public class AnalyzerUtil {

	
	/**
	 * 输出字符分词信息
	 * 
	 * @param str
	 * @param a
	 */
	public static void displayAllToken(String str, Analyzer a) {
		try {
			// 所有的分词器都必须含有分词流
			TokenStream stream = a.tokenStream("content", new StringReader(str));// 放回一个TokenStream;
			/**
			 * 创建一个属性,这个属性会添加到流里,随着这个TokenStream流增加
			 * 这个属性中保存中所有的分词信息
			 */
			CharTermAttribute cta=stream.addAttribute(CharTermAttribute.class);
			//位置增量的属性,存储词之间的距离
			PositionIncrementAttribute pia = stream.addAttribute(PositionIncrementAttribute.class);
			//储存每个词直接的偏移量
			OffsetAttribute oa = stream.addAttribute(OffsetAttribute.class);
			//使用的每个分词器直接的类型信息
			TypeAttribute ta = stream.addAttribute(TypeAttribute.class);
			for (; stream.incrementToken();) {
				System.out.print(pia.getPositionIncrement()+":");
				System.out.print(cta+":["+oa.startOffset()+"-"+oa.endOffset()+"]-->"+ta.type()+"\n");
			}
			System.out.println();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
</span>


测试:

<span style="font-size:14px;">	@Test
	public void hhcTest(){
		Analyzer a1 =new StandardAnalyzer(Version.LUCENE_35);
		Analyzer a2 =new StopAnalyzer(Version.LUCENE_35);
		Analyzer a3 =new SimpleAnalyzer(Version.LUCENE_35);
		Analyzer a4 =new WhitespaceAnalyzer(Version.LUCENE_35);
		
		String txt ="how are you think you";
		AnalyzerUtil.displayAllToken(txt, a1);
		AnalyzerUtil.displayAllToken(txt, a2);
		AnalyzerUtil.displayAllToken(txt, a3);
		AnalyzerUtil.displayAllToken(txt, a4);
	}</span>



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163092.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Node.js中常见的异步/等待设计模式

    Node.js中常见的异步/等待设计模式

    2021年6月7日
  • 数学建模之MATLAB画图汇总

    1.二维数据曲线图1.1绘制二维曲线的基本函数1.plot()函数plot函数用于绘制二维平面上的线性坐标曲线图,要提供一组x坐标和对应的y坐标,可以绘制分别以x和y为横、纵坐标的二维曲线。例:t=0:0.1:2*pi;x=2*t;y=t.*sin(t).*sin(t);plot(x,y);2.含多个输入参数的plot函数plot函数…

    2022年4月4日
  • 云从的多粒度网络(MGN)的结构设计与技术实现-ReID行人重识别「建议收藏」

    云从的多粒度网络(MGN)的结构设计与技术实现-ReID行人重识别「建议收藏」云从的多粒度网络(MGN)的结构设计与技术实现-ReID1.摘要全局特征和局部特征的结合是提高人的再识别(re-ID)任务识别性能的一种有效方法。以前的基于部分的方法主要集中在定位具有特定预定义语义的区域来学习局部表示,这增加了学习的难度,但对具有较大方差的场景却没有效率或鲁棒性。本文提出了一种融合不同粒度判别信息的端到端特征学习策略。我们仔细设计了多粒度网络(MGN),这是一个多分支的深层网…

    2022年10月5日
  • Linux系统内核笔记[通俗易懂]

    Linux系统内核笔记[通俗易懂]一、课程介绍UNIX/Linux环境C语言,借助学习操作系统的接口的方法来学习、理解操作系统的运行机制以及一些网络协议C/C++、数据结构和算法与平台无关,重点是算法逻辑Uinx/Linux/Android/IOS平台相关,系统接口嵌入式/驱动/移植硬件相关,硬件接口 环境介绍 内存管理 文件操作 文件管理 信号处理 进程管理 进程通信 网络通信 线程管理 线程…

    2022年6月4日
  • 数组的splice方法和slice方法_splice方法返回值

    数组的splice方法和slice方法_splice方法返回值功能强大的splice方法数组中最强大的方法splice(),可以对数组进行添加、删除、替换操作删除arr=[‘0赵’,‘1钱’,‘2孙’,‘3李’,‘4周’,‘5吴’]arr.splice(index,num)第一个参数表示开始删除的索引位置,num表示删除的个数如arr.splice(1,2)返回的结果为:arr=[‘0赵’,‘3李’,‘4周’,‘5吴’]添加arr=[‘0赵’,‘1钱’,‘2孙’,‘5吴’]arr.splice(index,0,‘x’,‘y’)第一个参数表示

    2022年9月25日
  • C++学习——CString,char * ,string的相互转换

    C++学习——CString,char * ,string的相互转换CString头文件#include <afx.h>string头文件#include <string.h>1、CString转char *CString cstr;char *p =(LPSTR)(LPCTSTR)cstr;2、string转 CStringCString.format(”%s”, string.c_str());用c_str()确实比dat…

    2022年8月18日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号