Ich habe 20.000 Dokumente, die ich die wahre Jaccard Ähnlichkeit für berechnen möchte, so dass ich später überprüfen kann, wie genau MinWise Hashing approximiert.Rechnen Jaccard Ähnlichkeit in Python
Jedes Dokument wird als Spalte in einer Zahlenmatrix dargestellt, wobei jede Zeile ein Wort ist, das entweder im Dokument (Eintrag = 1) oder nicht (Eintrag = 0) angezeigt wird. Es gibt ~ 600 Wörter (Zeilen).
So wäre zum Beispiel Spalte 1 [1 0 0 0 0 0 1 0 0 0 1 0], was bedeutet, dass die Wörter 1,7,11 darin und keine anderen erschienen.
Gibt es einen effizienteren Weg, die Ähnlichkeit neben meinem elementweisen Vergleichsansatz zu berechnen? Ich sehe nicht, wie ich Sätze verwenden könnte, um die Geschwindigkeit zu verbessern, da die Sätze gerade zu (0,1) werden, aber so wie es aussieht, ist der Code unmöglich langsam.
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])
Haben Sie [scipy.spatial.distance.jaccard] gesehen (https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial .distanz.jaccard.html)? Verwenden Sie ['scipy.spatial.distance.pdist'] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html) mit' metric = 'jaccard''. Subtrahiere das von 1, um die Ähnlichkeit zu erhalten. –
Ein weiterer guter Vorschlag, vor allem, da Sie spicpy.spatial.distance.squareform verwenden können, um die Matrix einfach zurück zu bekommen. https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.squareform.html#scipy.spatial.distance.squareform – Magic8ball