【Lucene】TokenStream-语汇单元的项、偏移量、类型和位置增量

【Lucene】TokenStream-语汇单元的项、偏移量、类型和位置增量代码:packagecom.tan.code;importjava.io.IOException;importjava.io.StringReader;importorg.apache.lucene.analysis.Analyzer;importorg.apache.lucene.analysis.TokenStream;importorg.apache.lucene.

大家好,又见面了,我是你们的朋友全栈君。

代码:
package com.tan.code;

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.standard.StandardAnalyzer;
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;
import org.apache.lucene.util.Version;

public class TokenStreamDetails {

	public void tokeStrem(String text) throws IOException {
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
		StringReader reader = new StringReader(text);
		TokenStream tokenStream = analyzer.tokenStream("", reader);

		// 语汇单元对应的文本
		CharTermAttribute charTermAttribute = tokenStream
				.addAttribute(CharTermAttribute.class);
		// 其实字符和终止字符的偏移量
		OffsetAttribute offsetAttribute = tokenStream
				.addAttribute(OffsetAttribute.class);
		// 位置增量(默认为1)
		PositionIncrementAttribute positionIncrementAttribute = tokenStream
				.addAttribute(PositionIncrementAttribute.class);
		// 语汇单元类型(默认为单词)
		TypeAttribute typeAttribute = tokenStream
				.addAttribute(TypeAttribute.class);

		int position = 0;
		// 递归处理所有语汇单元
		while (tokenStream.incrementToken()) {
			int increment = positionIncrementAttribute.getPositionIncrement();
			if (increment > 0) {
				// 计算位置信息
				System.out.println("position:" + (position += increment));
			}
			// 打印所有语汇单元详细信息
			System.out.println("【Trem:" + charTermAttribute.toString()
					+ "】【StartOffset:" + offsetAttribute.startOffset()
					+ "】【EndOffset:" + offsetAttribute.endOffset() + "】【Type:"
					+ typeAttribute.type()+"】");
		}
	}
}

测试

@Test
	public void testTokenStream() throws IOException {
		TokenStreamDetails tokenStreamDetails = new TokenStreamDetails();
		
		String text = "打印所有的TokenStream的詳細信息!Print the TokenStream Data";
		tokenStreamDetails.tokeStrem(text);
	}


输出:

position:1
【Trem:打】【StartOffset:0】【EndOffset:1】【Type:<IDEOGRAPHIC>】
position:2
【Trem:印】【StartOffset:1】【EndOffset:2】【Type:<IDEOGRAPHIC>】
position:3
【Trem:所】【StartOffset:2】【EndOffset:3】【Type:<IDEOGRAPHIC>】
position:4
【Trem:有】【StartOffset:3】【EndOffset:4】【Type:<IDEOGRAPHIC>】
position:5
【Trem:的】【StartOffset:4】【EndOffset:5】【Type:<IDEOGRAPHIC>】
position:6
【Trem:tokenstream】【StartOffset:5】【EndOffset:16】【Type:<ALPHANUM>】
position:7
【Trem:的】【StartOffset:16】【EndOffset:17】【Type:<IDEOGRAPHIC>】
position:8
【Trem:詳】【StartOffset:17】【EndOffset:18】【Type:<IDEOGRAPHIC>】
position:9
【Trem:細】【StartOffset:18】【EndOffset:19】【Type:<IDEOGRAPHIC>】
position:10
【Trem:信】【StartOffset:19】【EndOffset:20】【Type:<IDEOGRAPHIC>】
position:11
【Trem:息】【StartOffset:20】【EndOffset:21】【Type:<IDEOGRAPHIC>】
position:12
【Trem:print】【StartOffset:22】【EndOffset:27】【Type:<ALPHANUM>】
position:14
【Trem:tokenstream】【StartOffset:32】【EndOffset:43】【Type:<ALPHANUM>】
position:15
【Trem:data】【StartOffset:44】【EndOffset:48】【Type:<ALPHANUM>】

语汇单元的组成【截图】,其中各个属性的作用可以参考《Lucene In Action》:

【Lucene】TokenStream-语汇单元的项、偏移量、类型和位置增量

从代码示例中看到,可以通过调用addAttribute(class)来获取这些属性;使用tokenStream.incrementToken()递归访问所有的语汇单元,如果该方法到达下一个新的语汇单元则返回true,若已经对stream处理完毕则返回false。然后就可以与先前获取的属性对象进行交互得到针对每个语汇单元的属性值。当incrementToken返回true时,其中所有的属性都会将内部状态修改为下一个语汇单元

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

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

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


相关推荐

  • JMESPath_正则表达式语法

    JMESPath_正则表达式语法前言JMESPath是JSON的查询语言。您可以从JSON文档中提取和转换元素官方文档:https://jmespath.org/tutorial.html基本表达式JMESPath用的最多的

    2022年7月31日
    3
  • CGLIB详解(最详细)

    CGLIB详解(最详细)转载地址:https://blog.csdn.net/danchu/article/details/70238002什么是CGLIBCGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作。Hibernate作为一个比…

    2022年6月11日
    88
  • 关于数据库逻辑删除(伪删除)的设计方案探讨

    关于数据库逻辑删除(伪删除)的设计方案探讨项目上碰到过关于数据采用了逻辑删除导致的问题,情况是这样:原先的代码中,对于表T中的数据的删除采用的是逻辑删除,但是其他使用该数据的地方并没有针对逻辑删除进行配套的处理。该表T中存在字段A要求不能重复,其实就是说字段A是uniquekey。那么问题就来了,逻辑删除只是将数据的status字段更新为删除状态,所以字段A的旧值依然存在,导致插入新数据时,就不能使用已经删除的字段A的值,这明显是…

    2022年5月12日
    44
  • DM368_了解电脑硬件基本知识

    DM368_了解电脑硬件基本知识最近到了找工作准备期,之前已将C语言、数据结构与算法、APUE总结完毕,现在需要抓紧将以往项目加以总结。关于DM368首先我们先从硬件部分开始讲起,然后再讲环境搭建、系统移植、文件烧写、最后程序开发。一、认识开发板参看下面网址可下载DM368参考原理图和Gerber文件。参看:EVMDM368SupportHome参看:EVMDM365SupportHomeDM365与DM

    2022年8月13日
    4
  • HMM超详细讲解+代码[通俗易懂]

    HMM超详细讲解+代码[通俗易懂]写在前面本文目标Why-什么场景下需要HMM模型What-HMM模型的相关概念定义HMM模型的5元组HMM中的3个经典问题How-HMM模型中的3个经典问题评估评估描述评估理论推导评估实际算法前向计算python前向算法代码预测预测描述维特比算法python维特比算法代码学习EM算法实例理解baum-welch算法的思路python代码baum-w

    2022年10月22日
    1
  • ttl低电平接大电阻_3.4 TTL门电路

    ttl低电平接大电阻_3.4 TTL门电路3.4TTL门电路1.双极性三极管的开关特性(静态)图1在数字电路中,三极管作为开关元件,主要工作在饱和和截止两种开关状态,放大区只是极短暂的过渡状态。2.三极管的开关时间(动态特性)图2(1)开启时间ton:三极管从截止到饱和所需的时间。ton=td+trtd:延迟时间tr:上升时间(2)关闭时间toff:三极管从饱和到截止所需的时间。toff=ts+tf…

    2025年6月23日
    0

发表回复

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

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