2016-03-26 8 views
2

キーワードを取得するApache Lucene 5.5/6.0に基づくモジュールがあります。 1つのこと以外はすべて正常に動作しています - Luceneはストップワードをフィルタリングしません。Apache LuceneはStopAnalyzerとStopFilterを使用してもストップワードをフィルタリングしません

私は2つの異なるアプローチでストップワードフィルタリングを有効にしようとしました。

アプローチ#1:

tokenStream = new StopFilter(new ASCIIFoldingFilter(new ClassicFilter(new LowerCaseFilter(stdToken))), EnglishAnalyzer.getDefaultStopSet()); 
tokenStream.reset(); 

アプローチ#2:

tokenStream = new StopFilter(new ClassicFilter(new LowerCaseFilter(stdToken)), StopAnalyzer.ENGLISH_STOP_WORDS_SET); 
tokenStream.reset(); 

完全なコードはここにあります:
https://stackoverflow.com/a/36237769/462347

私の質問:

  1. なぜLuceneはストップワードをフィルタリングしないのですか?
  2. Lucene 5.5/6.0でストップワードフィルタリングを有効にするにはどうすればよいですか?

答えて

0

問題は、デフォルトのLuceneのストップワードリストがはるかに幅広くなることを期待していたことでした。ここで

は、デフォルトではカスタマイズされたストップワードリストをロードしようとするコードであり、それが失敗したなら、標準のいずれかを使用します。

CharArraySet stopWordsSet; 

try { 
    // use customized stop words list 
    String stopWordsDictionary = FileUtils.readFileToString(new File(%PATH_TO_FILE%)); 
    stopWordsSet = WordlistLoader.getWordSet(new StringReader(stopWordsDictionary)); 
} catch (FileNotFoundException e) { 
    // use standard stop words list 
    stopWordsSet = CharArraySet.copy(StandardAnalyzer.STOP_WORDS_SET); 
} 

tokenStream = new StopFilter(new ASCIIFoldingFilter(new ClassicFilter(new LowerCaseFilter(stdToken))), stopWordsSet); 
tokenStream.reset(); 
1

どちらもアプローチ1とアプローチ2の両方でテストされていますが、どちらもストップワードをうまく除外しているようです。ここで私はそれをテストする方法です:

public static void main(String[] args) throws IOException, ParseException, org.apache.lucene.queryparser.surround.parser.ParseException 
{ 
    StandardTokenizer stdToken = new StandardTokenizer(); 
    stdToken.setReader(new StringReader("Some stuff that is in need of analysis")); 
    TokenStream tokenStream; 

    //You're code starts here 
    tokenStream = new StopFilter(new ASCIIFoldingFilter(new ClassicFilter(new LowerCaseFilter(stdToken))), EnglishAnalyzer.getDefaultStopSet()); 
    tokenStream.reset(); 
    //And ends here 

    CharTermAttribute token = tokenStream.getAttribute(CharTermAttribute.class); 
    while (tokenStream.incrementToken()) { 
     System.out.println(token.toString()); 
    } 
    tokenStream.close(); 
} 

結果:

一部
もの
必要
分析私のサンプルの4つのストップワードを排除してい

+0

問題はLucene'は、このような言葉を除外していない 'ということです「私」、および他の一般的な英語の単語。他の拡張ストップワード辞書を付けるべきですか? 'Lucene'は他のストップワード辞書を提供していますか? –

+1

'EnglishAnalyzer'と' StandardAnalyzer'は同じストップワードセットを使用していますので、luceneにパッケージされたより広範なストップリストがあるとは思われません。だから、おそらくあなたは自分自身を作成する必要があります。 StandardAnalyzerを使用している場合は、ストップワードをプレーンテキストファイルに格納し、リーダーをコンストラクタに渡すのが簡単です。 – femtoRgon

+0

「StandardAnalyzer」または「StandardTokenizer」を意味しますか? 'StandardAnalyzer.STOP_WORDS_SET'を使用しますが、' StandardAnalyzer'のコンストラクタは使用されていません。これに対して、私は 'stdToken.setReader(new StringReader(fullText));'を持っています。どこに私のストップワードリストを置くべきですか? –

関連する問題