Fuzzy zoeken om spelfouten en typfouten te corrigeren

Azure AI Search biedt ondersteuning voor fuzzy zoekopdrachten, een type query waarmee typfouten en verkeerd gespelde termen in de invoertekenreeks worden gecompenseerd. Fuzzy zoeken zoekt naar termen met een vergelijkbare samenstelling. Het uitbreiden van de zoekopdracht voor bijna-overeenkomsten heeft het effect van het autocorrectie van een typefout wanneer de discrepantie slechts een paar verkeerd geplaatste tekens is.

Het is een queryuitbreidingsoefening die een overeenkomst produceert op termen met een vergelijkbare samenstelling. Wanneer een fuzzy zoekopdracht wordt opgegeven, bouwt de zoekmachine een grafiek (op basis van deterministische eindige automatontheorie) van vergelijkbare samengestelde termen voor alle hele termen in de query. Als uw query bijvoorbeeld drie termen "university of washington"bevat, wordt er een grafiek gemaakt voor elke term in de query search=university~ of~ washington~ (er is geen stopwoordverwijdering in fuzzy zoekopdrachten, dus "of" krijgt u een grafiek).

De grafiek bestaat uit maximaal 50 uitbreidingen, of permutaties, van elke term, waarbij zowel juiste als onjuiste varianten in het proces worden vastgelegd. De engine retourneert vervolgens de meest relevante overeenkomsten in het antwoord.

Voor een term als 'universiteit' heeft "unversty, universty, university, universe, inverse"de grafiek mogelijk . Documenten die overeenkomen met documenten in de grafiek, worden opgenomen in de resultaten. In tegenstelling tot andere query's die de tekst analyseren om verschillende vormen van hetzelfde woord ('muizen' en 'muis' te verwerken), worden de vergelijkingen in een fuzzy query in een gezichtswaarde genomen zonder taalkundige analyse van de tekst. "Universum" en "inverse", die semantisch verschillend zijn, komen overeen omdat de syntactische discrepanties klein zijn.

Een overeenkomst slaagt als de verschillen beperkt zijn tot twee of minder bewerkingen, waarbij een bewerking een ingevoegd, verwijderd, vervangen of getransponeerd teken is. Het algoritme voor tekenreekscorrectie dat het differentieel aangeeft, is de meetwaarde Damerau-Levenshtein afstand . Het wordt beschreven als het 'minimumaantal bewerkingen (invoegingen, verwijderingen, vervangingen of omzettingen van twee aangrenzende tekens) dat nodig is om het ene woord in het andere te wijzigen'.

In Azure AI Search:

  • Fuzzy query is van toepassing op hele termen. Zinnen worden niet rechtstreeks ondersteund, maar u kunt een fuzzy overeenkomst opgeven voor elke term van een meerdelige woordgroep via AND-constructies. Bijvoorbeeld: search=dr~ AND cleanin~. Deze queryexpressie vindt overeenkomsten op 'dry cleaning'.

  • De standaardafstand van een bewerking is 2. Een waarde van ~0 geeft geen uitbreiding aan (alleen de exacte term wordt beschouwd als een overeenkomst), maar u kunt opgeven ~1 voor één mate van verschil of één bewerking.

  • Een fuzzy query kan een term uitbreiden tot maximaal 50 permutaties. Deze limiet kan niet worden geconfigureerd, maar u kunt het aantal uitbreidingen effectief verminderen door de bewerkingsafstand te verlagen tot 1.

  • Antwoorden bestaan uit documenten met een relevante overeenkomst (maximaal 50).

Tijdens het verwerken van query's ondergaan fuzzy query's geen lexicale analyse. De queryinvoer wordt rechtstreeks toegevoegd aan de querystructuur en uitgebreid om een grafiek met termen te maken. De enige transformatie die wordt uitgevoerd, is kleine behuizing.

Gezamenlijk worden de grafieken verzonden als overeenkomende criteria ten opzichte van tokens in de index. Zoals u zich kunt voorstellen, is fuzzy zoeken inherent langzamer dan andere queryformulieren. De grootte en complexiteit van uw index kunnen bepalen of de voordelen voldoende zijn om de latentie van het antwoord te compenseren.

Notitie

Omdat fuzzy zoekopdrachten meestal traag zijn, is het misschien de moeite waard om alternatieven zoals n-gram indexering te onderzoeken, met de voortgang van korte tekenreeksen (twee en drie tekensreeksen voor bigram- en trigramtokens). Afhankelijk van uw taal en queryoppervlak, kan n-gram u betere prestaties bieden. Het nadeel is dat n-gram indexering zeer opslagintensief is en veel grotere indexen genereert.

Een ander alternatief, dat u kunt overwegen als u alleen de meest egregio's wilt afhandelen, zou een synoniemkaart zijn. Bijvoorbeeld het toewijzen van 'zoeken' aan 'serach, serch, sarch' of 'ophalen' aan 'retreive'.

