Pesquisa difusa para corrigir erros ortográficos e erros digitais

Azure Cognitive Search suporta pesquisa difusa, um tipo de consulta que compensa erros digitais e termos escritos incorretamente na cadeia de entrada. Fá-lo ao analisar termos com uma composição semelhante. Expandir a pesquisa para cobrir quase correspondências tem o efeito de corrigir automaticamente um erro de digitação quando a discrepância é apenas alguns carateres incorridos.

É um exercício de expansão de consultas que produz uma correspondência em termos com uma composição semelhante. Quando é especificada uma pesquisa difusa, o motor de busca cria um gráfico (com base na teoria determinista do autómato finito) de termos igualmente compostos, para todos os termos na consulta. Por exemplo, se a consulta incluir três termos "universidade de washington", é criado um gráfico para cada termo na consulta search=university~ of~ washington~ (não há remoção de palavras paradas na pesquisa difusa, pelo que "de" obtém 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 motor devolve 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 correspondam aos documentos no gráfico são incluídos nos resultados. Em contraste com outras consultas que analisam o texto para processar diferentes formas da mesma palavra ("ratos" e "rato"), as comparações numa consulta difusa são feitas pelo valor facial sem qualquer análise linguística no texto. "Universo" e "inverso", que são semanticamente diferentes, corresponderão porque as discrepâncias sintácticas são pequenas.

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

No Azure Cognitive Search:

  • A consulta difusa aplica-se a termos inteiros, mas pode suportar expressões através de construções E. Por exemplo, "Unviersty~ of~ "Wshington~" corresponderia em "Universidade de Washington".

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

  • Uma consulta difusa pode expandir um termo até 50 permutações. Este limite não é configurável, mas pode reduzir eficazmente o número de expansões ao diminuir 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 são submetidas a análise lexical. A entrada da consulta é adicionada diretamente à árvore de consulta e expandida para criar um gráfico de termos. A única transformação efetuada é o invólucro inferior.

Coletivamente, os gráficos são submetidos como critérios de correspondência em relação a tokens no índice. Como 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

Uma vez que a pesquisa difusa tende a ser lenta, pode valer a pena investigar alternativas como a indexação de n-gramas, com a progressão de sequências de carateres curtos (sequências de dois e três carateres para tokens bigram e trigrama). Consoante o idioma e a superfície de consulta, n-gram poderá proporcionar-lhe um melhor desempenho. A contrapartida é que a indexação de n-gramas é muito intensiva em termos de armazenamento e gera índices muito maiores.

Outra alternativa, que poderia considerar se quisesse 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 atribuídos como "pesquisáveis" são candidatos para pesquisa difusa.

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

Como sempre, se as consultas de teste não estiverem a produzir as correspondências esperadas, experimente diferentes analisadores de indexação. Por exemplo, experimente um analisador de idiomas para ver se obtém melhores resultados. Algumas linguagens, particularmente as que têm mutações vogais, podem beneficiar da inflexão e das formas de palavras irregulares geradas pelos processadores de linguagem natural Microsoft. Em alguns casos, utilizar o analisador de idioma correto pode fazer a diferença em saber se um termo é tokenizado de uma forma compatível com o valor fornecido pelo utilizador.

As consultas difusas são construídas com a sintaxe de consulta Lucene completa, invocando o analisador de consulta Lucene completo e anexando um caráter ~ de til após cada termo inteiro introduzido pelo utilizador.

Eis um exemplo de um pedido de consulta que invoca a pesquisa difusa. Inclui quatro termos, dois dos quais com erros ortográficos:

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

  2. Indique a cadeia de consulta em que cada termo é seguido por um operador de til (~) no final de cada termo inteiro (search=<string>~). Será criado um gráfico de expansão para cada termo na entrada da consulta.

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

Opcionalmente, pode melhorar o desempenho das consultas ao analisar o pedido para campos específicos. Utilize o searchFields parâmetro para especificar os campos a procurar. Também pode utilizar a select propriedade para especificar que campos são devolvidos na resposta da consulta.

Para testes simples, recomendamos o Explorador de pesquisas ou o Postman para iterar através de uma expressão de consulta. Ambas as ferramentas são interativas, o que significa que pode percorrer rapidamente várias variantes de um termo e avaliar as respostas que voltam.

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

Nota

A utilização do realce de impacto para identificar correspondências difusas tem limitações e só funciona para a pesquisa difusa básica. Se o índice tiver perfis de classificação ou se colocar a consulta em camadas com mais sintaxe, o realce de impacto poderá não conseguir identificar a correspondência.

Exemplo 1: pesquisa difusa com o termo exato

Suponha que a seguinte cadeia existe num "Description" campo num 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 impacto ao campo Descrição:

search=special~&highlight=Description

Na resposta, uma vez que adicionou o realce de acesso, 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, escrevendo incorretamente "especial" ao eliminar várias letras ("pe"):

search=scial~&highlight=Description

Até agora, nenhuma alteração à resposta. Com a predefinição de 2 graus de distância, remover dois carateres "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."
    ]

Ao experimentar mais um pedido, modifique ainda mais o termo de pesquisa ao eliminar um último caráter para um total de três eliminações (de "especial" a "dimensionar"):

search=scal~&highlight=Description

Repare que a mesma resposta é devolvida, 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 impacto pode trazer a resultados ambíguos. Em todos os casos, é devolvido o mesmo documento. Se tivesse confiado em IDs de documento para verificar uma correspondência, poderia ter perdido a mudança de "especial" para "SQL".

Ver também