如何在Lucene 4.4中自定义禁用词列表

时间:2013-09-29 16:31:40

标签: java lucene stop-words

我正在使用Lucene 4.4来分析一个小型语料库。我试过StopAnalyzer和StopAnalyzer。但是,我不需要的许多术语仍会显示在我的结果中。例如,“我会”,“我们”,“x”等等。所以,我需要自定义Lucene提供的禁用词列表。我的问题是:

  1. 如何添加新的停用词? 我知道Lucene有这个构造函数来使用自定义的停用词

    public StopAnalyzer(Version matchVersion,CharArraySet stopWords)

    但我不想从头开始构建禁用词。我想使用现有的停用词,只需添加我需要的额外停用词。

  2. 如何过滤掉所有数字,包括单词和文字数字,例如“1”,“20”,“5”,“10”等?

  3. 我的解决方案

    1. 正如femtoRgon所示,Lucene提供的禁用词列表非常小,无法更改。我创建了一个CustomizeStopAnalyzer,它包含一系列停用词。 我使用StandardTokenizer并将几个过滤器链接在一起。
    2. 要删除数字,我必须添加一个NumericFilter类,检查每个标记以查看它是否为数字。 非常感谢,

1 个答案:

答案 0 :(得分:3)

1 - 标准停用词集是StopAnalyzer.ENGLISH_STOPWORD_SET。它是不可修改的,所以你应该只是复制代码作为起点:

 final List<String> stopWords = Arrays.asList(
   "a", "an", "and", "are", "as", "at", "be", "but", "by",
   "for", "if", "in", "into", "is", "it",
   "no", "not", "of", "on", "or", "such",
   "that", "the", "their", "then", "there", "these",
   "they", "this", "to", "was", "will", "with"
 );
 final CharArraySet stopSet = new CharArraySet(Version.LUCENE_CURRENT, 
     stopWords, false);

2 - 停止过滤器不是正确的方法。我怀疑,你可能正在寻找像LetterTokenizer这样的东西,它会将标记定义为连续的字母串,从而消除任何非字母字符。