Semelhança entre duas palavras

15

Estou procurando uma biblioteca Python que me ajude a identificar a semelhança entre duas palavras ou frases.

Farei a conversão de áudio em texto, o que resultará em um dicionário em inglês ou em palavras que não sejam do dicionário (este pode ser um nome de pessoa ou empresa). Depois disso, preciso compará-lo a uma ou mais palavras conhecidas.

Exemplo:

1) Resultado do texto ao áudio: obrigado por ligar para a America Expansion será comparado ao American Express .

Ambas as frases são de alguma forma semelhantes, mas não são as mesmas.

Parece que eu preciso analisar quantos caracteres eles compartilham. Todas as idéias serão ótimas. Parece uma funcionalidade como o recurso "você quis dizer" na pesquisa do Google.

gogasca
fonte

Respostas:

14

O mais próximo seria como Jan mencionou em sua resposta, a distância de Levenstein (também conhecida popularmente como distância de edição).

Na teoria da informação e na ciência da computação, a distância de Levenshtein é uma métrica de corda para medir a diferença entre duas seqüências. Informalmente, a distância de Levenshtein entre duas palavras é o número mínimo de edições de um caractere (ou seja, inserções, exclusões ou substituições) necessárias para alterar uma palavra pela outra.

É uma métrica muito usada para identificar palavras semelhantes. O Nltk já possui uma implementação para a métrica da distância de edição, que pode ser chamada da seguinte maneira:

import nltk
nltk.edit_distance("humpty", "dumpty")

O código acima retornaria 1, pois apenas uma letra é diferente entre as duas palavras.

Dawny33
fonte
1
A distância de Lavenshtien é o pior algoritmo que você pode usar se PNL é o que você pretende fazer. Se 2 sinônimos tiverem um conjunto de caracteres diferente, o LD terá um desempenho muito ruim nesses casos.
É uma armadilha
9

Além das respostas muito boas aqui, você pode tentar o SequenceMatcher na biblioteca python difflib.

https://docs.python.org/2/library/difflib.html

import difflib

a = 'Thanks for calling America Expansion'
b = 'Thanks for calling American Express'

seq = difflib.SequenceMatcher(None,a,b)
d = seq.ratio()*100
print(d) 
### OUTPUT: 87.323943

Agora considere o código abaixo:

a = 'Thanks for calling American Expansion'
b = 'Thanks for calling American Express'

seq = difflib.SequenceMatcher(None,a,b)
d = seq.ratio()*100
print(d)
### OUTPUT: 88.88888

Agora você pode comparar o valor d para avaliar a semelhança.

SVK
fonte
1
Se você sentir que seq.ratio () é lento, você pode usar seq.quick_ratio ()
Nabin
7

Se o seu dicionário não for muito grande, uma abordagem comum é fazer a distância de Levenshtein, que basicamente conta quantas alterações você precisa fazer para passar de uma palavra para outra. As alterações incluem alterar um personagem, removê-lo ou adicioná-lo. Um exemplo da Wikipedia :

lev (gatinho, sentado) = 3

  • k itten -> s itten
  • sitt e n -> sitt i n
  • sentado -> sentado g

Aqui estão alguns implementos Python nos Wikilivros.

O algoritmo para calcular essas distâncias não é barato, no entanto. Se você precisar fazer isso em larga escala, existem maneiras de usar a semelhança de cosseno em vetores de dois gramas muito mais rápidos e fáceis de distribuir, se você precisar encontrar correspondências para muitas palavras de uma só vez. No entanto, eles são apenas uma aproximação a essa distância.

Jan van der Vegt
fonte
(+1) para o Lev. métrica de distância. O nltk vem com uma implementação pronta. Cosine semelhança não é uma medida IMHO bom string de similaridade :)
Dawny33
Concordo que é muito pior do que a distância Levenshtein, mas se você precisar de correspondência difusa entre 2 conjuntos de dados de milhões ele pode realmente fazer isso em um tempo razoável devido a precisar alguns truques mais multiplicação de matrizes
Jan van der Vegt
1
@ Dawny33 eu discordo. Não apenas a similaridade do cosseno funcionou muito rápido para mim, mas também com muita precisão, uma vez que o n-grama correto foi usado.
Mohit Motwani
3

Uma técnica antiga e bem conhecida para comparação é o algoritmo Soundex . A idéia é comparar não as próprias palavras, mas aproximações de como elas são pronunciadas. Até que ponto isso realmente melhora a qualidade dos resultados que eu não sei.

No entanto, parece um pouco estranho aplicar algo como o Soundex a resultados de um mecanismo de reconhecimento de fala para texto. Primeiro você joga fora as informações sobre como as palavras são pronunciadas e depois tenta adicioná-las novamente. Seria melhor combinar essas duas fases.

Portanto, espero que a tecnologia de ponta nessa área faça isso e seja alguma forma de classificação adaptativa, por exemplo, baseada em redes neurais. O Google retorna pesquisas recentes sobre reconhecimento de fala com redes neurais .

reinierpost
fonte