【发布时间】:2017-03-27 12:57:04
【问题描述】:
我有 20,000 个文档要计算其真正的 Jaccard 相似度,以便以后检查 MinWise 散列法对其进行近似的准确度。
每个文档都表示为 numpy 矩阵中的一列,其中每一行是一个出现在文档中的单词 (entry=1) 或不出现在文档中的单词 (entry = 0)。大约有 600 个单词(行)。
因此,例如第 1 列将是 [1 0 0 0 0 0 1 0 0 0 1 0],这意味着其中出现了单词 1,7,11 而没有其他单词。
除了我的元素比较方法之外,还有更有效的方法来计算相似度吗?我看不出如何使用集合来提高速度,因为集合刚刚变成 (0,1),但就目前而言,代码慢得不可思议。
import numpy as np
#load file into python
rawdata = np.loadtxt("myfile.csv",delimiter="\t")
#Convert the documents from rows to columns
rawdata = np.transpose(rawdata)
#compute true jacard similarity
ndocs = rawdata.shape[1]
nwords = rawdata.shape[0]
tru_sim = np.zeros((ndocs,ndocs))
#computes jaccard similarity of 2 documents
def jaccard(c1, c2):
n11 = sum((c1==1)&(c2==1))
n00 = sum((c1==0)&(c2==0))
jac = n11 / (nfeats-n00)
return (jac)
for i in range(0,ndocs):
tru_sim[i,i]=1
for j in range(i+1,ndocs):
tru_sim[i,j] = jaccard(rawdata[:,i],rawdata[:,j])
【问题讨论】:
-
你见过scipy.spatial.distance.jaccard吗?将
scipy.spatial.distance.pdist与metric='jaccard'一起使用。从 1 中减去它以获得相似度。 -
另一个好建议,特别是因为您可以使用 spicpy.spatial.distance.squareform 轻松获取矩阵。 docs.scipy.org/doc/scipy/reference/generated/…
标签: python performance numpy vectorization data-mining