当获得ngram频率时,Lucene中的下划线输出带有停用词

时间:2012-09-19 08:33:40

标签: lucene n-gram

我正在为用户提供在过滤ngram频率的文本正文时是否包含停用词的选项。通常,这可以通过以下方式完成:

snowballAnalyzer = new SnowballAnalyzer(Version.LUCENE_30, "English", stopWords);               
shingleAnalyzer = new ShingleAnalyzerWrapper(snowballAnalyzer, this.getnGramLength());

将stopWords设置为要包含在ngrams中的完整单词列表或从中删除。 this.getnGramLength());只包含当前的ngram长度,最多不超过三个。

如果我在过滤文本中使用停用词“卫星肯定会掉到地球上”,那么输出是:

No=1, Key=to, Freq=1
No=2, Key=definitely, Freq=1
No=3, Key=falling to earth, Freq=1
No=4, Key=satellite, Freq=1
No=5, Key=is, Freq=1
No=6, Key=definitely falling to, Freq=1
No=7, Key=definitely falling, Freq=1
No=8, Key=falling, Freq=1
No=9, Key=to earth, Freq=1
No=10, Key=satellite is, Freq=1
No=11, Key=is definitely, Freq=1
No=12, Key=falling to, Freq=1
No=13, Key=is definitely falling, Freq=1
No=14, Key=earth, Freq=1
No=15, Key=satellite is definitely, Freq=1

但是如果我不使用停用词来表示三元组,输出就是:

No=1, Key=satellite, Freq=1
No=2, Key=falling _, Freq=1
No=3, Key=satellite _ _, Freq=1
No=4, Key=_ earth, Freq=1
No=5, Key=falling, Freq=1
No=6, Key=satellite _, Freq=1
No=7, Key=_ _, Freq=1
No=8, Key=_ falling _, Freq=1
No=9, Key=falling _ earth, Freq=1
No=10, Key=_, Freq=3
No=11, Key=earth, Freq=1
No=12, Key=_ _ falling, Freq=1
No=13, Key=_ falling, Freq=1

为什么我会看到下划线?我本以为看到简单的unigrams,“卫星坠落”,“落地”和“卫星落地”?绝对是我正在使用的停用词集。

我可以用下划线过滤掉结果,但是......

1 个答案:

答案 0 :(得分:3)

下划线表示'缺少停止词/ s'。为了避免这种行为,您应该将enablePositionIncrements设置为false,但SnowballAnalyzer(现在已在4.0.0-Beta中弃用)不允许您这样做。

一种解决方案是首先使用没有停用词的StandardAnalyzer,然后使用StopFilterSnowballFilterShingleFilter修饰输出。 Lucene 4.0.0-Beta中bi-gram的示例:

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40, CharArraySet.EMPTY_SET);
TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(input));
StopFilter stopFilter = new StopFilter(Version.LUCENE_40, tokenStream, stopWords);
stopFilter.setEnablePositionIncrements(false);
SnowballFilter snowballFilter = new SnowballFilter(stopFilter, "English");
ShingleFilter bigramShingleFilter = new ShingleFilter(snowballFilter, 2, 2);

希望这能让你走上正轨!

修改

Lucene v4.4 +不再可能,仍然在寻找一个不错的选择......