私の目標をされてnumpyの使用:カルバック・ライブラー(KL)テキスト文書間の距離の計算は、次のテキスト文書間のKL距離を計算するために
1)The boy is having a lad relationship
2)The boy is having a boy relationship
3)It is a lovely day in NY
私が最初にすべての、容易にするために文書をベクトル化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]
に適用それからテキストとの間のKL距離を計算するための次のコードを適用:
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
上記コードの結果は[0.0, 0.602059991328, 0.0]
です。 テキスト1と3は完全に異なりますが、それらの間の距離は0ですが、関連性の高いテキスト1と2は距離が0.602059991328
です。これは正確ではありません。
KLに関して私が何をしていないのか誰にも分かりますか?あなたの提案に感謝します。
さて、v [0] == v [2]で、kl関数p-qが0の場合、合計は0です。「ドキュメントをベクトル化する」とはどういう意味ですか?あなたのベクトル1と3は等しいです。 –
@ J.Martinot_Lagardeあなたの観察に感謝します。ここでベクトル化するとは、ドキュメント内の各単語の頻度カウントを持ち、その値を使用してドキュメントを表すことを意味します。ここでの問題は、KLを使用して2つのドキュメント間の距離を正確に計算できるように各ドキュメントを表現する方法です。 – Tiger1