Mam 20 000 dokumentów, dla których chcę obliczyć prawdziwe podobieństwo Jaccard, tak, że mogę później sprawdzić, jak dokładnie Hashowanie MinWise je przybliża.Obliczanie Jaccard Podobieństwo w Pythonie
Każdy dokument jest reprezentowany jako kolumna w macierzy numpy, gdzie każdy wiersz jest słowem, które pojawia się w dokumencie (pozycja = 1) lub nie (pozycja = 0). Istnieje ~ 600 słów (wiersze).
Tak na przykład kolumna 1 byłaby [1 0 0 0 0 0 1 0 0 0 1 0], co oznacza, że pojawiły się w niej słowa 1,7,11, a nie inne.
Czy istnieje skuteczniejszy sposób obliczenia podobieństwa poza moim podejściem opartym na elementarnym porównaniu? Nie widzę sposobu, w jaki mogłem używać zestawów, aby poprawić prędkość, ponieważ zestawy stają się (0,1), ale w obecnej postaci kod jest niesamowicie wolny.
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])
Widziałeś [scipy.spatial.distance.jaccard] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial .distance.jaccard.html)? Użyj ['scipy.spatial.distance.pdist'] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html) za pomocą' metric = 'jaccard''. Odejmij od 1, aby uzyskać podobieństwo. –
Kolejna dobra sugestia, zwłaszcza, że można użyć spicpy.spatial.distance.squareform, aby łatwo odzyskać matrycę. https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.squareform.html#scipy.spatial.distance.squareform – Magic8ball