【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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ios认证书_ios 证书信任设置

    ios认证书_ios 证书信任设置调用NSURLConnection实现HTTPS访问时,如果服务器证书是由CA机构颁发的(全球可信的机构,如verisign),连接方式和HTTP并没有区别。但是如果证书不是合法机构颁发的就需要定制证书验证过程。本文从记录了部分对于该过程的研究。

    2022年9月1日
    4
  • mongo启动报错:api-ms-win-crt-runtime-l1-1-0.dll 丢失

    mongo启动报错:api-ms-win-crt-runtime-l1-1-0.dll 丢失mongo启动报错:api-ms-win-crt-runtime-l1-1-0.dll 丢失

    2022年4月25日
    37
  • 卷积神经网络CNN的反向传播原理

    卷积神经网络CNN的反向传播原理  上一篇博客《详解神经网络的前向传播和反向传播》推导了普通神经网络(多层感知器)的反向传播过程,这篇博客则讨论一下卷积神经网络中反向传播的不同之处。先简单回顾一下普通神经网络中反向传播的四个核心公式:…

    2022年5月7日
    78
  • SecureCRT 中文(附上1.解决SecureCRT乱码问题2.解决Hostname lookup failed: host not found问题)[通俗易懂]

    secureCRT破解版是一款支持SSH1和SSH2的终端仿真程序,这个程序能够在windows系统中登陆UNIX或Linux的服务器主机并且还能进行管理设置,是一款非常强大的ssh传输软件,是用于连接运行包括Windows、UNIX和VMS的理想工具。并且它还有打印功能、可变屏幕尺寸、对不同主机保持不同的特性、颜色设置、自动注册等众多优秀的功能特色。同时还支持Telnet/SSH、TAPI、R…

    2022年4月17日
    222
  • 解决:如何写一个shell脚本(脚本名称:xsync,也称:xsync命令):实现多个电脑或者虚拟机之间的文件同步?

    解决:如何写一个shell脚本(脚本名称:xsync,也称:xsync命令):实现多个电脑或者虚拟机之间的文件同步?写一个shell脚本(脚本名称:xsync,又称xsync命令):实现多个电脑或者虚拟机之间的文件同步?一·xsync命令与rsync命令之间关系介绍:(1)xsync命令来源于一个xsync的脚本,这个脚本不是Linux系统自带的,是程序员自己写的。(2)xsync脚本的底层,实质是调用Linux系统自带的rsync命令,来实现多个电脑之间的快速文件同步。(3)rsync命令可以直接使用:二·xsync命令作用:(1)使用xsync命令同步一个文件,会只将这个文件,同步到其他服务器的相同路径下面。(2)使

    2022年5月21日
    47
  • 关于CPU编程—无锁编程

    关于CPU编程—无锁编程Lock-free算法通常比基于锁的算法要好:从其定义来看,它们是wait-free的,可以确保线程永远不会阻塞。状态转变是原子性的,以至于在任何点失败都不会恶化数据结构。因为线程永远不会阻塞,所以当同步的细粒度是单一原子写或比较交换时,它们通常可以带来更高的吞吐量。在某些情况下,lock-free算法会有更少的同步写操作(比如Interlocked操作),因此纯粹从性能

    2022年6月1日
    19

发表回复

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

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