Sdílet prostřednictvím


Přibližné vyhledávání pro opravu chybných pravopisů a překlepů

Azure AI Search podporuje přibližné vyhledávání, typ dotazu, který kompenzuje překlepy a chybně napsané termíny ve vstupním řetězci. Vyhledávání přibližných shod vyhledá termíny, které mají podobné složení. Rozšíření hledání tak, aby pokrývala téměř shody, má vliv na automatické opravy překlepu, když je nesrovnalosti jen pár chybně umístěných znaků.

Jedná se o cvičení rozšíření dotazu, které vytváří shodu s termíny, které mají podobné složení. Při zadání přibližného vyhledávání vytvoří vyhledávací modul graf (na základě deterministické konečné teorie automatonu) podobně složených termínů pro všechny celé termíny v dotazu. Pokud například váš dotaz obsahuje tři termíny "university of washington", vytvoří se graf pro každý termín v dotazu search=university~ of~ washington~ (v přibližném hledání neexistuje žádné odebrání stop-slovo, takže "of" získá graf).

Graf se skládá z až 50 rozšíření nebo permutací jednotlivých termínů, které zachycují správné i nesprávné varianty v procesu. Modul pak vrátí nejrelevantní shody v odpovědi.

Pro termín jako "univerzita" může graf obsahovat "unversty, universty, university, universe, inverse". Všechny dokumenty, které odpovídají dokumentům v grafu, jsou zahrnuté ve výsledcích. Na rozdíl od jiných dotazů, které analyzují text tak, aby zpracovávaly různé formy stejného slova ("myši" a "myš"), porovnání v přibližných dotazech se zachytávají v nominální hodnotě bez jazykové analýzy textu. "Vesmír" a "inverzní", které jsou sémanticky odlišné, budou odpovídat, protože syntaktické nesrovnalosti jsou malé.

Shoda proběhne úspěšně, pokud jsou nesrovnalosti omezené na dvě nebo méně úprav, kde je úprava vložený, odstraněný, nahrazený nebo transponovaný znak. Algoritmus opravy řetězců, který určuje rozdíl, je metrika vzdálenosti Damerau-Levenshtein. Popisuje se jako "minimální počet operací (vložení, odstranění, nahrazení nebo provedení dvou sousedních znaků) potřebný ke změně jednoho slova na druhé".

Ve službě Azure AI Search:

  • Přibližný dotaz se vztahuje na celé termíny. Fráze nejsou podporované přímo, ale pro každý termín vícedílné fráze prostřednictvím konstrukcí AND můžete určit přibližnou shodu. Například search=dr~ AND cleanin~. Tento výraz dotazu najde shody pro "čištění oděvů".

  • Výchozí vzdálenost úpravy je 2. Hodnota ~0 znaménka neupravuje žádné rozšíření (pouze přesný termín se považuje za shodu), ale můžete zadat ~1 jeden stupeň rozdílu nebo jednu úpravu.

  • Přibližný dotaz může rozšířit termín až o 50 permutací. Tento limit není konfigurovatelný, ale můžete efektivně snížit počet rozšíření snížením vzdálenosti úprav na 1.

  • Odpovědi se skládají z dokumentů obsahujících odpovídající shodu (až 50).

Během zpracování dotazů neprocházejí přibližné dotazy lexikální analýzou. Vstup dotazu se přidá přímo do stromu dotazu a rozbalí se, aby se vytvořil graf termínů. Jedinou provedenou transformací je menší velikost písmen.

Grafy se společně odesílají jako kritéria shody s tokeny v indexu. Jak si můžete představit, přibližné vyhledávání je ze své podstaty pomalejší než jiné formuláře dotazů. Velikost a složitost indexu můžou určit, jestli jsou výhody dostatečné k posunu latence odpovědi.

Poznámka:

Vzhledem k tomu, že přibližné vyhledávání bývá pomalé, může být vhodné prozkoumat alternativy, jako je indexování n-gram, s průběhem krátkých sekvencí znaků (dvě a tři sekvence znaků pro bigram a trigram tokeny). V závislosti na vašem jazyce a povrchu dotazu vám může n-gram poskytnout lepší výkon. Kompromisem je, že indexování n-gram je velmi náročné na úložiště a generuje mnohem větší indexy.

Další alternativou, kterou byste mohli zvážit, kdybyste chtěli zpracovat jen ty nejvýraznější případy, by byla mapa synonym. Například mapování "vyhledávání" na "serach, serch, sarch" nebo "retrieve" na "retreive".

