Wyszukiwanie rozmyte, aby poprawić błędy pisowni i literówki

Usługa Azure AI Search obsługuje wyszukiwanie rozmyte, typ zapytania, które kompensuje literówki i błędnie napisane terminy w ciągu wejściowym. Wyszukiwanie rozmyte skanuje pod kątem terminów o podobnej kompozycji. Rozszerzanie wyszukiwania w celu pokrycia bliskich dopasowań ma wpływ na autokorektę literówki, gdy rozbieżność to tylko kilka zagubionych znaków.

Jest to ćwiczenie rozszerzenia zapytania, które tworzy dopasowanie na terminach o podobnej kompozycji. Po określeniu wyszukiwania rozmytego wyszukiwarka tworzy graf (oparty na deterministycznej teorii automatytów) podobnie złożonych terminów dla wszystkich całych terminów w zapytaniu. Jeśli na przykład zapytanie zawiera trzy terminy "university of washington", graf jest tworzony dla każdego terminu w zapytaniu search=university~ of~ washington~ (nie ma usuwania słów zatrzymanych w wyszukiwaniu rozmytym, więc "of" pobiera graf).

Wykres składa się z maksymalnie 50 rozszerzeń lub permutacji każdego terminu, przechwytując zarówno poprawne, jak i niepoprawne warianty w procesie. Następnie aparat zwraca najbardziej odpowiednie dopasowania w odpowiedzi.

W przypadku terminu takiego jak "uniwersytet" wykres może mieć wartość "unversty, universty, university, universe, inverse". Wszystkie dokumenty pasujące do tych w grafie są uwzględniane w wynikach. W przeciwieństwie do innych zapytań, które analizują tekst pod kątem obsługi różnych form tego samego słowa ("myszy" i "myszy"), porównania w zapytaniu rozmyte są wykonywane na wartości nominalnej bez żadnej analizy językowej tekstu. "Wszechświat" i "odwrotność", które są semantycznie różne, będą zgodne, ponieważ rozbieżności składniowe są małe.

Dopasowanie powiedzie się, jeśli rozbieżności są ograniczone do dwóch lub mniejszej liczby edycji, gdzie edycja jest wstawiony, usunięty, zastąpiony lub transponowany. Algorytm korekty ciągu określający różnicową jest metryka odległości Damerau-Levenshtein. Jest on opisany jako "minimalna liczba operacji (wstawiania, usuwania, podstawień lub transpozycji dwóch sąsiednich znaków) wymaganych do zmiany jednego słowa na drugie".

W usłudze Azure AI Search:

  • Zapytanie rozmyte dotyczy całych terminów. Frazy nie są obsługiwane bezpośrednio, ale można określić dopasowanie rozmyte dla każdego terminu wieloczęściowej frazy za pomocą konstrukcji AND. Na przykład search=dr~ AND cleanin~. To wyrażenie zapytania znajduje dopasowania w przypadku "czyszczenia suchego".

  • Domyślna odległość edycji wynosi 2. Wartość ~0 oznacza brak rozszerzenia (tylko termin jest traktowany jako dopasowanie), ale można określić ~1 dla jednego stopnia różnicy lub jedną edycję.

  • Zapytanie rozmyte może rozszerzyć termin do 50 permutacji. Ten limit nie jest konfigurowalny, ale można skutecznie zmniejszyć liczbę rozszerzeń, zmniejszając odległość edycji do 1.

  • Odpowiedzi składają się z dokumentów zawierających odpowiednie dopasowanie (do 50).

Podczas przetwarzania zapytań zapytania rozmyte zapytania nie są poddawane analizie leksykalnej. Dane wejściowe zapytania są dodawane bezpośrednio do drzewa zapytań i rozwinięte w celu utworzenia grafu terminów. Jedyną wykonywaną transformacją jest niższa wielkość liter.

Zbiorczo wykresy są przesyłane jako kryteria dopasowania względem tokenów w indeksie. Jak można sobie wyobrazić, wyszukiwanie rozmyte jest z natury wolniejsze niż inne formularze zapytań. Rozmiar i złożoność indeksu mogą określić, czy korzyści są wystarczające, aby zrównoważyć opóźnienie odpowiedzi.

Uwaga

Ponieważ wyszukiwanie rozmyte wydaje się być powolne, warto zbadać alternatywy, takie jak indeksowanie n-gramowe, z postępem krótkich sekwencji znaków (dwie i trzy sekwencje znaków dla tokenów bigram i trigramów). W zależności od języka i powierzchni zapytań n-gram może zapewnić lepszą wydajność. Kompromis polega na tym, że indeksowanie n-gramowe jest bardzo intensywnie korzystające z magazynu i generuje znacznie większe indeksy.

Inną alternatywą, którą można rozważyć, jeśli chcesz obsłużyć tylko najbardziej rażące przypadki, byłaby mapa synonimów. Na przykład mapowanie "search" na "serach, serch, sarch" lub "retrieve" na "retreive".

