【发布时间】:2013-08-22 12:10:03
【问题描述】:
我的目标是计算以下文本文档之间的 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 准确计算两个文档之间的距离。
标签: python-2.7 numpy distance