Pole řetězců, která jsou přiřazená jako prohledávatelná, jsou kandidáty pro přibližné vyhledávání.

Analyzátory se nepoužívají k vytvoření rozšiřujícího grafu, ale to neznamená, že by analyzátory měly být ignorovány ve scénářích přibližného vyhledávání. Analyzátory jsou důležité pro tokenizaci během indexování, kde se tokeny v invertovaných indexech používají pro porovnávání s grafem.

Jako vždy platí, že pokud testovací dotazy nevygenerují očekávané shody, experimentujte s různými analyzátory indexování. Zkuste například analyzátor jazyka, abyste zjistili, jestli získáte lepší výsledky. Některé jazyky, zejména jazyky se samohláskami, mohou těžit z inflexní a nepravidelné tvary slov generovaných procesory přirozeného jazyka Microsoftu. V některých případech může použití správného analyzátoru jazyka změnit, jestli je termín tokenizován způsobem, který je kompatibilní s hodnotou poskytnutou uživatelem.

Přibližné dotazy se vytvářejí pomocí úplné syntaxe dotazu Lucene, vyvolání celého analyzátoru dotazů Lucene a přidání znaku ~ tilda za každým celým termínem zadaným uživatelem.

Tady je příklad požadavku na dotaz, který vyvolá přibližné vyhledávání. Obsahuje čtyři termíny, z nichž dva jsou chybně napsané:

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. Nastavte typ dotazu na úplnou syntaxi Lucene (queryType=full).

  2. Zadejte řetězec dotazu, za nímž následuje operátor tilda (~) na konci každého celého termínu (search=<string>~). Rozšiřující graf se vytvoří pro každý termín ve vstupu dotazu.

    Pokud chcete zadat upravit vzdálenost (), uveďte volitelný parametr, číslo od 0 do 2 (~1výchozí). Například "modrá~" nebo "modrá~1" by vrátila "modrá", "blues" a "lepidlo".

Volitelně můžete zvýšit výkon dotazů nastavením požadavku na konkrétní pole. Pomocí parametru searchFields určete, která pole se mají hledat. Pomocí vlastnosti můžete také select určit, která pole se vrátí v odpovědi dotazu.

Pro jednoduché testování doporučujeme průzkumníka služby Search nebo klienta REST pro iteraci výrazu dotazu. Oba nástroje jsou interaktivní, což znamená, že můžete rychle procházet několik variant termínu a vyhodnotit odpovědi, které se vrátí.

Pokud jsou výsledky nejednoznačné, může vám zvýraznění stisknutí klávesy pomoct identifikovat shodu v odpovědi.

Poznámka:

Použití zvýrazňování hitů k identifikaci přibližných shod má omezení a funguje pouze pro základní vyhledávání přibližných shod. Pokud má index bodovací profily nebo pokud dotaz vrstvíte s další syntaxí, může se stát, že se zvýraznění shody nezdaří.

Příklad 1: přibližné hledání s přesným termínem

Předpokládejme, že v poli ve vyhledávacím "Description" dokumentu existuje následující řetězec: "Test queries with special characters, plus strings for MSFT, SQL and Java."

Začněte vyhledáváním přibližných shod a přidejte do pole Popis zvýraznění stisknutím klávesy:

search=special~&highlight=Description

V odpovědi, protože jste přidali zvýraznění hitů, se formátování použije na "zvláštní" jako odpovídající termín.

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

Zkuste požadavek znovu a chybně napsané "speciální" tak, že vyberete několik písmen ("pe"):

search=scial~&highlight=Description

Zatím se žádná změna odpovědi nezměnila. Vzhledem k výchozímu nastavení 2 stupňů vzdálenosti umožňuje odebrání dvou znaků "pe" ze speciálního výrazu stále úspěšnou shodu v daném termínu.

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

Zkuste jeden další požadavek, dále upravte hledaný termín tak, že vyberete jeden poslední znak pro celkem tři odstranění (od "speciálního" do "scal"):

search=scal~&highlight=Description

Všimněte si, že se vrátí stejná odpověď, ale teď místo toho, aby odpovídala "special", přibližná shoda je na "SQL".

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

Cílem tohoto rozšířeného příkladu je ilustrovat srozumitelnost, že zvýraznění hitů může přinést nejednoznačné výsledky. Ve všech případech se vrátí stejný dokument. Pokud jste k ověření shody spoléhali na ID dokumentů, možná jste vynechali posun ze speciálního na "SQL".

Viz také