2010-01-04 18 views
5

Calculé los valores de tf/idf de dos documentos. Los siguientes son los valores de las FDI/TF:Similitud de coseno

1.txt 
0.0 
0.5 
2.txt 
0.0 
0.5 

Los documentos son como:

1.txt = > dog cat 
2.txt = > cat elephant 

¿Cómo puedo usar estos valores para calcular la similitud del coseno?

Sé que debo calcular el producto escalar, luego encontrar la distancia y dividir el producto por él. ¿Cómo puedo calcular esto usando mis valores?

Una pregunta más: ¿Es importante que ambos documentos tengan el mismo número de palabras?

+1

No es éste el más apropiado para http://mathoverflow.net /? –

+4

es una tarea de recuperación de información, no algo que a una persona pura en matemáticas le importaría –

+11

Por favor, deje de recomendar mathoverflow.net - es para preguntas matemáticas serias. –

Respuesta

13
  a * b 
sim(a,b) =-------- 
      |a|*|b| 

a * b es producto de punto

algunos detalles:

def dot(a,b): 
    n = length(a) 
    sum = 0 
    for i in xrange(n): 
    sum += a[i] * b[i]; 
    return sum 

def norm(a): 
    n = length(a) 
    for i in xrange(n): 
    sum += a[i] * a[i] 
    return math.sqrt(sum) 

def cossim(a,b): 
    return dot(a,b)/(norm(a) * norm(b)) 

sí. hasta cierto punto, a y b deben tener la misma longitud. pero a y b generalmente tienen una representación dispersa, solo necesita almacenar entradas que no sean cero y puede calcular la norma y el punto más rápidamente.

+0

Gracias, pero también estoy confundido acerca de una cosa más. Vi gente hablando sobre esto a través de la red. No pude entender. ¿Debería calcular la similitud del coseno en los valores tf/idf? Solo valores idf o solo valores tf ????? Sé php y empiezo a aprender java. Pero lo siento, no sé qué idioma. código que usaste aquí?puedes por favor, házmelo saber, voy a buscar ese idioma. sintaxis básica O si puede usar mis valores de tf/idf para calcular la similitud del coseno, me mostrará cómo escribir una función para eso ... ¡Gracias de nuevo por la respuesta! – user238384

+0

@agazerboy la muestra se da en python, que debe ser bastante legible. para i en xrange (n) significa para (i = 0; i

+0

por favor lea mi explicación a continuación! – user238384

8

implementación simple código java:

static double cosine_similarity(Map<String, Double> v1, Map<String, Double> v2) { 
      Set<String> both = Sets.newHashSet(v1.keySet()); 
      both.retainAll(v2.keySet()); 
      double sclar = 0, norm1 = 0, norm2 = 0; 
      for (String k : both) sclar += v1.get(k) * v2.get(k); 
      for (String k : v1.keySet()) norm1 += v1.get(k) * v1.get(k); 
      for (String k : v2.keySet()) norm2 += v2.get(k) * v2.get(k); 
      return sclar/Math.sqrt(norm1 * norm2); 
    } 
+2

[Un usuario anónimo comenta] (http://stackoverflow.com/suggested-edits/237603) que esto debería ser 'both.retainAll()' not ' removeAll' para obtener la intersección – Rup

0

1) Calcular TF-IDF (generalmente mejor que tf solos sino que depende por completo de su conjunto de datos y requisitos)

De wiki (con respecto IDF)

Se incorpora un factor de frecuencia de documento inverso que disminuye el peso de los términos que ocurren con mucha frecuencia en el conjunto de documentos y aumenta el peso de los términos que ocurren raramente.

2) No, no es importante que ambos documentos tengan el mismo número de palabras.

3) Puede encontrar tf-idf o cosine-similarity en cualquier idioma en estos días invocando alguna función de biblioteca de aprendizaje automático. Yo prefiero pitón

código

Python para calcular tf-idf y cosine-similarity (usando scikit-learn 0.18.2)

from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.metrics.pairwise import cosine_similarity 
# example dataset 
from sklearn.datasets import fetch_20newsgroups 

# replace with your method to get data 
example_data = fetch_20newsgroups(subset='all').data 

max_features_for_tfidf = 10000 
is_idf = True 

vectorizer = TfidfVectorizer(max_df=0.5, max_features=max_features_for_tf_idf, 
          min_df=2, stop_words='english', 
          use_idf=is_idf) 


X_Mat = vectorizer.fit_transform(example_data) 

# calculate cosine similarity between samples in X with samples in Y 
cosine_sim = cosine_similarity(X=X_Mat, Y=X_Mat) 

4) Usted puede estar interesado en truncated Singular Value Decomposition (SVD)