尽管使用了StopAnalyzer和StopFilter

时间:2016-03-26 21:22:15

标签: java apache lucene information-retrieval stop-words

我有一个基于Apache Lucene 5.5 / 6.0的模块,用于检索关键字。除了一件事之外,一切都工作得很好 - Lucene没有过滤停止词。

我尝试使用两种不同的方法启用停用词过滤。

方法#1:

tokenStream = new StopFilter(new ASCIIFoldingFilter(new ClassicFilter(new LowerCaseFilter(stdToken))), EnglishAnalyzer.getDefaultStopSet());
tokenStream.reset();

方法#2:

tokenStream = new StopFilter(new ClassicFilter(new LowerCaseFilter(stdToken)), StopAnalyzer.ENGLISH_STOP_WORDS_SET);
tokenStream.reset();

完整代码可在此处获得:
https://stackoverflow.com/a/36237769/462347

我的问题:

  1. 为什么Lucene不会过滤停用词?
  2. 如何在Lucene 5.5 / 6.0中启用停用词过滤?

2 个答案:

答案 0 :(得分:1)

刚刚测试了方法1和方法2,他们似乎都很好地过滤了停止词。以下是我测试它的方法:

public static void main(String[] args) throws IOException, ParseException, org.apache.lucene.queryparser.surround.parser.ParseException 
{
     StandardTokenizer stdToken = new StandardTokenizer();
     stdToken.setReader(new StringReader("Some stuff that is in need of analysis"));
     TokenStream tokenStream;

     //You're code starts here
     tokenStream = new StopFilter(new ASCIIFoldingFilter(new ClassicFilter(new LowerCaseFilter(stdToken))), EnglishAnalyzer.getDefaultStopSet());
     tokenStream.reset();
     //And ends here

     CharTermAttribute token = tokenStream.getAttribute(CharTermAttribute.class);
     while (tokenStream.incrementToken()) {
         System.out.println(token.toString());
     }
     tokenStream.close();
}

结果:

  

一些
  东西
  需要
  分析

这已经消除了我样本中的四个停用词。

答案 1 :(得分:0)

问题在于我预计默认的CharArraySet stopWordsSet; try { // use customized stop words list String stopWordsDictionary = FileUtils.readFileToString(new File(%PATH_TO_FILE%)); stopWordsSet = WordlistLoader.getWordSet(new StringReader(stopWordsDictionary)); } catch (FileNotFoundException e) { // use standard stop words list stopWordsSet = CharArraySet.copy(StandardAnalyzer.STOP_WORDS_SET); } tokenStream = new StopFilter(new ASCIIFoldingFilter(new ClassicFilter(new LowerCaseFilter(stdToken))), stopWordsSet); tokenStream.reset(); 停用词列表会更广泛。

以下是默认情况下尝试加载自定义停用词列表的代码,如果失败则使用标准停用词列表:

Entity