Tekenreeksvelden die worden toegeschreven als 'doorzoekbaar', zijn kandidaten voor fuzzy zoekopdrachten.

Analyzers worden niet gebruikt om een uitbreidingsgrafiek te maken, maar dat betekent niet dat analyses moeten worden genegeerd in fuzzy zoekscenario's. Analysefuncties zijn belangrijk voor tokenisatie tijdens het indexeren, waarbij tokens in de omgekeerde indexen worden gebruikt voor vergelijking met de grafiek.

Als testquery's niet de verwachte overeenkomsten produceren, kunt u experimenteren met verschillende indexeringsanalyses. Probeer bijvoorbeeld een taalanalyse om te zien of u betere resultaten krijgt. Sommige talen, met name die met klinkers, kunnen profiteren van de verbuigings- en onregelmatige woordvormen die worden gegenereerd door de natuurlijke taalverwerkers van Microsoft. In sommige gevallen kan het gebruik van de juiste taalanalyse een verschil maken in of een term wordt getokeniseerd op een manier die compatibel is met de waarde van de gebruiker.

Fuzzy query's worden samengesteld met behulp van de volledige Lucene-querysyntaxis, het aanroepen van de volledige Lucene-queryparser en het toevoegen van een tilde-teken ~ na elke hele term die door de gebruiker is ingevoerd.

Hier volgt een voorbeeld van een queryaanvraag die fuzzy zoekopdrachten aanroept. Het bevat vier termen, waarvan er twee onjuist zijn gespeld:

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. Stel het querytype in op de volledige Lucene-syntaxis (queryType=full).

  2. Geef de querytekenreeks op waarbij elke term wordt gevolgd door een tilde-operator (~) aan het einde van elke hele term (search=<string>~). Er wordt een uitbreidingsgrafiek gemaakt voor elke term in de query-invoer.

    Neem een optionele parameter op, een getal tussen 0 en 2 (standaard), als u de bewerkingsafstand (~1) wilt opgeven. Bijvoorbeeld: 'blauw~' of 'blauw~1' retourneert 'blauw', 'blues' en 'glue'.

U kunt desgewenst de queryprestaties verbeteren door het bereik van de aanvraag naar specifieke velden te beperken. Gebruik de searchFields parameter om op te geven welke velden u wilt doorzoeken. U kunt de select eigenschap ook gebruiken om op te geven welke velden worden geretourneerd in het queryantwoord.

Voor eenvoudige tests raden we Search Explorer of een REST-client aan om een query-expressie te herhalen. Beide hulpprogramma's zijn interactief, wat betekent dat u snel meerdere varianten van een term kunt doorlopen en de antwoorden kunt evalueren die terugkomen.

Wanneer de resultaten niet eenduidig zijn, kunt u met treffermarkeringen de overeenkomst in het antwoord identificeren.

Notitie

Het gebruik van treffermarkeringen om fuzzy overeenkomsten te identificeren heeft beperkingen en werkt alleen voor eenvoudige fuzzy zoekopdrachten. Als uw index scoreprofielen heeft of als u de query met meer syntaxis in een laag wilt leggen, kan het markeren van treffers mislukken om de overeenkomst te identificeren.

Voorbeeld 1: fuzzy zoeken met de exacte term

Stel dat de volgende tekenreeks bestaat in een "Description" veld in een zoekdocument: "Test queries with special characters, plus strings for MSFT, SQL and Java."

Begin met een fuzzy zoekopdracht op 'speciaal' en voeg treffermarkeringen toe aan het veld Beschrijving:

search=special~&highlight=Description

In het antwoord, omdat u hitmarkeringen hebt toegevoegd, wordt opmaak toegepast op 'speciaal' als overeenkomende term.

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

Probeer de aanvraag opnieuw, waarbij u 'speciaal' verkeerd spelt door meerdere letters uit te halen ("pe"):

search=scial~&highlight=Description

Tot nu toe is er geen wijziging in het antwoord. Gezien de standaardwaarde van 2 graden afstand, zorgt het verwijderen van twee tekens "pe" uit 'speciaal' nog steeds voor een geslaagde overeenkomst op die term.

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

Probeer nog een aanvraag uit, wijzig de zoekterm verder door één laatste teken uit te halen voor een totaal van drie verwijderingen (van 'speciaal' naar "scal"):

search=scal~&highlight=Description

U ziet dat hetzelfde antwoord wordt geretourneerd, maar nu in plaats van te vergelijken op 'speciaal', is de fuzzy overeenkomst op SQL.

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

Het punt van dit uitgevouwen voorbeeld is om de duidelijkheid te illustreren die het markeren van treffers kan leiden tot dubbelzinnige resultaten. In alle gevallen wordt hetzelfde document geretourneerd. Had u op document-id's vertrouwd om een overeenkomst te verifiëren, hebt u mogelijk de verschuiving gemist van 'speciaal' naar 'SQL'.

Zie ook