Pesquisa difusa para corrigir erros ortográficos e erros ortográficos

O Azure AI Search dá suporte à pesquisa difusa, um tipo de consulta que compensa erros de digitação e termos com erros ortográficos na cadeia de caracteres de entrada. A pesquisa difusa procura termos com uma composição semelhante. Expandir a pesquisa para cobrir correspondências próximas tem o efeito de corrigir automaticamente um erro de digitação quando a discrepância é apenas alguns caracteres mal colocados.

É um exercício de expansão de consulta que produz uma correspondência em termos com uma composição semelhante. Quando uma pesquisa difusa é especificada, o mecanismo de busca constrói um gráfico (baseado na teoria determinística de autômatos finitos) de termos compostos de forma semelhante, para todos os termos inteiros na consulta. Por exemplo, se sua consulta incluir três termos "university of washington", um gráfico será criado para cada termo na consulta search=university~ of~ washington~ (não há remoção de palavras paradas na pesquisa difusa, portanto "of" , obterá um gráfico).

O gráfico consiste em até 50 expansões, ou permutações, de cada termo, capturando variantes corretas e incorretas no processo. Em seguida, o mecanismo retorna as correspondências mais relevantes na resposta.

Para um termo como "universidade", o gráfico pode ter "unversty, universty, university, universe, inverse". Todos os documentos que correspondem aos do gráfico são incluídos nos resultados. Em contraste com outras consultas que analisam o texto para lidar com diferentes formas da mesma palavra ("mouse" e "mouse"), as comparações em uma consulta difusa são tomadas pelo valor nominal sem qualquer análise linguística sobre o texto. "Universo" e "inverso", que são semanticamente diferentes, combinarão porque as discrepâncias sintáticas são pequenas.

Uma correspondência será bem-sucedida se as discrepâncias forem limitadas a duas ou menos edições, em que uma edição é um caractere inserido, excluído, substituído ou transposto. O algoritmo de correção de cadeia de caracteres que especifica o diferencial é a métrica de distância Damerau-Levenshtein. É descrito como o "número mínimo de operações (inserções, supressões, substituições ou transposições de dois caracteres adjacentes) necessárias para mudar uma palavra para a outra".

Na Pesquisa de IA do Azure:

  • A consulta difusa aplica-se a termos inteiros. As frases não são suportadas diretamente, mas você pode especificar uma correspondência difusa em cada termo de uma frase com várias partes por meio de construções AND. Por exemplo, search=dr~ AND cleanin~. Esta expressão de consulta encontra correspondências em "limpeza a seco".

  • A distância padrão de uma edição é 2. Um valor de ~0 significa que não há expansão (apenas o termo exato é considerado uma correspondência), mas você pode especificar ~1 para um grau de diferença ou uma edição.

  • Uma consulta difusa pode expandir um termo até 50 permutações. Esse limite não é configurável, mas você pode efetivamente reduzir o número de expansões diminuindo a distância de edição para 1.

  • As respostas consistem em documentos que contêm uma correspondência relevante (até 50).

Durante o processamento de consultas, as consultas difusas, não passam por análise lexical. A entrada de consulta é adicionada diretamente à árvore de consulta e expandida para criar um gráfico de termos. A única transformação realizada é o invólucro inferior.

Coletivamente, os gráficos são enviados como critérios de correspondência contra tokens no índice. Como você pode imaginar, a pesquisa difusa é inerentemente mais lenta do que outros formulários de consulta. O tamanho e a complexidade do índice podem determinar se os benefícios são suficientes para compensar a latência da resposta.

Nota

Como a pesquisa difusa tende a ser lenta, pode valer a pena investigar alternativas como a indexação de n-gramas, com sua progressão de sequências curtas de caracteres (duas e três sequências de caracteres para tokens bigram e trigram). Dependendo do idioma e da superfície de consulta, o n-grama pode oferecer um melhor desempenho. A contrapartida é que a indexação de n-gramas é muito intensiva em armazenamento e gera índices muito maiores.

Outra alternativa, que você poderia considerar se quiser lidar apenas com os casos mais flagrantes, seria um mapa de sinônimos. Por exemplo, mapear "search" para "serach, serch, sarch" ou "retrieve" para "retreive".

