У меня есть 20 000 документов, которые я хочу вычислить истинное сходство Jaccard, так что я могу позже проверить, насколько точно хеширование MinWise приближается к нему.Computing Jaccard сходство в Python
Каждый документ представлен в виде столбца в матрице 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] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial .distance.jaccard.html)? Используйте ['scipy.spatial.distance.pdist'] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html) с помощью' metric = 'jaccard''. Вычтите из 1, чтобы получить сходство. –
Еще одно хорошее предложение, тем более что вы можете использовать spicpy.spatial.distance.squareform, чтобы получить обратно матрицу. https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.squareform.html#scipy.spatial.distance.squareform – Magic8ball