`

扩展TokenFilter,实现二次分词

 
阅读更多

经过paoding分词后,再对每个token进行2次分词,此处是二元切分法

 

public class MyCJKFilter extends TokenFilter {

    private TermAttribute termAtt = (TermAttribute) addAttribute(TermAttribute.class);;
    private OffsetAttribute offsetAtt = (OffsetAttribute) addAttribute(OffsetAttribute.class);
    private PositionIncrementAttribute posAtt = (PositionIncrementAttribute) addAttribute(PositionIncrementAttribute.class);

    protected MyCJKFilter(TokenStream input) {
        super(input);
    }

    private Vector<Token> bufferToken = new Vector<Token>();

    private int count = 0;

    private CJKAnalyzer analyzer = new CJKAnalyzer();

    Map<String, Token> map = new HashMap<String, Token>();

    @Override
    public final boolean incrementToken() throws IOException {
        if (this.bufferToken.size() > 0) {
            Token t = this.bufferToken.remove(0);
            this.termAtt.setTermBuffer(t.term());
            this.offsetAtt.setOffset(t.startOffset(), t.endOffset());
            this.posAtt.setPositionIncrement(t.getPositionIncrement());
            return true;
        }
        if (this.bufferToken.size() == 0 && this.count > 0) {
            // System.out.println("count is > 0!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            count = 0;
            return false;
        }

        map.clear();

        while (input.incrementToken()) {
            this.termAtt = (TermAttribute) input.getAttribute(TermAttribute.class);
            this.offsetAtt = (OffsetAttribute) input.getAttribute(OffsetAttribute.class);
            this.posAtt = (PositionIncrementAttribute) input.getAttribute(PositionIncrementAttribute.class);
            String term = this.termAtt.term();
            Token tokenOri = new Token(term, this.offsetAtt.startOffset(), this.offsetAtt.endOffset());
            this.bufferToken.add(tokenOri);
            map.put(term, tokenOri);

            // System.out.println(term + "-->" + this.offsetAtt.startOffset() + "," + this.offsetAtt.endOffset());

            TokenStream ts = this.analyzer.tokenStream("", new StringReader(term));
            while (ts.incrementToken()) {
                TermAttribute ta = (TermAttribute) ts.getAttribute(TermAttribute.class);
                if (map.containsKey(ta.term())) {
                    continue;
                }
                OffsetAttribute offa = (OffsetAttribute) ts.getAttribute(OffsetAttribute.class);
                // System.out.println(ta.term() + "-->" + offa.startOffset() + "," + offa.endOffset());
                Token token = new Token(ta.term(), offa.startOffset(), offa.endOffset());
                if (token == null) {
                    // System.out.println("ts.next() is null");
                } else {
                    this.bufferToken.add(token);
                    // System.out.println("add to vector, term=" + token.term());
                }
            }
            count++;
        }

        if (bufferToken.size() > 0) {
            return this.incrementToken();
        } else {
            return false;
        }

    }

}

分享到:
评论

相关推荐

    Lucene如何使用TokenFilter进行再分词

    这只是一个简单的例子,实际上`TokenFilter`可以实现更复杂的功能,如词形还原、同义词替换等。 在提供的源代码中,你可能看到了更多关于如何实际应用`TokenFilter`的例子,包括如何组合多个`TokenFilter`以及如何...

    auto-phrase-tokenfilter:Lucene自动短语TokenFilter实现

    Lucene自动短语TokenFilter实现 对令牌流执行“自动短语编制”。 自动短语是指标记序列,旨在描述单个事物,因此应进行搜索。 当在令牌流中检测到这些短语时,将发出代表该短语的单个令牌,而不是组成该短语的各个...

    IKAnalyzer 中文分词demo

    5. **插件机制**:IKAnalyzer允许开发人员通过实现TokenFilter接口来编写插件,对分词结果进行进一步的处理,如去除停用词、词性标注等。 6. **分词效果优化**:IKAnalyzer提供了“智能切分”模式,能够自动识别并...

    Lucene5学习之自定义同义词分词器简单示例

    本篇将聚焦于"Lucene5学习之自定义同义词分词器简单示例",通过这个主题,我们将深入探讨如何在Lucene5中自定义分词器,特别是实现同义词扩展,以提升搜索质量和用户体验。 首先,理解分词器(Analyzer)在Lucene中...

    全文检索技术学习(三)——Lucene支持中文分词 - 李阿昀的博客 - CSDN博客1

    总之,Lucene 在处理中文文本时,需要适配合适的 Analyzer 和 Tokenizer 来实现有效的分词,以便提高全文检索的准确性和效率。理解 Analyzer 的工作原理以及如何定制和使用 Analyzer 是深入学习 Lucene 全文检索技术...

    SourceCode_elasticsearch-analysis-ik-8.7.0 (1).zip

    例如,IKAnalyzer类作为主要的入口点,配置了分词策略,并调用了Tokenizer进行初步分词,然后通过一系列TokenFilter进行进一步的词语切分和优化。 在实际应用中,我们可能会遇到一些特定需求,比如自定义停用词表、...

    IKAnalyzer3[1].2.稳定版本jar包,API,使用说明

    6. **自定义扩展**:如果需要处理特殊词汇,可以实现`org.apache.lucene.analysis.TokenFilter`或`org.apache.lucene.analysis.Tokenizer`,并添加到分词流程中。 IKAnalyzer支持与Lucene、Solr等全文检索框架的...

    IKAnalyzer源码

    3. **扩展机制**:IKAnalyzer支持插件化开发,用户可以通过实现`TokenFilter`接口来定制自己的分词规则。源码中的`TokenStream`类和`Token`类是实现这个机制的基础。 4. **词性标注**:源码中的`PosSegment`类实现...

    lucene-5.5.3对应的源码文件

    2. 词元过滤器(TokenFilter):对分词器生成的词元进行进一步处理,如删除停用词、词形还原等。 3. 文档分析器(Analyzer):结合分词器和过滤器,根据特定语言规则对文档进行分析。 4. 倒排索引(Inverted Index...

    lucene.net.analysis.cn

    虽然lucene.net.analysis.cn提供了基本的中文分词功能,但在实际应用中,我们可能需要根据具体需求进行优化和扩展,比如引入自定义词典、调整分词策略、实现自定义过滤器等。 总结,lucene.net.analysis.cn是Lucene...

    基于Lucene的超强配置式索引应用

    此外,还可以实现自定义TokenFilter和Tokenizer,对分词结果进行进一步处理,如去除停用词、词性标注等。 接下来是字段配置。在Lucene中,每个文档由多个字段组成,每个字段可以设置不同的属性,如是否存储原始值、...

    用lucene实现的简易搜索引擎

    3. 词项分析器(TokenFilter):分析器允许我们对分词器产生的Token进行进一步处理,例如去除停用词、词形还原等。 4. 倒排索引:Lucene的核心是倒排索引,它将每个词映射到包含该词的文档集合,并记录每个词在文档...

    Lucene 3.6 学习笔记

    以上就是Lucene 3.6的学习笔记,涵盖了从基础到高级的各种搜索和索引操作,以及相关的分词和扩展功能。通过学习这些内容,可以深入理解Lucene的工作机制,并利用其强大的搜索能力构建高效的应用。

    lucene.net 2.3版

    3. 词元过滤器(TokenFilter):分词后的词元经过词元过滤器进一步处理,如词干提取(Stemming)、同义词扩展等,提升搜索效果。 4. 索引(Indexing):Lucene.NET通过建立倒排索引(Inverted Index),将每个文档...

    使用lucene4.10,IKAnalyzer5.0提取敏感词

    3. 自定义`StopFilter`:创建一个新的`Filter`类,继承自`Lucene`的`TokenFilter`,并在`incrementToken()`方法中实现敏感词的检查和过滤。 4. 应用`StopFilter`:在建立`Analyzer`实例时,使用自定义的`StopFilter`...

    lucene索引

    在Lucene中,分词器(Tokenizer)负责将输入的文本分割成一个个独立的词语,然后通过词过滤器(TokenFilter)进行进一步的处理,如去除停用词、词形还原等。 在处理中文文本时,Lucene需要特殊处理,因为中文的分词...

    springboot整和jwt、shiro、redis实现token自动刷新

    此外,还需要编写一个TokenFilter,这个过滤器会在每次请求时检查请求头中的JWT,如果发现Token即将过期,就调用刷新接口获取新的Token。这个过程应该设计为无感知的,即用户在正常使用应用时,后台自动完成Token的...

    lucene自学

    在Lucene中,所有的索引数据都必须存储在一个实现了`Directory`接口的对象中。 - **IndexWriter**:索引写入器,用于创建或更新索引。通过`IndexWriter`可以添加新文档、删除现有文档或整个索引,以及优化索引等操作...

    lucene_cn.jar

    “org”目录下包含了一系列与Lucene相关的类,这些类主要负责实现中文分词和其他语言处理任务。例如,`org.apache.lucene.analysis.cn.*`包下的类,如ChineseAnalyzer,是专为中文文本设计的分析器,它采用了诸如IK...

    lucene in action源码2

    2. 字符过滤器(CharFilter)和词过滤器(TokenFilter):这些过滤器允许我们对分词结果进行预处理,比如去除停用词、词形还原或者进行词性标注。 3. 索引(Indexing):Lucene通过构建倒排索引来实现快速搜索。...

Global site tag (gtag.js) - Google Analytics