2016-03-26 18 views
2

Ich habe ein Modul basierend auf Apache Lucene 5.5/6.0, die Schlüsselwörter abruft. Alles funktioniert gut außer einer Sache - Lucene filtert keine Stoppwörter.Apache Lucene filtert keine Stoppwörter trotz der Verwendung von StopAnalyzer und StopFilter

Ich versuchte, Stop-Word-Filterung mit zwei verschiedenen Ansätzen zu ermöglichen.

Ansatz # 1:

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

Ansatz # 2:

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

Der vollständige Code ist hier verfügbar:
https://stackoverflow.com/a/36237769/462347

Meine Fragen:

  1. Warum nicht Stoppwörter filtert?
  2. Wie kann ich die Stoppwörter Filterung in Lucene 5.5/6.0 aktivieren?

Antwort

0

Das Problem war, dass ich erwartet, dass die Standard Lucene 's Stoppwörter Liste viel breiter werden wird.

Hier ist der Code, die standardmäßig versucht, die angepasste Stop-Worte-Liste zu laden und wenn es verwendet ausgefallen ist dann der Standard ein:

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

Gerade beide Ansatz 1 und Ansatz 2 getestet, und sie beide scheinen Stoppwörter ganz gut herauszufiltern. Hier ist, wie ich es getestet:

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(); 
} 

Ergebnisse:

einige
Sachen
Notwendigkeit
Analyse

, die die vier Stoppwörter in meiner Probe beseitigt hat.

+0

Das Problem ist, dass 'Lucene' nicht solche Worte nicht herausfiltern, wie 'wir',' I' und andere gebräuchliche englische Wörter. Sollte ich andere erweiterte Stoppwörter Wörterbuch anhängen? Bietet 'Lucene' andere Stoppwörterbücher? –

+1

'EnglishAnalyzer' und' StandardAnalyzer' verwenden das gleiche Stopword-Set, also glaube ich nicht, dass es eine umfangreichere Stop-Liste gibt, die in Lucene verpackt ist. Also, ja, Sie müssten wahrscheinlich Ihre eigenen erstellen. Wenn Sie StandardAnalyzer verwenden, können Sie die Stoppwörter einfach in einer Nur-Text-Datei speichern und einen Leser an den Konstruktor übergeben. – femtoRgon

+0

Meinst du 'StandardAnalyzer' oder' StandardTokenizer'? Ich benutze 'StandardAnalyzer.STOP_WORDS_SET', aber es wird kein Konstruktor für' StandardAnalyzer' verwendet. Im Gegensatz dazu habe ich 'stdToken.setReader (new StringReader (fullText));'. Wo genau sollte ich meine Stoppwörterliste platzieren? –