Frage

I tf / idf Werte von zwei Dokumenten berechnet. Im Folgenden sind die tf / idf Werte:

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 zu berechnen Kosinusähnlichkeit verwenden?

Ich weiß, dass ich das Punktprodukt berechnen soll, dann Abstand und dividieren Punkt durch Produkt finden. Wie kann ich berechnen diese meine Werte mit?

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

War es hilfreich?

Lösung

            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. zu einem gewissen Grad muss a und b die gleiche Länge haben. aber a und b in der Regel dünn besetzten Darstellung haben, müssen Sie nur Nicht-Null-Einträge speichern und Sie können Norm berechnen und Punkt mehr schnell.

Andere Tipps

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

1) berechnen TF-IDF (im Allgemeinen besser als tf allein, sondern hängt ganz von Ihrem Datensatz und Anforderung)

Wiki (in Bezug auf idf)

  

Eine inverse Dokumenthäufigkeit Faktor ist, der abnimmt eingebaut   das Gewicht der Begriffe, die sehr häufig in dem Dokumentensatz auftreten und   erhöht das Gewicht der Begriffe, die selten auftreten.

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

3) Sie können tf-idf oder cosine-similarity in jeder Sprache jetzt Tage finden, indem eine Maschine Lernbibliotheksfunktion aufrufen. Ich ziehe es Python

Python-Code zu berechnen TF-IDF und Cosinus-Ähnlichkeit (mit 0.18.2 scikit-Learn )

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 interessieren könnten abgeschnittenen Einzelwertzerlegung (SVD)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top