Scipy,tf-idf和余弦相似

时间:2012-12-03 06:24:13

标签: python scipy cluster-analysis cosine tf-idf

我正在尝试使用python根据tf-idf矩阵聚类一些文档。

首先,我使用规范化的tf遵循公式的维基百科定义。 http://en.wikipedia.org/wiki/Tf-idf

Feat_vectors以二维numpy数组开头,其中行表示文档,列表示术语,每个单元格中的值是每个文档中每个术语的出现次数。

import numpy as np

feat_vectors /= np.max(feat_vectors,axis=1)[:,np.newaxis]
idf = len(feat_vectors) / (feat_vectors != 0).sum(0)
idf = np.log(idf)
feat_vectors *= idf

然后我使用scipy对这些载体进行聚类:

from scipy.cluster import hierarchy

clusters = hierarchy.linkage(feat_vectors,method='complete',metric='cosine')
flat_clusters = hierarchy.fcluster(clusters, 0.8,'inconsistent')

然而,在最后一行它会抛出一个错误:

ValueError: Linkage 'Z' contains negative distances.

余弦相似度从-1到1.但是,余弦相似性的维基百科页面显示http://en.wikipedia.org/wiki/Cosine_similarity

  

在信息检索的情况下,两个文档的余弦相似度范围> 0到1,因为术语频率(tf-idf权重)不能为负。

因此,如果我得到负相似性,似乎我在计算tf-idf时会出现一些错误。任何想法我的错误是什么?

2 个答案:

答案 0 :(得分:1)

我怀疑错误出现在以下行中:

idf = len(feat_vectors) / (feat_vectors != 0).sum(0)

因为你的逻辑向量将被转换为总和中的int,而len是一个int,所以你会失去精度。替换为:

idf = float(len(feat_vectors)) / (feat_vectors != 0).sum(0)

为我工作(即产生我对假数据的期望)。其他一切看起来都是正确的。

答案 1 :(得分:0)

我知道这是一个老帖子,但最近我似乎偶然发现了这个问题。 事实上,我甚至使用TfidfVectorizer(来自sklearn.feature_extraction.text)来生成TFIDF矩阵,一旦我自己的函数给出了这个错误。这也没有帮助。

似乎用于相似性的余弦度量会导致负值。我尝试了欧几里德,它立即起作用。 以下是我发现的更详细答案的链接 - https://stackoverflow.com/a/2590194/3228300

希望这有帮助。