在Python中计算两个向量(词袋)之间的欧式距离

4
我使用字典来表示文章中单词的计数。例如,{"name":2,“your”:10,“me”:20}表示“name”出现了两次,“your”出现了10次,“me”出现了20次。
那么,有没有一种好的方法来计算这些向量之间的欧氏距离呢?困难在于这些向量的长度不同,并且有些向量包含某些单词,而有些则不包含。
我知道我可以编写一个长函数来完成这个任务,但我正在寻找一种更简单、更巧妙的方法。谢谢。
编辑: 目标是获得两篇文章之间的相似度并对它们进行分组。

2
这个我之前回答的问题对你有帮助吗?它使用了counter.Counter(),这是 Python 中 bag 数据结构的实现。 - Martijn Pieters
只有当两个向量具有相同的长度(即映射相同的单词)且顺序相同时,才能这样做。 - Blubber
你可以在交集上计算欧几里得距离。不过,这是一个任意的选择。如果你告诉我们你的目标,我们可能会帮助设计一个适合你所需的良好距离函数。 - Bakuriu
问题是,对于不同维度的数据计算欧几里得距离有多少意义。向量x=(x1,x2)是二维的,因此可以通过欧几里得距离与向量y=(y1,y2)进行比较。但是,如何将x与向量z = (z1, z2, z3, z4, z5)进行比较呢? - MaxPowers
2个回答

9

类似于某事

math.sqrt(sum((a[k] - b[k])**2 for k in a.keys()))

其中a和b是具有相同键的字典。如果要在不同向量对之间比较这些值,则应确保每个向量包含完全相同的单词,否则您的距离度量将毫无意义。

您可以仅基于交集计算距离:

math.sqrt(sum((a[k] - b[k])**2 for k in set(a.keys()).intersection(set(b.keys()))))

另一个选择是使用并集,并将未知值设为0。
math.sqrt(sum((a.get(k, 0) - b.get(k, 0))**2 for k in set(a.keys()).union(set(b.keys()))))

但是你必须仔细考虑你正在计算的内容。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接