【问题标题】:Java Lucene Stop Words FilterJava Lucene 停用词过滤器
【发布时间】:2012-11-21 20:18:57
【问题描述】:

我有大约 500 个句子,我想在其中编译一组 ngram。我无法删除停用词。我尝试添加 lucene StandardFilter 和 StopFilter 但我仍然遇到同样的问题。这是我的代码:

for(String curS: Sentences)
{
          reader = new StringReader(curS);
          tokenizer = new StandardTokenizer(Version.LUCENE_36, reader);
          tokenizer = new StandardFilter(Version.LUCENE_36, tokenizer);
          tokenizer = new StopFilter(Version.LUCENE_36, tokenizer, stopWords);
          tokenizer = new ShingleFilter(tokenizer, 2, 3);
          charTermAttribute = tokenizer.addAttribute(CharTermAttribute.class);

    while(tokenizer.incrementToken())
    {
        curNGram = charTermAttribute.toString().toString();
        nGrams.add(curNGram);                   //store each token into an ArrayList
    }
}

例如,我要测试的第一个短语是:“对于每个倾听的人”。在此示例中,curNgram 设置为“For”,这是我的列表 stopWords 中的停用词。此外,在本例中,“every”是停用词,因此“person”应该是第一个 ngram。

  1. 为什么在我使用 StopFiler 时停用词会添加到我的列表中?

感谢所有帮助!

【问题讨论】:

  • stopWords 是如何创建的?您是否使用StopFilter.makeStopSet 创建它?
  • 我使用静态函数逐行读取一个txt文件。

标签: java filter lucene words


【解决方案1】:

我觉得你发布的内容没问题,所以我怀疑 stopWords 没有向过滤器提供你想要的信息。

尝试类似:

//Let's say we read the stop words into an array list (A simple array, or any list implementation should be fine)
List<String> words = new ArrayList();
//Read the file into words.
Set stopWords = StopFilter.makeStopSet(Version.LUCENE_36, words, true);

假设您生成的停用词列表(我将其命名为“单词”)看起来像您认为的那样,这应该将它们转换为 StopFilter 可用的格式。

你已经在生成这样的停用词了吗?

【讨论】:

  • 这似乎有效,但是对于我的一些输出,我得到相同的单词,除了一个将有一个或两个额外的下划线。例如,我将 USA、USA_、USA__ 都作为不同的值。
  • 这是 ShingleFilter 的预期行为,来自 API:“此过滤器通过插入填充标记(带有术语文本“_”的标记)来处理位置增量 > 1。它不处理位置增量 0。 "这是由于停止过滤器删除了单词,ShingleFilter 以这种方式保持它们的位置。
  • 如果您愿意,我相信您可以使用 stopfilter.setEnablePositionIncrements(false) 禁用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 2016-07-14
  • 1970-01-01
  • 2019-05-05
  • 2013-07-11
相关资源
最近更新 更多