我有20000个文档要计算真正的Jaccard相似性,以便以后可以检查MinWise散列方法的精确度。
每个文档在numpy矩阵中表示为一列,其中每一行是一个出现在文档中(entry=1)或不出现在文档中(entry=0)的单词。大约有600个字(行)。
例如,列1应该是[1 0 0 0 0 0 1 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])