Como o Google "Você quis dizer?" Algoritmo funciona?

436

Estou desenvolvendo um site interno para uma ferramenta de gerenciamento de portfólio. Há muitos dados de texto, nomes de empresas etc. Fiquei realmente impressionado com a capacidade de alguns mecanismos de pesquisa responderem rapidamente às consultas com "Você quis dizer: xxxx".

Eu preciso ser capaz de responder de maneira inteligente a uma consulta do usuário e responder não apenas aos resultados brutos da pesquisa, mas também com a mensagem "Você quis dizer?" resposta quando houver uma resposta alternativa altamente provável etc.

[Estou desenvolvendo no ASP.NET (VB - não segure contra mim!)]

UPDATE: OK, como imitar isso sem os milhões de 'usuários não pagos'?

  • Gerar erros de digitação para cada termo 'conhecido' ou 'correto' e realizar pesquisas?
  • Algum outro método mais elegante?
Andrew Harry
fonte
1
Aqui está a versão VB.NET do Norvig Spelling Corrector. Você pode achar isso útil se não for tarde demais!
Ralph Wiggum
7
possível duplicata de Como você implementa um "Você quis dizer"?
Kurt McKee
Eu digito em um teclado não qwerty (Colemak) e o recurso não é tão inteligente assim. Ele certamente aprende com os pares de correção de erros registrados e, portanto, é sintonizado em qwerty. Os corretores ortográficos comuns funcionam bem no meu teclado, como esperado - a distância de edição das cordas é invariável no layout.
Coronel Panic

Respostas:

366

Aqui está a explicação diretamente da fonte (quase)

Pesquisa 101!

no min 22:03

Vale a pena assistir!

Basicamente, e de acordo com Douglas Merrill, ex-CTO do Google, é assim:

1) Você escreve uma palavra (incorreta) no google

2) Você não encontra o que queria (não clique em nenhum resultado)

3) Você percebe que digitou incorretamente a palavra e reescreve-a na caixa de pesquisa.

4) Você encontra o que deseja (clique nos primeiros links)

Esse padrão multiplicado milhões de vezes, mostra quais são os erros de ortografia mais comuns e quais são as correções mais "comuns".

Dessa forma, o Google pode quase instantaneamente oferecer correção ortográfica em todos os idiomas.

Isso também significa que, se durante a noite todos começarem a soletrar a noite como "nigth", o Google sugeriria essa palavra.

EDITAR

@ Thomashoutter: Douglas descreve isso como "aprendizado de máquina estatística".

Eles sabem quem corrige a consulta, porque sabem qual consulta vem de qual usuário (usando cookies)

Se os usuários executam uma consulta e apenas 10% dos usuários clicam em um resultado e 90% retornam e digitam outra consulta (com a palavra corrigida) e, dessa vez, que 90% clica em um resultado, eles sabem que encontraram uma correção.

Eles também podem saber se essas são consultas "relacionadas" de duas diferentes, porque possuem informações de todos os links que mostram.

Além disso, agora eles estão incluindo o contexto na verificação ortográfica, para que possam sugerir palavras diferentes, dependendo do contexto.

Veja esta demonstração do Google Wave (@ 44m 06s) que mostra como o contexto é levado em consideração para corrigir automaticamente a ortografia.

Aqui é explicado como esse processamento de linguagem natural funciona.

E finalmente, aqui está uma demonstração impressionante do que pode ser feito adicionando tradução automática (@ 1h 12m 47s) à mistura.

Adicionei âncoras de minutos e segundos aos vídeos para pular diretamente para o conteúdo. Se eles não funcionarem, tente recarregar a página ou rolar manualmente até a marca.

