【问题标题】:Cosine Similarity余弦相似度
【发布时间】:2011-01-01 03:35:33
【问题描述】:

我计算了两个文档的 tf/idf 值。以下是 tf/idf 值:

1.txt
0.0
0.5
2.txt
0.0
0.5

文件如下:

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

如何使用这些值来计算余弦相似度?

我知道我应该计算点积,然后找到距离并将点积除以它。如何使用我的值来计算?

还有一个问题:两个文档的字数相同重要吗?

【问题讨论】:

  • 这不是更适合mathoverflow.net 吗?
  • 这是一个信息检索任务,不是纯数学的人会关心的
  • 请停止推荐 mathoverflow.net -- 它是针对严肃的数学问题的。

标签: java similarity trigonometry tf-idf dot-product


【解决方案1】:
            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。

【讨论】:

  • 谢谢,但我也对另一件事感到困惑。我看到人们在网上谈论这个。我无法理解。我应该计算 tf/idf 值的余弦相似度还是。只有 idf 值或只有 tf 值??????我知道php并开始学习java。但我很抱歉我不知道哪个语言。你在这里使用的代码?你能告诉我吗,我会看那个郎。基本语法。或者,如果您可以使用我的 tf/idf 值来计算余弦相似度,它将向我展示如何为此编写函数...再次感谢您的回复!
  • @agazerboy 示例是在 python 中给出的,应该非常易读。 for i in xrange(n) 表示 for (i=0; i
【解决方案2】:

简单的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);
    }

【讨论】:

【解决方案3】:

1)计算TF-IDF(通常比T-F单独更好,但完全取决于您的数据集和要求)

来自wiki(关于IDF)

结合了逆文档频率因子,其减少了 文档集中经常发生的术语的重量和 增加很少发生的术语的重量。

2)否,文档都有相同数量的单词并不重要。

3)您可以通过调用某些机器学习库函数,在任何语言中找到tf-idfcosine-similarity我更喜欢python

python代码计算tf-idfcosine-similarity(使用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)您可能对truncated Singular Value Decomposition (SVD)

感兴趣

【讨论】:

    猜你喜欢
    • 2020-08-12
    • 2017-12-12
    • 2013-05-24
    • 1970-01-01
    • 2014-02-25
    • 2018-10-27
    • 2012-06-24
    • 2021-08-04
    相关资源
    最近更新 更多