Domanda

Ho calcolato i valori IDF TF / di due documenti. Di seguito sono riportati i valori / IDF TF:

1.txt
0.0
0.5
2.txt
0.0
0.5

I documenti sono come:

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

Come posso utilizzare questi valori per calcolare similarità del coseno?

Lo so che dovrei calcolare il prodotto scalare, poi trovare la distanza e dividere prodotto scalare da essa. Come posso calcolare questo usando i miei valori?

Ancora una domanda:? E 'importante che entrambi i documenti devono avere lo stesso numero di parole

È stato utile?

Soluzione

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

a * b è prodotto scalare

alcuni dettagli:

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ì. in una certa misura, a e b devono avere la stessa lunghezza. ma a e b di solito hanno la rappresentanza sparse, avete solo bisogno di memorizzare le voci non-zero e si può calcolare norma e dot più veloce.

Altri suggerimenti

semplice implementazione codice 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);
    }

1) Calcolare TF-IDF (generalmente migliore rispetto tf da solo, ma dipende completamente i dati impostati e requisito)

wiki (per quanto riguarda IDF)

  

Un fattore di frequenza inversa del documento è incorporato che diminuisce   il peso di termini che si verificano molto frequentemente nel set di documenti e   aumenta il peso dei termini che si verificano raramente.

2) No, non è importante che entrambi i documenti hanno lo stesso numero di parole.

3) Potete trovare tf-idf o cosine-similarity in qualsiasi lingua oggi giorno invocando una macchina di apprendimento funzione di libreria. Io preferisco python

Python codice per calcolare TF-IDF e cosine-similarità (utilizzando 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) Potreste essere interessati a troncato decomposizione ai valori singolari (SVD)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top