Fuzzysuche zum Korrigieren von Rechtschreibfehlern und Tippfehlern

Azure KI Search unterstützt die Fuzzysuche, eine Art von Abfrage, bei der Tippfehler und falsch geschriebene Begriffe in der Eingabezeichenfolge ausgeglichen werden. Die Fuzzysuche sucht nach Begriffen mit einer ähnlichen Zusammensetzung. Eine Ausweitung der Suche auf Beinahe-Übereinstimmungen hat den Effekt, dass ein Tippfehler automatisch korrigiert wird, wenn es sich bei dem Unterschied nur um ein paar falsch gesetzte Zeichen handelt.

Es handelt sich um eine Abfrageerweiterung, die Treffer für Begriffe mit ähnlicher Zusammensetzung liefert. Bei einer Fuzzysuche erstellt die Suchmaschine (basierend auf der Theorie deterministischer endlicher Automaten) ein Diagramm aus ähnlich zusammengesetzten Begriffen für alle ganzen Begriffe in der Abfrage. Wenn Ihre Abfrage beispielsweise die drei Begriffe "university of washington" enthält, wird für jeden Begriff in der Abfrage search=university~ of~ washington~ ein Diagramm erstellt (bei der Fuzzysuche werden Stoppwörter nicht entfernt, d. h. "of" erhält ein Diagramm).

Das Diagramm umfasst bis zu 50 Erweiterungen oder Permutationen für jeden Begriff und erfasst sowohl richtige als auch falsche Varianten. Die Engine gibt anschließend in der Antwort die Treffer mit der höchsten Relevanz zurück.

Für einen Begriff wie „university“ enthält das Diagramm u. U. "unversty, universty, university, universe, inverse". Jedes Dokument, das eine Übereinstimmung mit den Begriffen in diesem Diagramm aufweist, wird in die Ergebnisse eingeschlossen. Im Gegensatz zu anderen Abfragen, bei denen der Text analysiert wird, um verschiedene Formen desselben Worts zu verarbeiten („Mäuse“ und „Maus“), erfolgen die Vergleiche in einer Fuzzyabfrage ohne linguistische Analyse des Textes. „Universe“ und „inverse“, die sich semantisch unterscheiden, führen beide zu einer Übereinstimmung, weil die syntaktischen Unterschiede gering sind.

Eine Übereinstimmung liegt dann vor, wenn die Abweichungen auf zwei oder weniger Bearbeitungen beschränkt sind, wobei eine Bearbeitung ein eingefügtes, gelöschtes, ersetztes oder vertauschtes Zeichen sein kann. Der Zeichenfolgenkorrekturalgorithmus, der den Unterschied angibt, ist die Damerau-Levenshtein-Abstandsmetrik. Diese wird beschrieben als die „minimale Anzahl von Vorgängen (Einfügung, Löschung, Ersetzung oder Transposition von zwei benachbarten Zeichen), die erforderlich ist, um ein Wort in ein anderes umwandeln zu können“.

In Azure KI Search:

  • Die Fuzzy-Abfrage gilt für ganze Ausdrücke. Ausdrücke werden nicht direkt unterstützt, aber Sie können für jeden Ausdruck eines mehrteiligen Ausdrucks mithilfe von AND-Konstruktionen eine Fuzzy-Übereinstimmung angeben. Beispiel: search=dr~ AND cleanin~. Dieser Abfrageausdruck findet Übereinstimmungen bei „Trockenreinigung“.

  • Die Standarddistanz einer Bearbeitung beträgt 2. Der Wert ~0 steht für keine Erweiterung (es wird nur der genaue Begriff als Übereinstimmung betrachtet), aber Sie könnten ~1 für eine einzelne Abweichung oder Bearbeitung angeben.

  • Eine Fuzzysuche kann einen Begriff um bis zu 50 Permutationen erweitern. Dieses Limit ist nicht konfigurierbar, aber Sie können die Anzahl von Erweiterungen effizient senken, indem Sie die Bearbeitungsdistanz auf 1 verringern.

  • Antworten umfassen Dokumente, die eine relevante Übereinstimmung enthalten (bis zu 50).