OscarRyz
fonte
Como o algoritmo funciona? Como o Google passa de "Recebemos bilhões de pesquisas com vários termos, e essas são as pesquisas" para "este termo deve, portanto, ser um erro de ortografia comum desse termo"? Eles resolveram esse problema, mas estou interessado em como. Como eles descobrem que duas pesquisas são do mesmo usuário e qual palavra é uma 'correção' de outra, e como elas agregam isso em bilhões de pesquisas?
thomasrutter
51
Se todo mundo começasse a escrever incorretamente "noite" ... acredito que eles já se depararam com pessoas que pesquisavam "Flickr".
Max Lybbert
42
o problema com todos com erros de ortografia já aconteceu em um sentido muito mais grave: tente digitar 'fuscia' no Google. O Google diz "Você quis dizer fuschia?" A grafia correta, de fato, é "fúcsia", mas ninguém pode escrevê-la corretamente por algum motivo. O problema é ainda pior no Dictionary.com; se você digitar "fuschia" em sua pesquisa, ele fornecerá "Nenhum resultado para fuschia. Você quis dizer 'fuschia'?" (ou seja, que você quis dizer o que você acabou de digitar?)
Daisy Sophia Hollman
8
Eu não acredito que eles usem apenas dados com erros de ortografia - definitivamente há alguma distância de Levenshtein ou algo parecido - procure por 'Plack' (e uma ou mais outras palavras) e sempre é corrigido para 'preto', o que é um erro de ortografia muito improvável / typo
plusplus 25/03
4
@ Jakub Eu acho que eles resolveram o problema desde que eu fiz esse comentário há mais de 4 anos. De fato, o Google também resolveu o problema. Uma pesquisa por fuschia inclui resultados para fúcsia automaticamente.
Daisy Sophia Hollman
104

Encontrei este artigo há algum tempo: Como escrever um corretor ortográfico , escrito por Peter Norvig (diretor de pesquisa do Google Inc.).

É uma leitura interessante sobre o tópico "correção ortográfica". Os exemplos estão em Python, mas é claro e simples de entender, e acho que o algoritmo pode ser facilmente traduzido para outros idiomas.

Abaixo segue uma breve descrição do algoritmo. O algoritmo consiste em duas etapas, preparação e verificação de palavras.

Etapa 1: Preparação - configuração do banco de dados de palavras

O melhor é se você puder usar palavras de pesquisa reais e sua ocorrência. Se você não possui um grande conjunto de texto, pode ser usado. Conte a ocorrência (popularidade) de cada palavra.

Etapa 2. Verificação de palavras - encontrando palavras semelhantes às verificadas

Similar significa que a distância de edição é baixa (geralmente 0-1 ou 0-2). A distância de edição é o número mínimo de inserções / exclusões / alterações / trocas necessárias para transformar uma palavra em outra.

Escolha a palavra mais popular da etapa anterior e sugira-a como uma correção (se não for a própria palavra).

Davide Gualano
fonte
6
@ David: "" "os exemplos estão em python, mas é claro e simples de entender" "": Eu não entendo seu uso de "but" ... eu diria que, dado o estilo de escrita de Python + Norvig, "clear and simples de entender "é o resultado esperado.
John Machin
20
O "mas" estava lá porque Harry disse em sua pergunta que ele é um desenvolvedor de VB.NET, então eu assumi que ele não estava confiante com a linguagem python.
Davide Gualano
56

Para a teoria do algoritmo "você quis dizer", você pode consultar o Capítulo 3 da Introdução à recuperação de informações. Está disponível online gratuitamente. A seção 3.3 (página 52) responde exatamente à sua pergunta. E para responder especificamente à sua atualização, você precisa apenas de um dicionário de palavras e nada mais (incluindo milhões de usuários).

Szere Dyeri
fonte
10

Hmm ... eu pensei que o google usasse seu vasto corpus de dados (a internet) para fazer PNL (processamento de linguagem natural) sério.

Por exemplo, eles têm tantos dados de toda a Internet que podem contar o número de vezes que ocorre uma sequência de três palavras (conhecida como trigrama ). Então, se eles virem uma frase como: "pink frugr concert", eles poderão ver que tem poucos hits e encontrar o mais provável "pink * concert" em seu corpus.

Aparentemente, eles apenas fazem uma variação do que Davide Gualano estava dizendo, então, definitivamente leem esse link. É claro que o Google usa todas as páginas da web que ele conhece como corpus, o que torna seu algoritmo particularmente eficaz.

Claudiu
fonte
7

Meu palpite é que eles usam uma combinação de um algoritmo de distância de Levenshtein e as massas de dados que coletam sobre as pesquisas executadas. Eles poderiam obter um conjunto de pesquisas com a menor distância de Levenshtein da sequência de pesquisa inserida e escolher a que apresentasse mais resultados.

