3

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

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

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

我正在使用 numpy。

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

谢谢

4

3 回答 3

3

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

于 2012-10-03T22:46:09.750 回答
2

不太明白为什么你最终会占用太多内存来计算O(n^2)一对项目的相关性。正如维基百科文章指出的那样,要计算皮尔逊相关性, 在此处输入图像描述

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

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

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


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


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

另一种方法是尝试局部敏感散列

于 2012-10-26T21:08:42.997 回答
0

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

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

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

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

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

于 2013-02-25T12:18:03.180 回答