Während der Abfrageverarbeitung erfolgt keine lexikalische Analyse der Fuzzyabfrage. Die Abfrageeingabe wird direkt zur Abfragestruktur hinzugefügt und zur Erstellung eines Diagramms aus Begriffen erweitert. Die einzige Transformation, die durchgeführt wird, ist eine Umwandlung in Kleinbuchstaben.

Gemeinsam werden die Diagramme als Abgleichkriterium für die Token im Index übermittelt. Wie Sie sich vorstellen können, ist eine Fuzzysuche erheblich langsamer als andere Abfrageformen. Die Größe und Komplexität Ihres Index kann bestimmen, ob die Vorteile gegenüber der zeitlichen Verzögerung der Antwort überwiegen.

Hinweis

Da die Fuzzysuche tendenziell langsam ist, könnte es sich lohnen, Alternativen wie die N-Gramm-Indizierung mit Progression kurzer Zeichenfolgen (Sequenzen aus zwei und drei Zeichen für Bigramm- und Trigramm-Token) zu untersuchen. Je nach Sprache und Abfragebenutzeroberfläche erzielen Sie über ein N-Gramm möglicherweise eine bessere Leistung. Der Nachteil der N-Gramm-Indizierung liegt darin, dass sie sehr speicherintensiv ist und deutlich größere Indizes erzeugt.

Wenn Sie lediglich die gröbsten Fehler behandeln möchten, wäre eine weitere mögliche Alternative eine Synonymzuordnung. Beispielsweise kann „search“ zu „serach“, „serch“, „sarch“ oder „retrieve“ zu „retreive“ zugeordnet werden.

Zeichenfolgenfelder, die als „suchbar“ zugewiesen werden, sind Kandidaten für die Fuzzysuche.

Zur Erstellung eines Erweiterungsdiagramms werden keine Analysefunktionen verwendet, aber das bedeutet nicht, dass solche Funktionen in Szenarien für die Fuzzysuche ignoriert werden sollten. Analysetools sind wichtig für die Tokenisierung während der Indizierung, bei der die Token in den invertierten Indizes für den Abgleich mit dem Graphen verwendet werden.

Wie immer, wenn Testabfragen die erwarteten Übereinstimmungen nicht produzieren, experimentieren Sie mit verschiedenen Indizierungsanalysetools. Probieren Sie beispielsweise ein Sprachanalysetool aus, um zu sehen, ob Sie bessere Ergebnisse erhalten. Einige Sprachen, insbesondere solche mit Vokalwechsel, können von der Flexion und den unregelmäßigen Wortformen profitieren, die von den natürlichen Sprachprozessoren von Microsoft erzeugt werden. In einigen Fällen kann die Verwendung der richtigen Sprachanalysefunktion einen Unterschied in Bezug darauf machen, ob ein Begriff in einer Weise mit einem Token versehen wird, die mit dem vom Benutzer bereitgestellten Wert kompatibel ist.

Fuzzyabfragen werden unter Verwendung der vollständigen Lucene-Abfragesyntax erstellt, wobei der vollständige Lucene-Abfrageparser aufgerufen wird und nach jedem vom Benutzer eingegebenen vollständigen Begriff eine Tilde ~ angehängt wird.

Hier finden Sie ein Beispiel für eine Abfrageanforderung, die die Fuzzysuche aufruft. Es umfasst vier Ausdrücke, von denen zwei falsch geschrieben sind:

POST https://[service name].search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
    "search": "seatle~ waterfront~ view~ hotle~",
    "queryType": "full",
    "searchMode": "any",
    "searchFields": "HotelName, Description",
    "select": "HotelName, Description, Address/City,",
    "count": "true"
}
  1. Legen Sie den Abfragetyp auf die vollständige Lucene-Syntax (queryType=full) fest.

  2. Geben Sie die Abfragezeichenfolge an, bei der auf jeden Ausdruck eine Tilde (~) am Ende jedes ganzen Ausdrucks (search=<string>~) folgt. Es wird für jeden Ausdruck in der Abfrageeingabe ein Erweiterungsdiagramm erstellt.

    Schließen Sie einen optionalen Parameter – standardmäßig eine Zahl zwischen 0 und 2 – ein, wenn Sie die Bearbeitungsdistanz angeben möchten (~1). Beispielsweise würden bei „blue~“ oder „blue~1“ die Werte „blue“, „blues“ und „glue“ zurückgegeben.

