2008-12-07 6 views

Antwort

34

Sie sollten in das Modul SpellChecker im Contrib Verzeichnis schauen. Es ist ein Port von Java Lucene SpellChecker Modul, so dass seine documentation sollte hilfreich sein.

(Von der javadocs :)

Verwendungsbeispiel:

import org.apache.lucene.search.spell.SpellChecker; 

    SpellChecker spellchecker = new SpellChecker(spellIndexDirectory); 
    // To index a field of a user index: 
    spellchecker.indexDictionary(new LuceneDictionary(my_lucene_reader, a_field)); 
    // To index a file containing words: 
    spellchecker.indexDictionary(new PlainTextDictionary(new File("myfile.txt"))); 
    String[] suggestions = spellchecker.suggestSimilar("misspelt", 5); 
+1

das ist die richtige antwort, sollte akzeptiert werden! genau das, was ich gesucht habe;) –

+2

Das SpellChecker Modul bewegt: https://svn.apache.org/repos/asf/lucene/lucene.net/trunk/C%23/contrib/SpellChecker.Net/ – Domenic

6

AFAIK Lucene unterstützt Nähe Suche, was bedeutet, dass, wenn Sie so etwas wie verwenden:

Feld: stirng ~ 0,5

(es ist eine Tilde-Zeichen)

wird "string" entsprechen. Der Float ist, wie "tolerant" die Suche wäre, wo 1.0 genau passt und 0.0 alles (Art von) übereinstimmt.

Verschiedene Parser werden dies jedoch anders implementieren.

Eine Proximity-Suche ist viel langsamer als eine Fuzzy-Suche (stri *), also verwenden Sie sie mit Vorsicht. In Ihrem Fall würde man annehmen, dass, wenn Sie bei einer normalen Suche keine Übereinstimmungen finden, Sie eine Proximity-Suche versuchen, um zu sehen, was Sie finden, und "Sie meinten" basierend auf dem Ergebnis irgendwie darstellen.

Kann aus Performancegründen nützlich sein, um diese Art von Lookups für sehr häufige Fehlbuchungen zwischenzuspeichern.

1

Googles "Meinten Sie?" ist (wahrscheinlich; sie sind geheim, natürlich) implementiert, indem sie ihr Abfrageprotokoll konsultieren. Überprüfen Sie, ob Nutzer, die nach der Suchanfrage gesucht haben, die Sie gerade verarbeiten, bald darauf nach etwas sehr ähnlichem gesucht haben. Wenn dies der Fall ist, deutet dies darauf hin, dass sie einen Fehler gemacht haben und erkannt haben, wonach sie suchen sollten.

Da Sie wahrscheinlich kein großes Abfrageprotokoll haben, können Sie es näherungsweise angeben. Nehmen Sie die Abfrage, teilen Sie die Begriffe auf, sehen Sie, ob es ähnliche Begriffe in der Datenbank gibt (nach der Entfernung, was auch immer); Ersetzen Sie Ihre Begriffe durch diese Begriffe in der Nähe, und führen Sie die Abfrage erneut aus. Wenn Sie mehr Treffer bekommen, war das wahrscheinlich eine bessere Abfrage. Schlage es dem Benutzer vor. (Und da Sie bereits die Hits haben, und die meisten Leute nur auf die Top 2 Ergebnisse schauen, zeigen Sie ihnen diese.)

+0

Es gibt eine einfache Erklärung, was "meintest du" hier tut http://norvig.com/spell-correct.html, es ist eine sehr interessante Lektüre. –

0

Hier finden Sie aktuelles Projekt Google Code genannt semanticvectors. Es gibt eine ordentliche Menge an Diskussionen auf den Lucene-Mailinglisten, um Funktionen wie das, was Sie gerade verwenden, zu verwenden - allerdings ist es in Java geschrieben.

Sie müssen wahrscheinlich einige maschinelle Lernalgorithmen in Ihren Suchprotokollen analysieren und verwenden, um ein solches Feature zu erstellen!