非常快速的文档相似度

Posted

技术标签:

【中文标题】非常快速的文档相似度【英文标题】:Very fast document similarity 【发布时间】:2010-05-13 18:23:30 【问题描述】:

我正在尝试尽快确定单个文档与大量文档(n ~= 100 万)中的每个文档之间的文档相似性。更具体地说,我正在比较的文件是电子邮件;它们被分组(即有文件夹或标签),我想确定哪个组最适合新电子邮件。快速的性能至关重要。

我的先验假设是术语向量之间的余弦相似度适合此应用程序;请评论这是否是一个很好的措施!

我已经考虑了以下提高性能的可能性:

    对所有词向量进行预归一化

    为每组 (n ~= 10,000) 而不是每封电子邮件 (n ~= 1,000,000) 计算一个术语向量;这对我的申请来说可能是可以接受的,但如果你能想到不这样做的理由,请告诉我!

我有几个问题:

    如果一封新电子邮件包含以前任何电子邮件中从未见过的新术语,这是否意味着我需要重新计算我的 所有 术语向量?这似乎很昂贵。

    是否有一些聪明的方法来只考虑可能接近查询文档的向量?

    有没有什么方法可以让我为所有这些向量使用的内存量更加节俭?

谢谢!

【问题讨论】:

【参考方案1】:

使用Bayesian filtering。提供的链接是指垃圾邮件过滤,但您可以很容易地将算法调整到多个类别/标签。

还有很多不错的SO question about Bayesian filtering。

【讨论】:

感谢您的推荐。贝叶斯过滤是一个有趣的想法。我有几个问题: 1. 为什么你认为 BF 在这个例子中比余弦相似度更好? 2. 我可能遗漏了一些东西,但是对于 n=number of categories,我的分类时间是否仍然是 O(n),就像余弦相似度一样?我认为我需要一个 O(log n) 或 O(1) 查找表来对可能的分类候选者进行排名。 回到这个问题——我现在正在尝试使用贝叶斯过滤来解决这个问题——似乎是个好主意,所以接受这个答案。

以上是关于非常快速的文档相似度的主要内容,如果未能解决你的问题,请参考以下文章

如何计算两个文档的相似度

文本相似度算法

针对许多文档计算文本相似度

在 python 中使用余弦相似度返回与查询文档相比最相似的文档

基于Gensim的文本相似度计算

如何在 Python 中快速计算大量向量的余弦相似度?