Ricerca fuzzy per correggere errori di ortografia e errori di digitazioni

Ricerca di intelligenza artificiale di Azure supporta la ricerca fuzzy, un tipo di query che compensa gli errori di digitazione e i termini con errori di ortografia nella stringa di input. La ricerca fuzzy cerca termini con una composizione simile. L'espansione della ricerca per coprire le corrispondenze vicine ha l'effetto della correzione automatica di un errore di digitazione quando la discrepanza è solo pochi caratteri non posizionati.

Si tratta di un esercizio di espansione della query che produce una corrispondenza in termini con una composizione simile. Quando viene specificata una ricerca fuzzy, il motore di ricerca compila un grafo (basato sulla teoria dell'automatone finito deterministico) di termini composti in modo analogo, per tutti i termini interi nella query. Ad esempio, se la query include tre termini "university of washington", viene creato un grafo per ogni termine nella query search=university~ of~ washington~ (non esiste alcuna rimozione di parole non significative nella ricerca fuzzy, quindi "of" ottiene un grafico).

Il grafico è costituito da fino a 50 espansioni, o permutazioni, di ogni termine, acquisendo sia varianti corrette che non corrette nel processo. Il motore restituisce quindi le corrispondenze più rilevanti nella risposta.

Per un termine come "università", il grafico potrebbe avere "unversty, universty, university, universe, inverse". Tutti i documenti che corrispondono a quelli nel grafico sono inclusi nei risultati. A differenza di altre query che analizzano il testo per gestire forme diverse della stessa parola ("mouse" e "mouse"), i confronti in una query fuzzy vengono eseguiti in corrispondenza del valore del viso senza alcuna analisi linguistica sul testo. "Universo" e "inverso", che sono semanticamente diversi, corrisponderanno perché le discrepanze sintattiche sono piccole.

Una corrispondenza ha esito positivo se le discrepanze sono limitate a due o meno modifiche, in cui una modifica è un carattere inserito, eliminato, sostituito o trasposto. L'algoritmo di correzione stringa che specifica il differenziale è la metrica di distanza Damerau-Levenshtein. Viene descritto come il "numero minimo di operazioni (inserimenti, eliminazioni, sostituzioni o frammenti di due caratteri adiacenti) necessari per modificare una parola nell'altra".

In Ricerca di intelligenza artificiale di Azure:

  • La query fuzzy si applica a termini interi. Le frasi non sono supportate direttamente, ma è possibile specificare una corrispondenza fuzzy per ogni termine di una frase in più parti tramite le costruzioni AND. Ad esempio: search=dr~ AND cleanin~. Questa espressione di query trova corrispondenze nella "pulizia a secco".

  • La distanza predefinita di una modifica è 2. Un valore di ~0 indica nessuna espansione (solo il termine esatto è considerato una corrispondenza), ma è possibile specificare ~1 per un grado di differenza o una modifica.

  • Una query fuzzy può espandere un termine fino a 50 permutazioni. Questo limite non è configurabile, ma è possibile ridurre efficacemente il numero di espansioni riducendo la distanza di modifica a 1.

  • Le risposte sono costituite da documenti contenenti una corrispondenza pertinente (fino a 50).

Durante l'elaborazione delle query, le query fuzzy non vengono sottoposte a analisi lessicali. L'input della query viene aggiunto direttamente all'albero delle query ed espanso per creare un grafico di termini. L'unica trasformazione eseguita è la combinazione di maiuscole e minuscole.

Collettivamente, i grafici vengono inviati come criteri di corrispondenza rispetto ai token nell'indice. Come si può immaginare, la ricerca fuzzy è intrinsecamente più lenta rispetto ad altri moduli di query. Le dimensioni e la complessità dell'indice possono determinare se i vantaggi sono sufficienti per compensare la latenza della risposta.

Nota

Poiché la ricerca fuzzy tende a essere lenta, potrebbe essere utile esaminare alternative come l'indicizzazione n-gram, con la progressione di sequenze di caratteri brevi (due e tre sequenze di caratteri per token bigram e trigrammi). A seconda del linguaggio e della superficie di query, n-gram potrebbe offrire prestazioni migliori. Il compromesso è che l'indicizzazione n-gram è molto intensivo di archiviazione e genera indici molto più grandi.

Un'altra alternativa, che è possibile considerare se si vuole gestire solo i casi più egregio, sarebbe una mappa sinonimo. Ad esempio, il mapping di "search" a "serach, serch, sarch" o "retrieve" in "retreive".

I campi stringa attribuiti come "ricercabili" sono candidati per la ricerca fuzzy.

Gli analizzatori non vengono usati per creare un grafico di espansione, ma ciò non significa che gli analizzatori devono essere ignorati in scenari di ricerca fuzzy. Gli analizzatori sono importanti per la tokenizzazione durante l'indicizzazione, in cui i token negli indici invertiti vengono usati per la corrispondenza con il grafico.

Come sempre, se le query di test non producono le corrispondenze previste, sperimentare con analizzatori di indicizzazione diversi. Ad esempio, provare un analizzatore del linguaggio per verificare se si ottengono risultati migliori. Alcuni linguaggi, in particolare quelli con mutazioni vocaliche, possono trarre vantaggio dalla flesso e dalle forme irregolari delle parole generate dai processori del linguaggio naturale Microsoft. In alcuni casi, l'uso dell'analizzatore del linguaggio corretto può fare la differenza se un termine viene tokenizzato in modo compatibile con il valore fornito dall'utente.

Le query fuzzy vengono costruite usando la sintassi di query Lucene completa, richiamando il parser di query Lucene completo e aggiungendo un carattere ~ tilde dopo ogni termine intero immesso dall'utente.

Di seguito è riportato un esempio di richiesta di query che richiama la ricerca fuzzy. Include quattro termini, due dei quali sono digitati in modo non corretto:

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. Impostare il tipo di query sulla sintassi Lucene completa (queryType=full).

  2. Specificare la stringa di query in cui ogni termine è seguito da un operatore tilde (~) alla fine di ogni termine intero (search=<string>~). Viene creato un grafico di espansione per ogni termine nell'input della query.

    Includere un parametro facoltativo, un numero compreso tra 0 e 2 (impostazione predefinita), se si desidera specificare la distanza di modifica (~1). Ad esempio, "blue~" o "blue~1" restituirà "blue", "blues" e "glue".

Facoltativamente, è possibile migliorare le prestazioni delle query definendo l'ambito della richiesta a campi specifici. Usare il searchFields parametro per specificare i campi da cercare. È anche possibile usare la select proprietà per specificare i campi restituiti nella risposta alla query.

Per eseguire test semplici, è consigliabile esplora ricerche o un client REST per eseguire l'iterazione su un'espressione di query. Entrambi gli strumenti sono interattivi, il che significa che è possibile eseguire rapidamente più varianti di un termine e valutare le risposte che tornano.

Quando i risultati sono ambigui, l'evidenziazione dei risultati consente di identificare la corrispondenza nella risposta.

Nota

L'uso dell'evidenziazione dei risultati per identificare le corrispondenze fuzzy presenta limitazioni e funziona solo per la ricerca fuzzy di base. Se l'indice ha profili di punteggio o se si esegue il layer della query con una maggiore sintassi, l'evidenziazione dei risultati potrebbe non riuscire a identificare la corrispondenza.

Esempio 1: ricerca fuzzy con il termine esatto

Si supponga che la stringa seguente esista in un "Description" campo di un documento di ricerca: "Test queries with special characters, plus strings for MSFT, SQL and Java."

Iniziare con una ricerca fuzzy su "speciale" e aggiungere l'evidenziazione dei risultati al campo Descrizione:

search=special~&highlight=Description

Nella risposta, poiché è stata aggiunta l'evidenziazione dei risultati, la formattazione viene applicata a "speciale" come termine corrispondente.

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

Riprovare la richiesta, digitando "speciale" digitando diverse lettere ("pe"):

search=scial~&highlight=Description

Finora, nessuna modifica alla risposta. Dato il valore predefinito di 2 gradi di distanza, la rimozione di due caratteri "pe" da "speciale" consente comunque una corrispondenza con esito positivo su tale termine.

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

Provando un'altra richiesta, modificare ulteriormente il termine di ricerca rimuovendo un ultimo carattere per un totale di tre eliminazioni (da "speciale" a "scal"):

search=scal~&highlight=Description

Si noti che viene restituita la stessa risposta, ma ora anziché la corrispondenza in "speciale", la corrispondenza fuzzy è in "SQL".

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

Il punto di questo esempio espanso consiste nell'illustrare la chiarezza che l'evidenziazione dei risultati può portare a risultati ambigui. In tutti i casi, viene restituito lo stesso documento. Se si è basato sugli ID documento per verificare una corrispondenza, è possibile che si sia perso il passaggio da "speciale" a "SQL".

Vedi anche