4

現在、ngram 頻度のテキスト本文をフィルタリングするときに、ストップ ワードを含めるかどうかをユーザーに選択させるオプションを提供しています。通常、これは次のように行われます。

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

stopWords は、ngram に含めるか、ngram から削除する単語の完全なリストに設定されます。this.getnGramLength()); 現在の ngram の長さを最大 3 つまで格納するだけです。

トライグラムのテキスト「衛星は間違いなく地球に落ちています」をフィルタリングする際にストップワードを使用すると、出力は次のようになります。

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

アンダースコアが表示されるのはなぜですか? シンプルなユニグラム、「satellite fall」、「falling earth」、「satellite Falling Earth」を見て思ったでしょうか? 間違いなく、私が使用しているストップワード セットに含まれています。

アンダースコアで結果を除外することはできますが...

4

1 に答える 1

3

アンダースコアは「ストップ ワードの欠落」を表します。その動作を回避するには、enablePositionIncrementstoを設定する必要がありますfalseSnowballAnalyzer(4.0.0-Beta では非推奨)、それを行うことはできません。

1 つの解決策は、最初にストップ ワードを指定せずに StandardAnalyzer を使用してから、出力を 、 、および で装飾するStopFilterことSnowballFilterですShingleFilter。Lucene 4.0.0-Beta のバイグラムの例:

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+ ではもう不可能です。まだ良い代替手段を探しています...

于 2012-12-14T20:01:06.970 に答える