Similitud entre dos palabras.

15

Estoy buscando una biblioteca de Python que me ayude a identificar la similitud entre dos palabras u oraciones.

Haré la conversión de audio a texto, lo que dará como resultado un diccionario de inglés o palabras que no estén en el diccionario (podría ser el nombre de una persona o compañía). Después de eso, necesito compararlo con una palabra o palabras conocidas.

Ejemplo:

1) Resultado de texto a audio: Gracias por llamar a America Expansion se comparará con American Express .

Ambas oraciones son de alguna manera similares pero no iguales.

Parece que es posible que necesite ver cuántos caracteres comparten. Cualquier idea será genial. Parece una funcionalidad como la función de búsqueda de Google "quiso decir"

gogasca
fuente

Respuestas:

14

Lo más cercano sería como Jan ha mencionado en su respuesta, la distancia de Levenstein (también conocida popularmente como la distancia de edición).

En teoría de la información y ciencias de la computación, la distancia de Levenshtein es una métrica de cadena para medir la diferencia entre dos secuencias. Informalmente, la distancia de Levenshtein entre dos palabras es el número mínimo de ediciones de un solo carácter (es decir, inserciones, eliminaciones o sustituciones) requeridas para cambiar una palabra en la otra.

Es una métrica muy utilizada para identificar palabras similares. Nltk ya tiene una implementación para la métrica de distancia de edición, que se puede invocar de la siguiente manera:

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

El código anterior volvería 1, ya que solo una letra es diferente entre las dos palabras.

Dawny33
fuente
1
La distancia de Lavenshtien es el peor algoritmo que puede usar si la PNL es lo que pretende hacer. Si 2 sinónimos tienen un conjunto de caracteres diferente, LD funcionará muy mal en esos casos.
Es una trampa
8

Además de muy buenas respuestas aquí, puede probar SequenceMatcher en la biblioteca difflib python.

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

Ahora considere el siguiente código:

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

Ahora puede comparar el valor d para evaluar la similitud.

SVK
fuente
1
Si siente que seq.ratio () es lento, puede usar seq.quick_ratio ()
Nabin
6

Si su diccionario no es demasiado grande, un enfoque común es tomar la distancia de Levenshtein, que básicamente cuenta cuántos cambios tiene que hacer para pasar de una palabra a otra. Los cambios incluyen cambiar un personaje, eliminar un personaje o agregar un personaje. Un ejemplo de Wikipedia :

lev (gatito, sentado) = 3

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

Aquí hay algunos implementos de Python en Wikilibros.

Sin embargo, el algoritmo para calcular estas distancias no es barato. Si necesita hacer esto a gran escala, hay formas de usar la similitud del coseno en los vectores de dos gramos que son mucho más rápidos y fáciles de distribuir si necesita encontrar coincidencias para muchas palabras a la vez. Sin embargo, son solo una aproximación a esta distancia.

Jan van der Vegt
fuente
(+1) para el Lev. distancia métrica nltk viene con una implementación lista para usar. La similitud de coseno no es una buena medida de similitud de cuerdas en mi humilde opinión :)
Dawny33
Estoy de acuerdo en que es mucho peor que la distancia de Levenshtein, pero si necesita una coincidencia difusa entre 2 conjuntos de datos de millones, en realidad puede hacerlo en un tiempo razonable debido a la necesidad de algunos trucos más la multiplicación de matrices
Jan van der Vegt
1
@ Dawny33 No estaría de acuerdo. No solo la similitud de coseno funcionó muy rápido para mí, sino también con mucha precisión dado que se usó el n-gramo correcto.
Mohit Motwani
3

Una técnica antigua y bien conocida para la comparación es el algoritmo Soundex . La idea es comparar no las palabras en sí mismas, sino aproximaciones de cómo se pronuncian. Hasta qué punto esto realmente mejora la calidad de los resultados, no lo sé.

Sin embargo, se siente un poco extraño aplicar algo como Soundex a los resultados de un motor de reconocimiento de voz a texto. Primero desecha información sobre cómo se pronuncian las palabras, luego intenta volver a agregarla. Sería mejor combinar estas dos fases.

Por lo tanto, espero que la tecnología de punta en esta área lo haga y sea una forma de clasificación adaptativa, por ejemplo, basada en redes neuronales. Google devuelve investigaciones recientes sobre Reconocimiento de voz con redes neuronales .

reinierpost
fuente