Erste Schritte bei der Rechtschreibprüfung mit Apache Lucene und Solr

Einführung Kürzlich habe ich ein wenig an der Verbesserung der Benutzerfreundlichkeit der Lucene-Rechtschreibprüfung gearbeitet (siehe LUCENE-2479, LUCENE-2608 und die damit…

Einführung

Kürzlich habe ich ein wenig an der Verbesserung der Benutzerfreundlichkeit der Lucene-Rechtschreibprüfung gearbeitet (siehe LUCENE-2479, LUCENE-2608 und die damit verbundene Solr-Arbeit) und dabei kam mir der Gedanke, dass ein Beitrag über die Rechtschreibprüfung in Solr nützlich wäre.

Für diejenigen, die damit nicht vertraut sind: Das Konzept der Rechtschreibprüfung in der Suche (oft auch „Did You Mean?“ genannt) unterscheidet sich ein wenig von dem Konzept der einfachen Korrektur von Rechtschreibfehlern. Es geht nicht darum, dass wir falsch geschriebene Wörter nicht korrigieren wollen, sondern vielmehr darum, dass wir Vorschläge für Wörter machen wollen, die zu besseren Ergebnissen führen, und zwar auf der Grundlage der Art und Weise, wie die Dinge im Index geschrieben sind, sowie anderer Faktoren wie dem bisherigen Nutzerverhalten, der „richtigen“ Schreibweise des Wortes und anderen apriorischen Informationen, wie z.B. Geschäftszielen, die uns möglicherweise vorliegen. So kann es zum Beispiel sein, dass ein Wort von den Autoren in Ihrem Korpus so oft falsch geschrieben wird, dass der beste Vorschlag ein falsch geschriebenes Wort ist, selbst wenn die ursprüngliche Anfrage des Benutzers richtig geschrieben war! Einige Hintergrundinformationen zum Aufbau einer Rechtschreibprüfung finden Sie in dem hervorragenden Beitrag von Peter Norvig.

Hintergrund

Um die Rechtschreibprüfung in Solr zu verstehen, ist es hilfreich, ein wenig mehr darüber zu wissen, was unter der Haube vor sich geht. Die Rechtschreibprüfung besteht aus mehreren Teilen, von denen einige in Solr und einige in Lucene arbeiten.

Der primäre Mechanismus für die Bereitstellung von Rechtschreibkorrekturen ist bei Solr eine Suchkomponente namens SpellCheckComponent. Es handelt sich dabei um eine hochgradig konfigurierbare Komponente, die es einem Anwendungsentwickler ermöglicht, bei der Konfiguration mehrere Rechtschreibprüfungen (mehr dazu gleich) einzubinden und dann zur Abfragezeit Rechtschreibvorschläge aus diesen Wörterbüchern als Teil der Antwort auf die Solr-Abfrage zu erhalten. Eine Rechtschreibprüfung ist eine Implementierung des SolrSpellChecker, die bei Eingaben wie einer Abfrage und anderen Parametern Vorschläge zusammen mit anderen Metadaten zurückgibt. Es werden mehrere Rechtschreibprüfungen angeboten, darunter solche, die auf der Lucene-Rechtschreibprüfung basieren, und dateibasierte. Die am häufigsten verwendete ist die Lucene-Rechtschreibprüfung, aber ich habe auch andere implementiert und habe gesehen, dass andere dies ebenfalls getan haben.

Da die Lucene-Rechtschreibprüfung die am häufigsten verwendete ist, lohnt es sich, sie etwas genauer zu betrachten. Die Lucene-Rechtschreibprüfung wird mit der Lucene-Version geliefert und befindet sich in contrib/spellchecker. Im Großen und Ganzen funktioniert sie so, dass sie ein bestehendes Feld aus dem Lucene-Hauptindex nimmt und einen sekundären Index erstellt, der speziell für die schnelle Suche nach Kandidatenvorschlägen entwickelt wurde. Dieser Index wird durch die Erstellung von zeichenbasierten n-Grammen der Wörter aus dem ursprünglichen Feld erstellt. Bei der Abfrage wird das zu prüfende Wort entsprechend analysiert und dann mit diesem sekundären Index abgeglichen. Unter der Annahme, dass ein oder mehrere Treffer zurückgegeben werden, wird der Wortkandidat dann mit Hilfe eines String-Distanzmaßes mit dem Originalwort verglichen (siehe org.apache.lucene.search.spell.StringDistance). Das Abstandsmaß ist vollständig anpassbar. Derzeit sind drei verschiedene Maße verfügbar: LevensteinDistance, JaroWinklerDistance und NGramDistance. Jedes hat seine eigenen Vorzüge, daher empfehle ich Ihnen, sie auszuprobieren, um zu sehen, welches die besten Ergebnisse liefert. Im Allgemeinen trägt JaroWinkler der Tatsache Rechnung, dass die meisten Menschen die ersten paar Buchstaben eines Wortes richtig schreiben. (Zufälligerweise hat mein Mitautor von Taming Text<, Tom Morton, ein ganzes Kapitel über Fuzzy String Matching, einschließlich Rechtschreibprüfung, für unser Buch geschrieben. Es handelt sich um Kapitel 4 und ist derzeit in MEAP verfügbar.) Sobald die Kandidaten bewertet wurden, werden sie einer Prioritäts-Warteschlange hinzugefügt und dann werden die besten X Ergebnisse zurückgegeben, wobei X ein Eingabeparameter für den Methodenaufruf ist.

Da der Hintergrund nun geklärt ist, lassen Sie uns einen Blick auf die Anwendung werfen.

Einrichtung

Die Einrichtung der SpellCheckComponent ist ziemlich einfach. In der solrconfig.xml müssen wir eine <searchComponent> deklarieren und sie dann konfigurieren. Das Solr-Tutorial hat zum Beispiel:

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<str name="queryAnalyzerFieldType">textSpell</str>
<lst name="spellchecker">
<str name="name">default</str>
<str name="field">name</str>
<str name="spellcheckIndexDir">./spellchecker</str>
</lst>
<!-- a spellchecker that uses a different distance measure
<lst name="spellchecker">
<str name="name">jarowinkler</str>
<str name="field">spell</str>
<str name="distanceMeasure">org.apache.lucene.search.spell.JaroWinklerDistance</str>
<str name="spellcheckIndexDir">./spellchecker2</str>
</lst>
-->
<!-- Use an alternate comparator -->
<!--<lst name="spellchecker">
<str name="name">freq</str>
<str name="field">lowerfilt</str>
<str name="spellcheckIndexDir">spellcheckerFreq</str>
&lt;!&ndash; comparatorClass be one of:
1. score (default)
2. freq (Frequency first, then score)
3. A fully qualified class name
&ndash;&gt;
<str name="comparatorClass">freq</str>
<str name="buildOnCommit">true</str>
-->
<!-- a file based spell checker
<lst name="spellchecker">
<str name="classname">solr.FileBasedSpellChecker</str>
<str name="name">file</str>
<str name="sourceLocation">spellings.txt</str>
<str name="characterEncoding">UTF-8</str>
<str name="spellcheckIndexDir">./spellcheckerFile</str>
</lst>
-->
</searchComponent>

Dieses Setup zeigt zwar eine Reihe verschiedener Möglichkeiten, die Rechtschreibprüfung einzurichten, aber ich werde mich auf die wichtigsten beweglichen Teile konzentrieren. Das erste, was Sie beachten sollten, ist der queryAnalyzerFieldType. Dieser teilt der Rechtschreibprüfung mit, wie die eingehende Abfrage tokenisiert und anderweitig analysiert werden soll, um sie für die Rechtschreibprüfung vorzubereiten. Im Allgemeinen sollte es sich um einen FieldType handeln, der Token erzeugen kann, die mit der Analyse übereinstimmen, die zur Erstellung von Token in Ihrem Rechtschreibindex/-wörterbuch verwendet wird. Wenn Sie die Lucene-Rechtschreibprüfung verwenden, sollte sie mit der Analyse des Quellfelds übereinstimmen, das zur Erstellung des Rechtschreibindex verwendet wird (in diesem Fall das Feld „Name“). Beachten Sie auch die Deklarationen der spellCheckers (die <lst> Elemente). In diesem Fall haben wir eine deklarierte Rechtschreibprüfung. Sie basiert auf Lucene (das ist die Standardeinstellung) und wird aus dem Feld „name“ im Schema erstellt. Die anderen Rechtschreibprüfungen sind alle auskommentiert, zeigen aber die verschiedenen verfügbaren Konfigurationsoptionen.

Der zweite Teil der Konfiguration, der am häufigsten zu Problemen führt, ist das Hinzufügen der Suchkomponente zu einem Request Handler. Der Grund dafür ist, dass sie die SpellCheckComponent einem anderen Request Handler als ihrem primären Request Handler für die Suche hinzufügen. Dadurch müssen sie zwei separate Anfragen an Solr stellen, eine für die Suchergebnisse und eine für die Rechtschreibvorschläge. Stattdessen sollte die SpellCheckComponent direkt in den Haupthandler für Suchanfragen eingebunden werden, so dass eine Anfrage an Solr eingespart wird. Die Konfiguration sollte in etwa so aussehen:

<requestHandler name="/myMainRequestHandler" class="solr.SearchHandler" lazy="true">
<lst name="defaults">
<str name="spellcheck.onlyMorePopular">false</str>
<str name="spellcheck.extendedResults">false</str>
<str name="spellcheck.count">1</str>
</lst>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</requestHandler>

Ich kann es nicht oft genug betonen: Die SpellCheckComponent sollte nicht in einem separaten Request Handler platziert werden, der zwei Aufrufe an Solr erfordert, auch wenn das Solr-Tutorial dies zu Demonstrationszwecken tut (siehe den sehr großen Kommentar direkt darüber).

Sobald die Rechtschreibprüfung eingerichtet und Solr in Betrieb ist, können Sie Abfragen an Solr stellen. Wenn Sie die Lucene-Rechtschreibprüfung oder andere verwenden, müssen Sie möglicherweise zunächst den zugrunde liegenden Index erstellen. Siehe http://wiki.apache.org/solr/SpellCheckComponent#spellcheck.build für weitere Informationen.

Bewährte Praktiken

Sobald die Komponente erstellt ist, ist die Verwendung der Rechtschreibprüfung ziemlich einfach. In Ihrer Solr-Anfrage oder als Teil Ihrer Request Handler-Konfiguration müssen Sie die Komponente einschalten (&spellcheck=true) und verschiedene andere Parameter angeben, um ihr mitzuteilen, wie Sie Ihre Ergebnisse haben möchten.

Meiner Erfahrung nach leistet die Rechtschreibprüfung von Haus aus gute Arbeit, aber keine großartige, so dass Sie bereit sein sollten, etwas Zeit für die Optimierung aufzuwenden. Stellen Sie zunächst sicher, dass Sie eine effektive Analyse des Quellinhalts durchführen. Siehe http://wiki.apache.org /solr /SpellCheckComponent #Spell_Checking_Analysis für weitere Informationen. Die wichtigste Erkenntnis ist, dass Ihr Rechtschreibprüfungsfeld keine Dinge wie Stemming usw. durchführen sollte. Vielleicht möchten Sie auch ein wortbasiertes n-Gramm (in der Lucene/Solr-Sprache Shingles genannt) verwenden, damit Sie nicht nur einzelne Wortvorschläge, sondern auch Vorschläge für Phrasen machen können. Als nächstes sollten Sie sich die Zeit nehmen, mit onlyMorePopular, Genauigkeit, benutzerdefinierten Komparatoren, String Distance Measures und anderen Elementen zu arbeiten, um bessere Ergebnisse zu erzielen. Überlegen Sie auch, wie Sie Log-Analysen und anderes Benutzerfeedback in Ihre Rechtschreibprüfung einbeziehen können. Solr bietet zwar keine direkte Analyse, kann diese aber durch dateibasierte Rechtschreibprüfungswörterbücher unterstützen, die Gewichtungen enthalten können.

Beachten Sie auch, dass die aktuelle Collate-Funktionalität in der SpellCheckComponent einige Schwachstellen aufweist, die ihre effektive Nutzung verhindern können. Die Community arbeitet jedoch gerade an einer Lösung für dieses Problem, also behalten Sie SOLR-2010 im Auge.

Schließlich muss ich noch viel über die Rechtschreibprüfung in der Suche lernen. Ich würde mich also über Ihr Feedback freuen, was bei Ihren Anwendungen funktioniert hat und was nicht. Bitte geben Sie uns unten Ihre Tipps, damit wir alle lernen können.

You Might Also Like

KI-Agenten dominieren den Einkauf. Ist Ihre Website auf die KI-gestützte Suche vorbereitet?

Generative KI-Agenten wie ChatGPT definieren die Produktsuche neu. Erfahren Sie, wie Sie...

Read More

Vom Suchunternehmen zum praktischen KI-Pionier: Unsere Vision für 2025 und darüber hinaus

CEO Mike Sinoway gibt Einblicke in die Zukunft der KI und stellt...

Read More

Wenn KI schief geht: Fehlschläge in der realen Welt und wie man sie vermeidet

Lassen Sie nicht zu, dass Ihr KI-Chatbot einen 50.000 Dollar teuren Tahoe...

Read More

Quick Links