Jim Burger
fonte
6
Digamos que você tenha um total de bilhões de palavras em páginas da Web armazenadas. Não há uma maneira fácil de indexar a distância de Levenshtein para recuperação rápida de correspondências próximas sem calcular a distância de Levenshtein alguns bilhões de vezes para cada palavra consultada. Portanto, a distância de Levenshtein não é muito útil nessa situação, pelo menos não no primeiro estágio, onde o Google precisa diminuir de bilhões de palavras existentes para apenas aquelas que provavelmente serão erros de ortografia da palavra atual. Definitivamente, pode aplicar o Levenshtein como uma etapa posterior, uma vez que ele já buscou correspondências prováveis.
thomasrutter
6

Normalmente, um corretor ortográfico de produção utiliza várias metodologias para fornecer uma sugestão ortográfica. Alguns são:

  • Decida como determinar se a correção ortográfica é necessária. Isso pode incluir resultados insuficientes, resultados que não são específicos ou precisos o suficiente (de acordo com alguma medida), etc. Então:

  • Use um corpo grande de texto ou um dicionário, onde todos ou a maioria sabe que estão escritos corretamente. Estes são facilmente encontrados online, em locais como o LingPipe . Em seguida, para determinar a melhor sugestão, procure uma palavra que seja a correspondência mais próxima com base em várias medidas. O mais intuitivo são caracteres semelhantes. O que foi mostrado através de pesquisas e experimentações é que combinações de sequência de dois ou três caracteres funcionam melhor. (bigramas e trigramas). Para melhorar ainda mais os resultados, avalie uma pontuação mais alta em uma partida no início ou no final da palavra. Por motivos de desempenho, indexe todas essas palavras como trigramas ou bigrams, para que, quando você estiver executando uma pesquisa, converta em n-grama e pesquisa por hashtable ou trie.

  • Use heurísticas relacionadas a possíveis erros de teclado com base na localização dos caracteres. Portanto, "hwllo" deve ser "olá" porque 'w' está próximo de 'e'.

  • Use uma tecla fonética (Soundex, Metaphone) para indexar as palavras e procurar possíveis correções. Na prática, isso normalmente retorna resultados piores do que a indexação por n-grama, conforme descrito acima.

  • Em cada caso, você deve selecionar a melhor correção de uma lista. Pode ser uma métrica de distância, como levenshtein, a métrica do teclado etc.

  • Para uma frase com várias palavras, apenas uma palavra pode estar incorreta; nesse caso, você pode usar as palavras restantes como contexto para determinar a melhor correspondência.

eulerfx
fonte
6

Use a distância de Levenshtein e crie uma Árvore Métrica (ou Árvore Fina) para indexar palavras. Em seguida, execute uma consulta de vizinho mais próximo e você obterá o resultado.

Nicolas Dorier
fonte
4

Aparentemente, o Google sugere consultas com melhores resultados, não com as que estão escritas corretamente. Mas, nesse caso, provavelmente um corretor ortográfico seria mais viável. É claro que você pode armazenar algum valor para cada consulta, com base em alguma métrica de como os resultados são bons.

Assim,

  1. Você precisa de um dicionário (inglês ou com base em seus dados)

  2. Gere uma treliça de palavras e calcule probabilidades para as transições usando seu dicionário.

  3. Adicione um decodificador para calcular a distância mínima de erro usando sua treliça. Obviamente, você deve cuidar de inserções e exclusões ao calcular distâncias. O engraçado é que o teclado QWERTY maximiza a distância se você apertar as teclas umas nas outras. (Cae giraria o carro, cay viraria gato)

  4. Retorne a palavra que tem a distância mínima.

  5. Em seguida, você pode comparar isso ao seu banco de dados de consulta e verificar se há melhores resultados para outras correspondências fechadas.

Geee
fonte
4

Aqui está a melhor resposta que encontrei , corretor ortográfico implementado e descrito pelo diretor de pesquisa do Google, Peter Norvig.

Se você quiser ler mais sobre a teoria por trás disso, leia o capítulo do livro .

A ideia desse algoritmo é baseada no aprendizado de máquina estatístico.

Aziz Alto
fonte
3

Vi algo sobre isso há alguns anos atrás, por isso pode ter mudado desde então, mas aparentemente eles começaram analisando seus logs para os mesmos usuários enviando consultas muito semelhantes em um curto espaço de tempo e usando o aprendizado de máquina com base em como os usuários corrigiram si mesmos.