Pola ciągów, które są przypisywane jako "możliwe do wyszukiwania" są kandydatami do wyszukiwania rozmytego.

Analizatory nie są używane do tworzenia grafu rozszerzenia, ale nie oznacza to, że analizatory powinny być ignorowane w scenariuszach wyszukiwania rozmytego. Analizatory są ważne w przypadku tokenizacji podczas indeksowania, gdzie tokeny w odwróconych indeksach są używane do dopasowywania względem grafu.

Tak jak zawsze, jeśli zapytania testowe nie generują oczekiwanych dopasowań, poeksperymentuj z różnymi analizatorami indeksowania. Na przykład spróbuj użyć analizatora języka, aby sprawdzić, czy uzyskasz lepsze wyniki. Niektóre języki, szczególnie te z mutacjami samogłosowymi, mogą korzystać z przegięcia i nieregularnych form słów generowanych przez procesory języka naturalnego firmy Microsoft. W niektórych przypadkach użycie odpowiedniego analizatora języka może mieć wpływ na to, czy termin jest tokenizowany w sposób zgodny z wartością podaną przez użytkownika.

Zapytania rozmyte są konstruowane przy użyciu pełnej składni zapytania Lucene, wywoływania pełnego analizatora zapytań Lucene i dołączania znaku ~ tyldy po każdym całym okresie wprowadzonym przez użytkownika.

Oto przykład żądania zapytania, które wywołuje wyszukiwanie rozmyte. Zawiera cztery terminy, z których dwa są błędnie napisane:

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. Ustaw typ zapytania na pełną składnię Lucene (queryType=full).

  2. Podaj ciąg zapytania, po którym następuje operator tyldy (~) na końcu każdego terminu (search=<string>~). Wykres rozszerzenia jest tworzony dla każdego terminu w danych wejściowych zapytania.

    Dołącz opcjonalny parametr z zakresu od 0 do 2 (wartość domyślna), jeśli chcesz określić odległość edycji (~1). Na przykład "blue~" lub "blue~1" zwróci wartość "blue", "blues" i "klej".

Opcjonalnie możesz poprawić wydajność zapytań, określając zakres żądania do określonych pól. Użyj parametru , searchFields aby określić pola do wyszukania. Możesz również użyć select właściwości , aby określić, które pola są zwracane w odpowiedzi zapytania.

W przypadku prostego testowania zalecamy eksploratora wyszukiwania lub klienta REST na potrzeby iteracji w wyrażeniu zapytania. Oba narzędzia są interaktywne, co oznacza, że można szybko przejść przez wiele wariantów terminu i ocenić odpowiedzi, które wracają.

Gdy wyniki są niejednoznaczne, wyróżnianie trafień może pomóc zidentyfikować dopasowanie w odpowiedzi.

Uwaga

Użycie wyróżniania trafień do identyfikowania dopasowań rozmyte ma ograniczenia i działa tylko w przypadku wyszukiwania rozmytego. Jeśli indeks ma profile oceniania lub jeśli zapytanie jest warstwowe z większą składnią, wyróżnianie trafień może zakończyć się niepowodzeniem w identyfikacji dopasowania.

Przykład 1: wyszukiwanie rozmyte z dokładnym terminem

Załóżmy, że w polu w "Description" dokumencie wyszukiwania istnieje następujący ciąg: "Test queries with special characters, plus strings for MSFT, SQL and Java."

Zacznij od wyszukiwania rozmytego na "specjalne" i dodaj wyróżnienie trafień do pola Opis:

search=special~&highlight=Description

W odpowiedzi, ponieważ dodano wyróżnianie trafień, formatowanie jest stosowane do "specjalne" jako pasującego terminu.

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

Spróbuj ponownie wysłać żądanie, błędnie wpisując "specjalne" przez wyjęcie kilku liter ("pe"):

search=scial~&highlight=Description

Do tej pory nie zmieniaj odpowiedzi. Biorąc pod uwagę domyślną odległość 2 stopni, usunięcie dwóch znaków "pe" ze "specjalnych" nadal umożliwia pomyślne dopasowanie tego terminu.

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

Próbując jeszcze jedno żądanie, dodatkowo zmodyfikuj termin wyszukiwania, usuwając jeden ostatni znak dla całkowitej liczby trzech operacji usuwania (od "specjalne" do "scal"):

search=scal~&highlight=Description

Zwróć uwagę, że ta sama odpowiedź jest zwracana, ale teraz zamiast dopasowywania w przypadku "special", dopasowanie rozmyte znajduje się na "SQL".

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

Celem tego rozszerzonego przykładu jest zilustrowanie jasności, która wyróżnianie trafień może przynieść niejednoznaczne wyniki. We wszystkich przypadkach zwracany jest ten sam dokument. Gdyby polegano na identyfikatorach dokumentów w celu zweryfikowania dopasowania, być może pominięto przejście z "specjalne" na "SQL".

Zobacz też