2010-01-04 19 views
5

Ich berechnete tf/idf Werte von zwei Dokumenten. Im Folgenden sind die tf/idf Werte:Cosine Ähnlichkeit

1.txt 
0.0 
0.5 
2.txt 
0.0 
0.5 

Die Dokumente sind wie:

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

Wie kann ich diese Werte verwenden Kosinusähnlichkeit zu berechnen?

Ich weiß, dass ich das Skalarprodukt berechnen sollte, dann finden Sie die Entfernung und dividieren Sie Punktprodukt damit. Wie kann ich dies mit meinen Werten berechnen?

Noch eine Frage: Ist es wichtig, dass beide Dokumente die gleiche Anzahl von Wörtern haben?

+1

Ist das nicht mehr angemessen zu berechnen /? –

+4

Es ist eine Information Retrieval-Aufgabe, nicht etwas, was eine reine Mathematik Person interessieren würde –

+11

Bitte hören Sie auf zu empfehlen mathoverflow.net - es ist für ernsthafte mathematische Fragen. –

Antwort

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

a * b ist Skalarprodukt

einige Details:

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)) 

ja. bis zu einem gewissen Grad müssen a und b die gleiche Länge haben. aber a und b haben normalerweise eine spärliche Darstellung, Sie müssen nur Nicht-Null-Einträge speichern, und Sie können Norm und Punkt schneller berechnen.

+0

Danke, aber ich bin auch verwirrt über eine weitere Sache. Ich sah Leute über das Internet reden. Ich konnte es nicht verstehen. Sollte ich Cosinus-Ähnlichkeit auf tf/idf-Werten OR berechnen. Nur IDF-Werte oder nur TF-Werte ????? Ich kenne PHP und beginne Java zu lernen. Aber es tut mir leid, ich weiß nicht welche Sprache. Code, den du hier benutzt hast?kannst du mir bitte Bescheid geben, ich werde das lang sehen. grundlegende Syntax. Oder wenn Sie meine tf/idf-Werte verwenden können, um Kosinus-Ähnlichkeit zu berechnen, wird es mir zeigen, wie man eine Funktion dafür schreibt ... danke noch einmal für die Antwort! – user238384

+0

@agazerboy das Beispiel ist in Python gegeben, die gut lesbar sein sollte. denn i in xrange (n) bedeutet für (i = 0; i

+0

Bitte lesen Sie meine Erklärung unten! – user238384

8

einfache Java-Code-Implementierung:

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

[Anonyme Benutzerkommentare] (http://stackoverflow.com/suggested-edits/237603), dass dies 'both.retainAll()' nicht 'sein sollte removeAll', um die Schnittmenge zu erhalten – Rup

0

1) Berechnen tf-idf (im Allgemeinen besser als allein tf aber hängt ganz von Ihrem Datensatz und Anforderung)

Von wiki (in Bezug auf idf)

Ein inverser Dokument-Häufigkeitsfaktor ist enthalten, der das Gewicht von Begriffen verringert, die sehr häufig im Dokumentensatz vorkommen und erhöht das Gewicht von Begriffen, die selten auftreten.

2) Nein, es ist nicht wichtig, dass beide Dokumente die gleiche Anzahl von Wörtern haben.

3) Sie können tf-idf oder cosine-similarity in einer beliebigen Sprache jetzt Tage finden, indem Sie einige Machine Learning Library-Funktion aufrufen. Ich ziehe es Python

Python-Code tf-idf und cosine-similarity (mit 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) Sie könnten daran interessiert sein für http://mathoverflow.net truncated Singular Value Decomposition (SVD)