【问题标题】:Gensim Similarity with very large dataset (~4.7 million)Gensim 与非常大的数据集的相似性(约 470 万)
【发布时间】:2020-03-11 03:42:44
【问题描述】:

我有一个包含 470 万个问题的数据集,我想比较它们的 tf-idf 向量并为每个问题检索最相似的对。

根据 gensim 文档,

当您需要索引中的文档相似度时,还有一种特殊的语法

到索引本身(即查询=索引文档本身)。这种特殊的语法

在内部使用更快的批量查询,非常适合所有与所有成对相似性

for similarities in index: # yield similarities of the 1st indexed document, then 2nd... ...

pass

但是,由于我有大约 470 万个文档,similarities 应该是一个长度为 470 万的 numpy 数组,这也非常大,我无法存储在内存中。

index = Similarity.load('out/corpus.index')
idx1 = 0
for similarities in index: # <---- this part is slow
  idx1 += 1
  # and other stuff

有没有一种方法可以为每个问题找到最相似的配对?

【问题讨论】:

  • 无论如何,您必须遍历整个索引才能解决您的问题。为了加快这个过程,如果问题相互独立,您是否可以在同一遍中检查多个问题?
  • 澄清一下,我的问题是没有足够的内存来存储生成的numpy数组,所以系统开始使用交换空间,这使得它变慢了。我想知道是否有一种方法可以做到这一点,而无需一次生成整个数组并将其加载到内存中

标签: python gensim


【解决方案1】:

Similarity 类似乎支持将索引拆分为磁盘上的多个文件,这些文件可能都被内存映射到可寻址空间,但这并不一定意味着它实际上一次都在 RAM 中。

但是,正如@green-cloak-guy 在他的评论中指出的那样,要与所有文档进行比较,在这些计算过程中,您至少必须将所有文档从磁盘循环到内存中。因此,即使模型不是从它们全部在 RAM 中开始,执行某些操作也会导致它们全部被带入(尽管不是一次全部)。而且,无论是通过交换还是其他机制发生,都需要类似数量的 I/O。

因此,如果您看到的唯一症状是在执行全索引操作时进行交换,那么这将是任何解决方案所固有的——Similarity 类可能已经在执行您的请求——将范围的加载推迟到他们是需要的。

【讨论】:

    猜你喜欢
    • 2019-05-21
    • 2018-02-28
    • 2019-04-29
    • 2014-06-23
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    相关资源
    最近更新 更多