Moim celem jest, aby obliczyć odległość KL pomiędzy następującymi dokumentami tekstowymi:Obliczanie Kullback-Leiblera (KL) odległości między tekstem dokumentów elektronicznych za pomocą numpy
1)The boy is having a lad relationship
2)The boy is having a boy relationship
3)It is a lovely day in NY
I przede wszystkim wektoryzowane dokumenty w celu łatwego mają zastosowanie numpy
1)[1,1,1,1,1,1,1]
2)[1,2,1,1,1,2,1]
3)[1,1,1,1,1,1,1]
następnie zastosowano następujący kod do obliczania KL odległość między tekstami:
import numpy as np
import math
from math import log
v=[[1,1,1,1,1,1,1],[1,2,1,1,1,2,1],[1,1,1,1,1,1,1]]
c=v[0]
def kl(p, q):
p = np.asarray(p, dtype=np.float)
q = np.asarray(q, dtype=np.float)
return np.sum(np.where(p != 0,(p-q) * np.log10(p/q), 0))
for x in v:
KL=kl(x,c)
print KL
Oto wynik powyższego kodu: [0.0, 0.602059991328, 0.0]
. Teksty 1 i 3 są całkowicie różne, ale odległość między nimi wynosi 0, natomiast teksty 1 i 2, które są bardzo powiązane, mają odległość 0.602059991328
. To nie jest dokładne.
Czy ktoś ma pojęcie o tym, co nie robię dobrze w odniesieniu do KL? Wielkie dzięki za twoje sugestie.
Cóż, v [0] == v [2], zatem w funkcji kl p-q wynosi 0, wtedy suma wynosi 0. Co rozumiesz przez "wektoryzację dokumentów"? Twoje wektory 1 i 3 są równe. –
@ J.Martinot_Lagarde dzięki za twoją obserwację. tu wektoryzacja oznacza posiadanie liczby częstotliwości każdego słowa w dokumencie i użycie wartości do przedstawienia dokumentu. Problem polega na tym, jak przedstawić każdy dokument w taki sposób, aby odległość między dwoma dokumentami można było dokładnie obliczyć za pomocą KL. – Tiger1