我正在尝试使用 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 时犯了一些错误。任何想法我的错误是什么?