词袋

时间:2015-07-28 13:52:01

标签: similarity information-retrieval

我有三包话:

BoW1 = [word11, word12, word13]
BoW2 = [word21, word22, word23]
BoW3 = [word31, word32, word33]

BoW1包含同义词,BoW2也包含同义词。 BoW1和BoW都是固定的。 BoW3包含文档的单词,因此它是multiset。

我想搜索BoW3以查看它是否包含BoW1和BoW2的任何单词。然后,我想计算Bow1 + BoW2和BoW3之间的相似性。所以,BoW1和BoW2一起。我对计算BoW1和BoW2之间的相似性感兴趣,在计算中我可以假设它们是一个。但是,对于我的情况,BoW1包含比BoW2重要的单词。

您认为计算这种相似性的最佳和准确方法是什么?我虽然在信息检索领域使用术语频率。但是,我不确定在我的情况下重复是否重要。

1 个答案:

答案 0 :(得分:1)

您可能想要余弦相似度(https://en.wikipedia.org/wiki/Cosine_similarity)。计算每个单词矢量之间的点积。如果您使用的是Python,那么您的代码将类似于:

# Make sure each BoW is a map from word -> frequency
BoW1 = {word11: 1, word12: 5, word13: 3}
BoW2 = ...
BoW3 = ...

# Normalise the frequencies
BoW1_total = sum([freq for freq in BoW1.values()])
BoW1 = {word : freq / BoW1_total for word, freq in BoW1.items()}
BoW2_total = ...
...

# Compute the dot product
similarity = 0
for word in set(BoW1.keys()).intersection(BoW2.keys()):
    similarity += BoW1[word] * BoW2[word]
... # continue for each pair you want to work out the similarities 

当然,比这更好地组织代码^(为你需要多次执行的所有事情编写函数等),但这应该给你一个粗略的想法。