lucene定义自己的分词器将其分成单个字符

lucene定义自己的分词器将其分成单个字符

大家好,又见面了,我是全栈君。

问题描写叙述:将一句话拆分成单个字符。而且去掉空格。

package com.mylucene;

import java.io.IOException;
import java.io.Reader;

import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.util.AttributeSource.AttributeFactory;

public class SpiltChar extends Tokenizer {
	
	 public SpiltChar(AttributeFactory factory, Reader input) {
		super(factory, input);
		// TODO Auto-generated constructor stub
	}

	public SpiltChar(Reader input) {
	      super(input);
	    }
	    private int offset = 0, bufferIndex=0, dataLen=0;
	    private final static int MAX_WORD_LEN = 255;
	    private final static int IO_BUFFER_SIZE = 1024;
	    private final char[] buffer = new char[MAX_WORD_LEN];
	    private final char[] ioBuffer = new char[IO_BUFFER_SIZE];
	    private int length;
	    private int start;
	    private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
	    private final OffsetAttribute offsetAtt = addAttribute(OffsetAttribute.class);
	    private final void push(char c) {
	        if (length == 0) start = offset-1;            // start of token
	        buffer[length++] = Character.toLowerCase(c);  // buffer it

	    }

	    private final boolean flush() {

	        if (length>0) {
	            //System.out.println(new String(buffer, 0,
	            //length));
	          termAtt.copyBuffer(buffer, 0, length);
	          offsetAtt.setOffset(correctOffset(start), correctOffset(start+length));
	          return true;
	        }
	        else
	            return false;
	    }

	    @Override
	    public boolean incrementToken() throws IOException {
	        clearAttributes();

	        length = 0;
	        start = offset;
	        while (true) {
	            final char c;
	            offset++;
	            if (bufferIndex >= dataLen) {
	                dataLen = input.read(ioBuffer);
	                bufferIndex = 0;
	            }

	            if (dataLen == -1) {
	              offset--;
	              return flush();
	            } else
	                c = ioBuffer[bufferIndex++];

	            switch(Character.getType(c)) {

	            case Character.DECIMAL_DIGIT_NUMBER://注意此部分只是滤一些熟悉或者字母
	            case Character.LOWERCASE_LETTER://注意此部分
	            case Character.UPPERCASE_LETTER://注意此部分
//	                push(c);
//	                if (length == MAX_WORD_LEN) return flush();
//	                break;
	         
	            case Character.OTHER_LETTER:
	                if (length>0) {
	                    bufferIndex--;
	                    offset--;
	                    return flush();
	                }
	                push(c);
	                return flush();

	            default:
	                if (length>0) return flush();
	            	 
		                break;
	                
	            }
	        }
	    }
	    
	    @Override
	    public final void end() {
	      // set final offset
	      final int finalOffset = correctOffset(offset);
	      this.offsetAtt.setOffset(finalOffset, finalOffset);
	    }

	    @Override
	    public void reset() throws IOException {
	      super.reset();
	      offset = bufferIndex = dataLen = 0;
	    }

}

定义自己的分词器类:

package com.mylucene;

import java.io.Reader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Tokenizer;

/**
 * 单字切分
 * **/
public class SpiltCharAnalyzer extends Analyzer {

	@Override
	protected TokenStreamComponents createComponents(String arg0, Reader arg1) {
	   
		Tokenizer token=new SpiltChar(arg1);
		
		return new TokenStreamComponents(token);
	}
	
	
	
	

}


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

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

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


相关推荐

  • 病毒代码「建议收藏」

    病毒代码「建议收藏」【病毒小程序】关于病毒的代码可以用来运行一下,你的电脑可能会发生……但大家都知道,病毒是恐怖的,你可以做一些有趣的代码.关机代码#includeusingnamespacestd;

    2022年7月1日
    43
  • 皮亚诺曲线_皮亚诺余项o什么意思

    皮亚诺曲线_皮亚诺余项o什么意思概述皮亚诺曲线是一种奇怪的曲线,只要恰当选择函数和由定义的一条连续的参数曲线,当参数t在0,1区间取值时,曲线将遍历单位正方形中所有的点,得到一条充满空间的曲线。就一条联系而又不可导的曲线。目录皮亚诺曲线一些不同观点皮亚诺曲线皮亚诺(Peano)曲线是一条能够填满正方形的曲线。在传统概念中,曲线的数维是1维,正方形是2维。1890年,意大利数学…

    2025年8月15日
    4
  • pycharm安装教程2021.2.2_eclipse环境配置

    pycharm安装教程2021.2.2_eclipse环境配置在PyCharm中如何配置Anaconda3环境软件:PyCharm2020.2.2×64;Anaconda3(64-bit)步骤如下:1.File→NewProject2.选择Newenvironment,Conda选项我的是默认选好的,没有更改3.Create即可,下一次创建新的项目默认使用Anaconda环境…

    2022年8月29日
    4
  • MBUS协议_sbus协议

    MBUS协议_sbus协议在前面关于MBus协议的描述中,个人觉得在描述TSS721部分存在不容易理解的地方,总觉得还可以说的更清楚点,在实际使用中我又发现TSS721的一款替代芯片,在这里作个详细的说明,可以加深对MBus协议实现的理解和TSS721部分的理解。2013年9月10日–推动高能效创新的安森美半导体(ONSemiconductor,美国纳斯达克上市代号:ONNN)推出一款新的集成…

    2022年10月15日
    3
  • linux查看并杀死进程_ubuntu查看进程命令

    linux查看并杀死进程_ubuntu查看进程命令今天在netbeans中关闭webrick时,发现没有关闭掉,打入localhost:3000依然显示页面,发现无法从nb中再次关闭只有进入ubuntu的进程下关闭查看进程:1,ps-e命令2,feng@feng:~$sudonetstat-antupActiveInternetconnections(serversandestablished)ProtoRecv-QSe…

    2022年9月21日
    2
  • 面部表情还是面目表情(怎样调整面部表情)

    目录概要:问题来源:论文对此比赛的说明:选择原因:实现与优化思路:前置:数据处理:原csv数据的读取与分割:csv数据转图片和tfrecord的存取:tfrecord接生产队列供模型训练:神经网络定义:损失函数:滑动平均(EMA):训练与优化过程:基本设置:学习率:batch_size:训练次数:Dropout:BN:…

    2022年4月11日
    86

发表回复

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

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