2012-10-03 38 views
3

我正在寻找计算用户和文本文档之间使用其主题表示的相似度。即每个文档和用户由主题向量(例如神经科学,技术等)表示,并且该主题与用户/文档有多相关。基于主题的文本和用户相似度

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

我试过使用Pearson Correlation,但是一旦它达到〜40k篇文章和向量的长度在10k左右,它最终会花费太多的内存和时间。

我正在使用numpy。

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

谢谢

回答

3

我只想用gensim这个,而不是滚动您自己的建议。

+0

只为了解:gensim会为我做的是降维(使用lsi或lda),对不对?它仍然会使用皮尔逊的相关性来找出相似之处,对吧? – user1491915

2

不太明白为什么你最终会花费太多的内存来计算O(n^2)项目的相关性。如维基百科文章指出的那样,要计算Pearson相关性,可以使用enter image description here

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

如果你打算加载所有向量并做一些矩阵分解,那是另一回事。

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


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


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

另一种方法是尝试locality sensitive hashing

0

我的窍门是使用ElasticSearch等搜索引擎,而且效果非常好,这样我们统一了我们所有推荐系统的api。详细列示如下:

  • 训练你的语料库的主题模型,每个主题是字的阵列,并且每个字的是一个概率,我们采取的第一个6个最有可能的话当作是一个表征一个话题。
  • 对于您的语料库中的每个文档,我们可以推断它的主题分布,分布是每个主题的概率数组。
  • 对于每个文档,我们生成一个伪造文档,其中包含主题分布和主题表示,例如假文档的大小约为1024个字。
  • 对于每个文档,我们生成一个包含主题分布和主题表示的查询,例如查询的大小约为128个词。

所有准备完成如上。当您想要获取类似文章或其他人的列表时,您可以执行搜索:

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

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

+0

虽然建议如何?你如何代表你的用户? – user1491915

+0

我认为您可以将用户视为他访问的页面,并将一次访问计为一次。这应该是可行的。 – Mountain

+0

关于退出memery问题:“矢量的长度大约为10k”,这意味着您有大约10,000个主题,我认为这太大了。在我们的案例中,我们有20k文档和512个主题,我们发现结果是可以接受的。 – Mountain