我有80,000个关于大量主题的文档。我想要做的是为每篇文章提供链接,以推荐与用户当前正在阅读的文章类似的其他文章(类似前5篇相关文章)。如果我不必要,我对文档的分类,只是相似性或相关性并不感兴趣,理想情况下我想输出一个80,000 x 80,000的所有文档矩阵,并且具有相应的距离(或者或许相似性?相似性?)到集合中的其他文档。
我目前正在使用NLTK来处理文档的内容并获取ngrams,但是从那里我不确定我应该采用什么方法来计算文档之间的相似性。
我读过关于使用tf-idf和余弦相似性的内容,但是由于我预期会有大量独特令牌的大量主题,因此将两个非常长的向量相乘可能是一个不好的方法。它。此外,80,000个文档可能需要在向量之间进行大量乘法。 (不可否认,它只需要做一次,所以它仍然可以选择)。
有没有更好的方法来获取文档之间的距离而不创建一个巨大的ngrams矢量?斯皮尔曼相关?还是采用更低技术的方法,比如采用顶级的ngrams并在顶级k-ngrams中找到具有相同ngram的其他文档更合适?我只是觉得如果我需要将可能10,000个元素向量加起来3.2亿次(算术系列79,999 + 79,998 ...的总和),我必须以最强力的方式解决这个问题。
非常感谢任何有关方法或阅读内容的建议。
答案 0 :(得分:1)
那么对于K=5
你基本上想要将K-Nearest Neighbors返回到特定文档?在这种情况下,您应该使用K-Nearest Neighbors
算法。 Scikit-Learn有一些很好的文本导入和规范化例程(tfidf),然后很容易implement KNN。
启发式算法基本上只是从文档中的所有单词创建规范化的单词计数向量,然后比较向量之间的距离。我肯定会换出一些不同的距离指标:例如Euclidean vs. Manhattan vs. Cosine Similarity
。向量不是long
,它们只是坐在高维空间中。所以你可以通过PCA或你最喜欢的算法减少维数来修复你写的独特单词问题。
在另一个软件包中执行此操作可能同样容易,但scikit学习文档是一流的,可以让您轻松快速地学习。
答案 1 :(得分:1)
您应该了解可用于计算文档之间相似性的散列机制。
典型的散列函数旨在最大限度地减少重复附近的碰撞映射到非常不同的散列键。在加密散列函数中,如果使用一位更改数据,则散列键将更改为完全不同的散列键。
相似性散列的目标是创建相似性散列函数。基于哈希的近似重复检测技术是针对加密哈希算法的相反目的而设计的。非常相似的文档映射到非常相似的散列键,甚至是相同的键。键的按位汉明距离之间的差异是相似性的度量。
在计算散列键之后,可以对键进行排序以将近似重复检测的速度从 O(n2)增加到 O(nlog(n))。可以通过分析训练数据的准确性来定义和调整阈值。
Simhash,Minhash和Local敏感散列是基于散列的方法的三种实现。您可以谷歌并获取有关这些的更多信息。有很多与此主题相关的研究论文......