`

扩展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进行再分词

    Lucene如何使用TokenFilter进行再分词,里面又我的源代码和注释!!

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

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

    Lucene 3.6 学习笔记

    第二章 索引建立 3 2.1 创建Directory 3 2.2 创建Writer 3 2.3 创建文档并且添加索引 4 2.4 查询索引的基本信息 5 2.5 删除和更新索引 5 (1) 使用writer删除 5 (2) 使用reader删除 5 (3) 恢复删除 5 (4) 彻底删除 6 ...

    spring-security-boot-preauth

    当前,这是通过获取名为token的cookie的值来实现的。 TokenFilter验证令牌。 这个简单的演示没有任何验证,这意味着该示例不安全。 在生产应用程序中,您需要确保令牌已验证。 TokenFilter将令牌转换为有效用户。...

    一站式掌握elastic search基础与实战视频资源-百度云链接

    03-10 -自定义分词之 TokenFilter .mp4 03-11 -自定义分词.mp4 03-12 -分词使用说明 .mp4 03-13 -官方文档说明.mp4 04-01 -mapping简介.avi 04-02 -自定义 mapping .avi 04-03 -mapping演示.avi 04-04 -copy_to参数...

    ban-geocode:Elasticsearch 中的禁止

    你需要wordending-tokenfilter ES 插件: git clone https://github.com/ixxi-mobility/elasticsearch-wordending-tokenfilter.git cd elasticsearch-wordending-tokenfilter make package make install 安装...

    dubbo-go服务框架-其他

    TokenFilter AccessLogFilter TpsLimitFilter ExecuteLimitFilter Auth/Sign Metrics filter Tracing filter 11、调用 泛化调用 12、监控 Opentracing API Prometheus 13、Tracing For jsonrpc For dubbo For grpc ...

    elasticsearch-analysis-url-capture:一个只保留 url 的 elasticsearch 令牌过滤器

    弹性搜索分析网址捕获一个只保留 url 的 elasticsearch 令牌过滤器这个插件现在对 ES 1.4.x 没用了只需创建一个自定义分析器,使用 uax_url_email 标记器和一个 keep_types tokenFilter 只保留“ &lt; URL&gt; ”类型。...

    luke:这是行刑卢克

    测试您的自定义Lucene分析器(Tokenizer / CharFilter / TokenFilter) 系统要求 需要JDK8 +。 在JDK11上可以正常工作。 发射卢克 从源代码 克隆存储库。 从项目目录运行mvn install 。 (在执行此操作之前,请...

Global site tag (gtag.js) - Google Analytics