基于主题的文本和用户相似性

时间:2012-10-03 17:32:58

标签: python numpy recommendation-engine topic-modeling gensim

我希望使用他们的主题表示来计算用户和文本文档之间的相似性。即每个文档和用户都由一个主题向量(例如神经科学,技术等)以及该主题与用户/文档的相关程度来表示。

我的目标是计算这些向量之间的相似性,以便找到类似的用户,文章和推荐文章。

我曾尝试使用Pearson Correlation但是一旦它达到~40k篇文章并且向量的长度大约为10k,它最终会占用太多的内存和时间。

我正在使用numpy。

你能想象一个更好的方法吗?或者它是不可避免的(在一台机器上)?

谢谢

3 个答案:

答案 0 :(得分:3)

我建议您只使用gensim而不是滚动自己。

答案 1 :(得分:2)

不太明白为什么你最终只需要计算O(n^2)项对的相关性就会占用太多内存。正如维基百科文章指出的那样,计算Pearson Correlation,enter image description here

也就是说,要获得corr(X,Y),您一次只需要两个向量。如果您一次处理一对数据,内存应该不是问题。

如果要加载所有向量并进行矩阵分解,那就是另一个故事。

对于计算时间,我完全理解,因为您需要对O(n^2)项对进行比较。


众所周知,Gensim能够在合理的时间范围内在单个CPU /台式计算机上运行适度的内存要求(<1 Gb)。使用MacBook Pro,Intel Core i7 2.3GHz,16GB DDR3 RAM,检查this关于他们在8.2GB数据集上所做的实验。我认为这是一个比你更大的数据集。


如果你有一个更大的数据集,你可能想尝试gensim的分布式版本甚至map / reduce。

另一种方法是尝试locality sensitive hashing

答案 2 :(得分:0)

我的技巧是使用搜索引擎,例如ElasticSearch,它运行得很好,通过这种方式,我们统一了所有推荐系统的api。详情如下:

  • 通过语料库训练主题模型,每个主题都是一个单词数组,每个单词都有概率,我们将前6个最可能的单词作为主题的表示。
  • 对于语料库中的每个文档,我们可以为其推断主题分布,分布是每个主题的概率数组。
  • 对于每个文档,我们生成一个假文档,其中包含主题分布和主题表示,例如假文档的大小约为1024个单词。
  • 对于每个文档,我们使用主题分布和主题表示生成查询,例如查询的大小约为128个单词。

所有准备工作如上所述完成。如果您想获得类似文章或其他文章的列表,您只需执行搜索:

  • 获取文档的查询,然后通过查询对假文档执行搜索。

我们发现这种方式非常方便。