【问题标题】:How to customize stopword list in Lucene 4.4如何在 Lucene 4.4 中自定义停用词列表
【发布时间】:2013-10-05 12:04:58
【问题描述】:

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

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

    public StopAnalyzer(Version matchVersion, CharArraySet stopWords)

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

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

我的解决方案

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

【问题讨论】:

    标签: java lucene stop-words


    【解决方案1】:

    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 的东西,它将标记定义为连续的字母字符串,从而消除任何非字母字符。

    【讨论】:

    • 感谢 femtoRgon。我不仅要过滤非字母字符,还要过滤表示数字的单词,例如“五、十、五十”等。在使用 NLTK 时,我可以检查每个标记并有一种检查方法如果令牌包含任何数字,或者它是否可以解析为浮点数。不知道Lucene能不能做类似的事情?
    • 我试过 LetterTokenizer,它解决了一个问题,但又产生了另一个问题。它去掉了数字和标点符号。结果,我得到了诸如“isn, did, ll, ve”之类的标记,这些标记没有被停用词列表捕获。继续将这些字符串添加到停用词列表中并不是一个很好的解决方案。 StandardTokenizer 可以将“不是,我会”等识别为标记,但它不会删除数字。你有什么建议来解决它吗?谢谢,
    • 我不知道有任何过滤器可以完全满足您的需求。您可能需要实现自己的。由于您只是打算删除标记,FilteringTokenFilter 将是要实现的基类。您只需要实现accept 方法,然后将其合并到您的分析器中。
    猜你喜欢
    • 2021-03-12
    • 2013-08-03
    • 1970-01-01
    • 2017-05-29
    • 2020-06-30
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    相关资源
    最近更新 更多