Ricerca fuzzy per correggere errori e errori di digitazioni

Ricerca cognitiva di Azure supporta la ricerca fuzzy, un tipo di query che compensa i termini di digitazione e errori nella stringa di input. Questa operazione viene eseguita analizzando i termini che hanno una composizione simile. L'espansione della ricerca per coprire le corrispondenze vicino ha l'effetto della correzione automatica di un errore di digitazione quando la discrepanza è solo alcuni 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 grafico (in base alla teoria dell'automazione finistica deterministica) di termini composti in modo analogo, per tutti i termini interi della query. Ad esempio, se la query include tre termini "università di washington", viene creato un grafico per ogni termine nella query search=university~ of~ washington~ (non è presente alcuna rimozione di parole stop nella ricerca fuzzy, quindi "of" ottiene un grafico).

Il grafico è costituito da fino a 50 espansioni o permutazioni, di ogni termine, catturando varianti corrette e 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, università, universo, inverso". Tutti i documenti corrispondenti a quelli nel grafico sono inclusi nei risultati. Al contrario di altre query che analizzano il testo per gestire forme diverse della stessa parola ("topi" e "mouse"), i confronti in una query fuzzy vengono presi al valore facciale senza alcuna analisi linguistica sul testo. "Universo" e "inverso", che sono semanticamente diversi, corrisponderanno perché le discrepanze sintattiche sono piccole.

Una corrispondenza riesce 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 . È descritto come "numero minimo di operazioni (inserimenti, eliminazioni, sostituzioni o inseguimenti di due caratteri adiacenti) necessari per modificare una parola nell'altra".

In Ricerca cognitiva di Azure:

  • La query Fuzzy si applica a termini interi, ma è possibile supportare frasi tramite costruzione AND. Ad esempio, "Unviersty~ di~ "Wshington~" corrisponderebbe a "University of Washington".

  • 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 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 in modo efficace 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 subiscono 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 è minuscola.

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 altre forme 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 analizzare alternative come l'indicizzazione n-gram, con la sua 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 potresti considerare se vuoi gestire solo i casi più egregio, sarebbe una mappa sinonimo. Ad esempio, il mapping "search" a "serach, serch, sarch" o "retrieve" in "retreive".

I campi stringa che sono attributi 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 negli scenari di ricerca fuzzy. Gli analizzatori sono importanti per la tokenizzazione durante l'indicizzazione, in cui i token negli indici inverti 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. Alcune lingue, in particolare quelle con mutazioni vocali, possono trarre vantaggio dalla inflezione e dalle forme di parola irregolari generate dai processori di 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.

Ecco un esempio di una richiesta di query che richiama la ricerca fuzzy. Include quattro termini, due dei quali vengono eliminati:

POST https://[service name].search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2020-06-30
{
    "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 viene seguito da un operatore tilde () alla fine di ogni termine intero (~search=<string>~). Verrà 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 vuole specificare la distanza di modifica (~1). Ad esempio, "blue~" o "blue~1" restituirà "blue", "blues" e "glue".

Facoltativamente, è possibile migliorare le prestazioni delle query con 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 i test semplici, è consigliabile esplora ricerche o Postman per eseguire l'iterazione su un'espressione di query. Entrambi gli strumenti sono interattivi, che significa che è possibile eseguire rapidamente più varianti di un termine e valutare le risposte che tornano.

Quando i risultati sono ambigui, l'evidenziazione può aiutare a identificare la corrispondenza nella risposta.

Nota

L'uso dell'evidenziazione degli hit per identificare le corrispondenze fuzzy ha limitazioni e funziona solo per la ricerca fuzzy di base. Se l'indice ha profili di assegnazione dei punteggi o se si esegue il livello della query con più sintassi, l'evidenziazione potrebbe non riuscire a identificare la corrispondenza.

Esempio 1: ricerca fuzzy con il termine esatto

Si supponga che la stringa seguente esista in un campo in un "Description" 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 colpi al campo Descrizione:

search=special~&highlight=Description

Nella risposta, poiché è stata aggiunta l'evidenziazione dell'hit, 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, sbagliando "speciale" prendendo diverse lettere ("pe"):

search=scial~&highlight=Description

Finora, nessuna modifica alla risposta. Usando il valore predefinito di 2 gradi di distanza, la rimozione di due caratteri "pe" da "speciale" consente comunque una corrispondenza riuscita in quel termine.

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

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

search=scal~&highlight=Description

Si noti che la stessa risposta viene restituita, ma ora invece di corrispondere su "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 può portare a risultati ambigui. In tutti i casi viene restituito lo stesso documento. Se si è basato sugli ID documento per verificare una corrispondenza, potrebbe essere stato perso il passaggio da "speciale" a "SQL".

Vedi anche