Optional können Sie die Abfrageleistung verbessern, indem Sie die Anforderung auf bestimmte Felder festlegen. Verwenden Sie den Parameter searchFields, um anzugeben, welche Felder durchsucht werden sollen. Sie können auch die Eigenschaft select verwenden, um anzugeben, welche Felder in der Abfrageantwort zurückgegeben werden.

Für einfache Tests empfehlen wir Suchexplorer oder REST client für die Iteration über einen Abfrageausdruck. Beide Tools sind interaktiv, d. h. Sie können schnell die verschiedenen Varianten eines Begriffs durchlaufen und die zurückgegebenen Antworten auswerten.

Wenn die Ergebnisse nicht eindeutig sind, können Sie mithilfe der Trefferhervorhebung die Übereinstimmung in der Antwort identifizieren.

Hinweis

Die Verwendung der Trefferhervorhebung zum Identifizieren von Fuzzyübereinstimmungen ist beschränkt und funktioniert nur für die grundlegende Fuzzysuche. Wenn Ihr Index Bewertungsprofile umfasst oder wenn Sie eine weitere Syntaxebene für die Abfrage einfügen, kann die Übereinstimmung bei der Trefferhervorhebung möglicherweise nicht identifiziert werden.

Beispiel 1: Fuzzysuche mit dem genauen Begriff

Angenommen, die folgende Zeichenfolge ist in einem "Description"-Feld eines Suchdokuments enthalten: "Test queries with special characters, plus strings for MSFT, SQL and Java."

Beginnen Sie mit einer Fuzzysuche nach „special“, und fügen Sie die Trefferhervorhebung für das Feld „Description“ hinzu:

search=special~&highlight=Description

In der Antwort wird auf „special“ als Überstimmung eine Formatierung angewendet, weil Sie die Trefferhervorhebung hinzugefügt haben.

"@search.highlights": {
    "Description": [
        "Test queries with <em>special</em> characters, plus strings for MSFT, SQL and Java."
    ]
}

Führen Sie die Abfrage erneut aus, und schreiben Sie „special“ falsch, indem Sie mehrere Buchstaben weglassen ("pe"):

search=scial~&highlight=Description

Bisher keine Änderung in der Antwort. Bei einer Distanz von 2 durch das Weglassen von zwei Zeichen ("pe") in „special“ wird weiterhin eine Übereinstimmung für den Begriff angezeigt.

"@search.highlights": {
    "Description": [
        "Test queries with <em>special</em> characters, plus strings for MSFT, SQL and Java."
    ]
}

Ändern Sie den Suchbegriff in einer weiteren Abfrage ab, indem Sie das letzte Zeichen löschen ("scal" anstelle von „special“). Damit wurden drei Löschungen vorgenommen:

search=scal~&highlight=Description

Beachten Sie, dass weiterhin dieselbe Antwort zurückgegeben wird, aber anstelle eines Treffers für „special“ lautet der Treffer jetzt „SQL“.

"@search.score": 0.4232868,
"@search.highlights": {
    "Description": [
        "Mix of special characters, plus strings for MSFT, <em>SQL</em>, 2019, Linux, Java."
    ]
}

Dieses erweiterte Beispiel soll verdeutlichen, dass die Trefferhervorhebung bei mehrdeutigen Ergebnissen zu mehr Klarheit führen kann. In allen Fällen wird dasselbe Dokument zurückgegeben. Hätten Sie sich bei der Überprüfung der Übereinstimmung auf die Dokument-IDs verlassen, hätten Sie vielleicht den Wechsel von „special“ zu „SQL“ nicht bemerkt.

Siehe auch