python nlp similarity nltk tf-idf

python - ¿Similitud coseno de vectores de diferentes longitudes?



nlp similarity (3)

Intente construir los vectores antes de alimentarlos a la función cosine_distance:

import math from collections import Counter from nltk import cluster def buildVector(iterable1, iterable2): counter1 = Counter(iterable1) counter2= Counter(iterable2) all_items = set(counter1.keys()).union( set(counter2.keys()) ) vector1 = [counter1[k] for k in all_items] vector2 = [counter2[k] for k in all_items] return vector1, vector2 l1 = "Julie loves me more than Linda loves me".split() l2 = "Jane likes me more than Julie loves me or".split() v1,v2= buildVector(l1, l2) print(cluster.util.cosine_distance(v1,v2))

Estoy tratando de usar TF-IDF para ordenar documentos en categorías. He calculado el tf_idf para algunos documentos, pero ahora, cuando trato de calcular la similitud coseno entre dos de estos documentos, obtengo un traceback que dice:

#len(u)==201, len(v)==246 cosine_distance(u, v) ValueError: objects are not aligned #this works though: cosine_distance(u[:200], v[:200]) >> 0.52230249969265641

¿Está cortando el vector de modo que len (u) == len (v) el enfoque correcto? Yo pensaría que la similitud del coseno funcionaría con vectores de diferentes longitudes.

Estoy usando esta función :

def cosine_distance(u, v): """ Returns the cosine of the angle between vectors v and u. This is equal to u.v / |u||v|. """ return numpy.dot(u, v) / (math.sqrt(numpy.dot(u, u)) * math.sqrt(numpy.dot(v, v)))

Además, ¿es importante el orden de los valores tf_idf en los vectores? ¿Deberían ordenarse, o no tiene importancia para este cálculo?


¿Estás calculando la similitud del coseno de los vectores de términos? Los vectores de término deben tener la misma longitud. Si las palabras no están presentes en un documento, entonces debe tener un valor de 0 para ese término.

No estoy exactamente seguro de qué vectores está aplicando la similitud del coseno, pero al hacer la similitud del coseno, los vectores siempre deben tener la misma longitud y el orden importa mucho.

Ejemplo:

Term | Doc1 | Doc2 Foo .3 .7 Bar | 0 | 8 Baz | 1 | 1

Aquí tiene dos vectores (.3,0,1) y (.7,8,1) y puede calcular la similitud del coseno entre ellos. Si comparas (.3,1) y (.7,8) estarías comparando el puntaje de Doc1 de Baz con el puntaje de Bar de Doc2 que no tendría sentido.


Necesita multiplicar las entradas por palabras correspondientes en el vector, por lo que debe haber un orden global para las palabras. Esto significa que, en teoría, tus vectores deberían tener la misma longitud.

En la práctica, si un documento se veía antes que el otro, las palabras en el segundo documento pueden haberse agregado al orden global después de que se viera el primer documento, por lo que aunque los vectores tengan el mismo orden, el primer documento puede ser más corto, ya que no tiene entradas para las palabras que no estaban en ese vector.

Documento 1: El zorro marrón rápido saltó sobre el perro perezoso.

Global order: The quick brown fox jumped over the lazy dog Vector for Doc 1: 1 1 1 1 1 1 1 1 1

Documento 2: El corredor fue rápido.

Global order: The quick brown fox jumped over the lazy dog runner was Vector for Doc 1: 1 1 1 1 1 1 1 1 1 Vector for Doc 2: 1 1 0 0 0 0 0 0 0 1 1

En este caso, en teoría, debe rellenar el vector Documento 1 con ceros al final. En la práctica, al calcular el producto escalar, solo necesita multiplicar elementos hasta el final del Vector 1 (ya que omitir los elementos adicionales del vector 2 y multiplicarlos por cero es exactamente igual, pero visitar los elementos extra es más lento).

Entonces puede calcular la magnitud de cada vector por separado, y para eso los vectores no necesitan ser de la misma longitud.