【问题标题】:Topic-based text and user similarity基于主题的文本和用户相似度
【发布时间】:2012-10-03 17:32:57
【问题描述】:

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

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

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

我正在使用 numpy。

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

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 只是为了理解:gensim 会为我做的是降维(使用 lsi 或 lda),对吗?它仍然会使用皮尔逊相关性之类的东西来寻找相似之处,对吧?
    【解决方案2】:

    不太明白为什么您最终会占用太多内存来计算O(n^2) 项目对的相关性。正如维基百科文章指出的那样,要计算 Pearson 相关性,

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

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

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


    众所周知,Gensim 能够在合理的时间范围内以适度的内存要求(this,了解他们使用 MacBook Pro、Intel Core i7 2.3GHz、16GB DDR3 RAM 在 8.2GB 数据集上所做的实验。我认为这是一个比您拥有的更大的数据集。


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

    另一种方法是尝试locality sensitive hashing

    【讨论】:

      【解决方案3】:

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

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

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

      • 获取您的文档的查询,然后根据查询对您的虚假文档执行搜索。

      我们发现这种方式很方便。

      【讨论】:

      • 建议怎么样?你如何代表你的用户?
      • 我认为你可以将用户表示为他访问过的页面,一次访问算一次。这应该是可行的。
      • 关于您的记忆不足问题:“向量的长度约为 10k”,这意味着您有 ~10, 000 个主题,我认为这太大了。在我们的案例中,我们有 20k 文档和只有 512 个主题,我们发现结果是可以接受的。
      • 查看我的新项目github.com/guokr/simbase,它可以帮助您计算向量集的相似性。
      猜你喜欢
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 2018-02-20
      • 1970-01-01
      相关资源
      最近更新 更多