Os campos de cadeia de caracteres atribuídos como "pesquisáveis" são candidatos à pesquisa difusa.

Os analisadores não são usados para criar um gráfico de expansão, mas isso não significa que os analisadores devam ser ignorados em cenários de pesquisa difusa. Os analisadores são importantes para a tokenização durante a indexação, onde os tokens nos índices invertidos são usados para correspondência com o gráfico.

Como sempre, se as consultas de teste não estiverem produzindo as correspondências esperadas, experimente diferentes analisadores de indexação. Por exemplo, tente um analisador de linguagem para ver se obtém melhores resultados. Algumas línguas, particularmente aquelas com mutações vocálicas, podem se beneficiar da flexão e das formas irregulares de palavras geradas pelos processadores de linguagem natural da Microsoft. Em alguns casos, usar o analisador de linguagem certo pode fazer a diferença se um termo é tokenizado de uma forma compatível com o valor fornecido pelo usuário.

As consultas difusas são construídas usando a sintaxe de consulta Lucene completa, invocando o analisador de consulta Lucene completo e anexando um caractere ~ til após cada termo inteiro inserido pelo usuário.

Aqui está um exemplo de uma solicitação de consulta que invoca a pesquisa difusa. Inclui quatro termos, dois dos quais estão grafados incorretamente:

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. Defina o tipo de consulta para a sintaxe Lucene completa (queryType=full).

  2. Forneça a cadeia de caracteres de consulta onde cada termo é seguido por um operador til (~) no final de cada termo inteiro (search=<string>~). Um gráfico de expansão é criado para cada termo na entrada de consulta.

    Inclua um parâmetro opcional, um número entre 0 e 2 (padrão), se quiser especificar a distância de edição (~1). Por exemplo, "blue~" ou "blue~1" retornaria "blue", "blues" e "glue".

Opcionalmente, você pode melhorar o desempenho da consulta definindo o escopo da solicitação para campos específicos. Use o searchFields parâmetro para especificar quais campos pesquisar. Você também pode usar a select propriedade para especificar quais campos são retornados na resposta da consulta.

Para testes simples, recomendamos o explorador de pesquisa ou um cliente REST para iterar sobre uma expressão de consulta. Ambas as ferramentas são interativas, o que significa que você pode passar rapidamente por várias variantes de um termo e avaliar as respostas que voltam.

Quando os resultados são ambíguos, o realce de cliques pode ajudá-lo a identificar a correspondência na resposta.

Nota

O uso de realce de hit para identificar correspondências difusas, tem limitações e só funciona para pesquisa difusa básica. Se o seu índice tiver perfis de pontuação, ou se você sobrepor a consulta com mais sintaxe, o realce de clique pode não conseguir identificar a correspondência.

Exemplo 1: pesquisa difusa com o termo exato

Suponha que a seguinte cadeia de caracteres existe em um "Description" campo em um documento de pesquisa: "Test queries with special characters, plus strings for MSFT, SQL and Java."

Comece com uma pesquisa difusa em "especial" e adicione o realce de hit ao campo Descrição:

search=special~&highlight=Description

Na resposta, como você adicionou o realce de cliques, a formatação é aplicada a "especial" como o termo correspondente.

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

Tente o pedido novamente, digitando incorretamente "especial" retirando várias letras ("pe"):

search=scial~&highlight=Description

Até agora, nenhuma alteração na resposta. Dado o padrão de distância de 2 graus, remover dois caracteres "pe" de "especial" ainda permite uma correspondência bem-sucedida nesse termo.

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

Tentando mais uma solicitação, modifique ainda mais o termo de pesquisa retirando um último caractere para um total de três exclusões (de "especial" para "scal"):

search=scal~&highlight=Description

Observe que a mesma resposta é retornada, mas agora em vez de corresponder em "especial", a correspondência difusa está em "SQL".

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

O objetivo deste exemplo expandido é ilustrar a clareza que o realce de acertos pode trazer a resultados ambíguos. Em todos os casos, o mesmo documento é devolvido. Se você tivesse confiado em IDs de documento para verificar uma correspondência, talvez tivesse perdido a mudança de "especial" para "SQL".

Consulte também