Similaridade entre palavras

Há um bom tempo (quase uma década) eu tive um problema para normalizar os nomes das ruas de uma base de dados, que eram digitadas manualmente pelos usuários, com os nomes da base de dados fornecida pelos Correios. Na época, um formulário de venda era preenchido manualmente e gravado no banco de dados. Quando houve a necessidade e extrair relatórios analíticos, com base nas informações de venda, nos deparamos com o problema da grafia dos nomes das ruas que era um verdadeiro pesadelo. Só para exemplificar, a rua “Juscelino Kubitschek” era escrita das formas mais criativas possíveis:

  • Jusselino Kubicheque
  • Jucelino Kubicheck
  • Jucelino Kubicheki
  • JK

E por aí vai. O desafio era encontrar uma forma de normalizar essa base automaticamente, sem ter que verificar cada uma das alternativas criativas inseridas pelos usuários.

Depois de alguma busca, me deparei com um artigo denominado How to Strike A Match que propunha uma solução que consistia em criar uma série de pares de caracteres de cada uma das duas palavras, encontrar a interseção entre os  dois grupos de pares, multiplicá-la por 2 e dividi-la pela soma da quantidade de pares.

strike_a_match

O resultado da comparação é o percentual de aproximação entre as duas entradas. Daí bastou estabelecer um nível de corte com base na similaridade e executar as atualizações.

Esses dias, levantando um material sobre NLP para um sistema em que estou trabalhando, acabei me lembrando desse fato, justamente por causa a dificuldade de se fazer análise de linguagem natural para buscas em uma base de dados. Então resolvi postar aqui, já que faz uma era que não vinha escrevendo.

Essa versão do Gist já está atualizada para o Java 8. Já a saída fica como na imagem a seguir:

strikeamatch_output

Sendo que quanto mais próximo de 1, mais parecidas são as duas entradas.

Eu não consegui encontrar o artigo e nem o site original, porém se você quiser conhecer o processo na íntegra, ele está disponível aqui.

Valeu!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s