seanb
fonte
3

Como um palpite ... poderia

  1. procurar por palavras
  2. se não for encontrado, use algum algoritmo para tentar "adivinhar" a palavra.

Pode ser algo da IA ​​como a rede Hopfield ou a rede de propagação traseira, ou algo mais "identificando impressões digitais", restaurando dados quebrados ou correções ortográficas, como Davide já mencionou ...

Paul Kapustin
fonte
2

Simples. Eles têm toneladas de dados. Eles têm estatísticas para todos os termos possíveis, com base na frequência com que são consultados e em quais variações geralmente produzem resultados nos quais os usuários clicam ... então, quando vêem que você digitou um erro de ortografia frequente para um termo de pesquisa, eles avançam e propõem a resposta mais usual.

Na verdade, se o erro de ortografia for o termo pesquisado com mais freqüência, o algoritmo o adotará como correto.

schonarth
fonte
1
Ninguém duvidou que o Google tivesse todos os dados necessários para fazer isso, mas a pergunta estava pedindo detalhes sobre como o Google criou um algoritmo para fazer isso, com tantos dados, em um período de tempo razoável. Eles teriam bilhões de pesquisas por dia - como eles facilmente identificam se um termo de pesquisa é uma 'correção ortográfica' de outro, recente? Quais fatores fazem o Google decidir que um termo é um erro de ortografia de outro? Esses são detalhes de implementação que seriam de interesse.
thomasrutter
2

em relação à sua pergunta, como imitar o comportamento sem ter toneladas de dados - por que não usar toneladas de dados coletados pelo Google? Faça o download dos resultados do google sarch para a palavra com erros ortográficos e pesquise "Você quis dizer:" no HTML.

Eu acho que hoje se chama mashup :-)

Tomas Petricek
fonte
quanto tempo até o google parar o seu bot de raspar? - ou o Google nem notaria nos dias de hoje?
Andrew Harry
Não acho que eles notarão se as solicitações / segundo não forem muito altas.
Mauricio Scheffer
2

Além das respostas acima, caso você queira implementar algo rapidamente, aqui está uma sugestão:

Algoritmo

Você pode encontrar a implementação e a documentação detalhada desse algoritmo no GitHub .

  • Crie uma fila prioritária com um comparador.
  • Crie uma Árvore de Pesquisa Ternay e insira todas as palavras em inglês ( da publicação de Norvig ) junto com suas frequências.
  • Comece a percorrer o TST e, para cada palavra encontrada no TST, calcule sua Distância de Levenshtein ( LD ) em input_word
  • Se LD ≤ 3, coloque-o em uma fila de prioridade.
  • No último, extraia 10 palavras da fila de prioridade e exiba.
amarjeetAnand
fonte
1

Você quer dizer verificador ortográfico? Se for um verificador ortográfico, e não uma frase inteira, eu tenho um link sobre a verificação ortográfica em que o algoritmo é desenvolvido em python. Verifique este link

Enquanto isso, também estou trabalhando em um projeto que inclui a pesquisa de bancos de dados usando texto. Eu acho que isso resolveria seu problema

Jimit Patel
fonte
1

Essa é uma pergunta antiga e estou surpreso que ninguém tenha sugerido o OP usando o Apache Solr.

O Apache Solr é um mecanismo de pesquisa de texto completo que, além de muitas outras funcionalidades, também fornece sugestões de verificação ortográfica ou de consulta. A partir da documentação :

Por padrão, os verificadores ortográficos Lucene classificam as sugestões primeiro pela pontuação do cálculo da distância da sequência e depois pela frequência (se disponível) da sugestão no índice.

Josep Valls
fonte
0

Existe uma estrutura de dados específica - árvore de pesquisa ternária - que suporta naturalmente correspondências parciais e correspondências do vizinho próximo.


fonte
-1

A maneira mais fácil de descobrir isso é a programação dinâmica do Google.

É um algoritmo que foi emprestado da Recuperação de Informação e é amplamente utilizado na bioinformática moderna para ver como são semelhantes duas seqüências de genes.

A solução ideal usa programação dinâmica e recursão.

Este é um problema muito resolvido, com muitas soluções. Basta pesquisar no Google até encontrar algum código-fonte aberto.

ewakened
fonte