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?
algorithm
machine-learning
nlp
spell-checking
text-search
Andrew Harry
fonte
fonte
Respostas:
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.
fonte
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).
fonte
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).
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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,
Você precisa de um dicionário (inglês ou com base em seus dados)
Gere uma treliça de palavras e calcule probabilidades para as transições usando seu dicionário.
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)
Retorne a palavra que tem a distância mínima.
Em seguida, você pode comparar isso ao seu banco de dados de consulta e verificar se há melhores resultados para outras correspondências fechadas.
fonte
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.
fonte
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.
fonte
Como um palpite ... poderia
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 ...
fonte
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.
fonte
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 :-)
fonte
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 .
fonte
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
fonte
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 :
fonte
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
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.
fonte