簡體   English   中英

余弦相似度

[英]Cosine Similarity

我計算了兩個文件的tf / idf值。 以下是tf / idf值:

1.txt
0.0
0.5
2.txt
0.0
0.5

文件如下:

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

如何使用這些值來計算余弦相似度?

我知道我應該計算點積,然后通過它找到距離並除以點積。 如何使用我的值來計算?

還有一個問題: 兩個文件應該有相同數量的單詞是否重要?

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

a * b是點積

一些細節:

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

是。 在某種程度上,a和b必須具有相同的長度。 但是a和b通常都有稀疏表示,你只需要存儲非零項,你就可以更快地計算norm和dot。

簡單的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)計算tf-idf(通常優於單獨的tf,但完全取決於您的數據集和要求)

來自wiki (關於idf)

結合了逆文檔頻率因子,其減少了在文檔集中非常頻繁出現的術語的權重並且增加了很少發生的術語的權重。

2)不,兩個文件具有相同數量的單詞並不重要。

3)通過調用一些機器學習庫函數,您現在可以在任何語言中找到tf-idfcosine-similarity 我更喜歡python

用於計算tf-idf余弦相似度的 Python代碼(使用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)您可能對截斷奇異值分解(SVD)感興趣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM