我正在用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
,但不是我想要的。有任何想法吗?
谢谢!
最佳答案
您可以使用自定义但简单的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