Lucene TokenFilter使用EnglishAnalyzer删除科学文章中的数字

时间:2017-09-05 08:55:32

标签: java lucene numbers token

我正在与Lucene索引科学文章。我使用以下配置:

EnglishAnalyzer analyzer = new EnglishAnalyzer(Version.LUCENE_43, EnglishAnalyzer.getDefaultStopSet());

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_43, analyzer);

这对言语有好处。但我想删除类似于" 0.99"的令牌。或" 3,14"但保留文字,如" H2O" (如果有可能在一个标记中也是" n = 3")。我试过SimpleAnalyzer,但不是我想要的。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用自定义,但简单的FilteringTokenFilter来实现您想要的功能,它将过滤我们所有不需要的令牌,例如通过regexp。您需要做的就是扩展此类并实现accept方法

protected boolean accept() throws IOException {
            String token = new String(termAtt.buffer(), 0 ,termAtt.length());
            if (token.matches("[0-9,.]+")) {
                return false;
            }
            return true;
        }

在这种情况下,我会过滤掉所有仅包含数字和逗号和点的标记(作为可能的分隔符)

        Tokenizer whitespaceTokenizer = new WhitespaceTokenizer(reader);
        TokenStream tokenStream = new StopFilter(whitespaceTokenizer, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
        tokenStream = new ScientificFiltering(tokenStream);

对于不过滤n = 3和其他类似构造,我建议使用WhitespaceTokenizer,仅在空格字符上拆分标记。

如需完整示例,请查看here