从一组文档中查找最相似的文档(最近的邻居)



我有80,000份文档,涉及非常广泛的主题。我想做的是对于每篇文章,提供链接以推荐与用户当前正在阅读的文章相似的其他文章(例如前 5 篇相关文章)。如果我不必这样做,我对文档的分类并不真正感兴趣,只是相似性或相关性,理想情况下,我想输出一个 80,000 x 80,000 的矩阵,其中包含所有文档,与集合中的其他文档具有相应的距离(或者可能是相关性?相似性?)。

我目前正在使用 NLTK 来处理文档的内容并获取 ngram,但从那里我不确定我应该采取什么方法来计算文档之间的相似性。

我读过关于使用 tf-idf 和余弦相似性的信息,但是由于主题众多,我期待大量的唯一标记,因此将两个非常长的向量相乘可能是一种糟糕的方法。此外,80,000 个文档可能需要在向量之间进行大量乘法。(诚然,它只需要完成一次,所以它仍然是一种选择)。

有没有更好的方法可以在不创建巨大的 ngram 向量的情况下获取文档之间的距离?斯皮尔曼相关性?或者一种技术含量更低的方法,比如采用顶部的 ngram 并在顶部 k-ngram 中查找具有相同 ngram 的其他文档更合适?我只是觉得如果我需要将 10,000 个元素向量相乘 3.2 亿次(算术级数之和 79,999 + 79,998... 到 1),我肯定必须以最蛮力的方式解决问题。

任何关于方法的建议或阅读的内容将不胜感激。

所以对于K=5你基本上想将 K 最近邻返回到特定文档? 在这种情况下,您应该使用 K-Nearest Neighbors 算法。 Scikit-Learn有一些很好的文本导入和规范化例程(tfidf),然后很容易实现KNN。

启发式方法基本上只是从文档中的所有单词创建规范化的字数统计向量,然后比较向量之间的距离。 我肯定会换掉几个不同的距离指标:例如Euclidean vs. Manhattan vs. Cosine Similarity。 向量并不是真正的long,它们只是位于高维空间中。 因此,您可以通过PCA或您最喜欢的算法进行一些降维来解决您所写的独特单词问题。

在另一个软件包中做到这一点可能同样容易,但是scikit learn的文档是一流的,可以轻松快速地彻底学习。

您应该了解可用于计算文档之间相似性的哈希机制。

典型的哈希函数旨在最大限度地减少重复项到非常不同的哈希键附近的冲突映射。在加密哈希函数中,如果数据更改了一位,则哈希密钥将更改为完全不同的哈希密钥。

相似性哈希

的目标是创建一个相似性哈希函数。用于近似重复检测的基于哈希的技术是为加密哈希算法的相反意图而设计的。非常相似的文档映射到非常相似的哈希键,甚至映射到相同的键。键的按位汉明距离之间的差异是相似性的度量。

计算哈希键后,可以对键进行排序,以提高从 O(n2) 到 O(nlog(n)) 的近似重复检测速度。可以通过分析训练数据的准确性来定义和调整阈值。

Simhash、Minhash 和 Local 敏感哈希是基于哈希的方法的三种实现。您可以谷歌并获取有关这些的更多信息。有很多与这个主题相关的研究论文......

最新更新