4

我正在使用GENSIM一个包含 50000 个文档的语料库以及一个包含大约 4000 个特征的字典。我也有一个LSI已经准备好的模型。

现在我想为每个添加的文档找到匹配度最高的特征。为了找到特定文档中的最佳特征,我正在为所有文档上的每个特征运行 gensim 的相似性模块。这为我们以后要使用的每个功能提供了一个分数。但正如您可以想象的那样,这是一个代价高昂的过程,因为我们必须迭代超过 50000 个索引并在每个索引上运行 4000 次相似性迭代。

我需要一种更好的方法来执行此操作,因为我在大约 1000 次迭代时用完了系统上的 8 GB 内存。实际上没有理由让内存不断增加,因为我只是在迭代期间重新分配它。令人惊讶的是,内存仅在大约 200 次迭代后才开始上升。

  1. 为什么会出现内存问题?如何解决?
  2. 有没有更好的方法来找到特定文档(不是主题)中得分最高的特征?

这是内存不足的代码片段:

dictionary = corpora.Dictionary.load('features-dict.dict')
corpus = corpora.MmCorpus('corpus.mm')
lsi = models.LsiModel.load('model.lsi')
corpus_lsi = lsi[corpus]
index = similarities.MatrixSimilarity(list(corpus_lsi))
newDict = dict()

for feature in dictionary.token2id.keys():
  vec_bow = dictionary.doc2bow([feature])
  vec_lsi = lsi[vec_bow]
  sims = index[vec_lsi]
  li = sorted(enumerate(sims * 100), key=lambda item: -item[1])

  for data in li:
    dict[data[0]] = (feature,data[1]) # Store feature and score for each document


# Do something with the dict created above

编辑:

使用内存分析器解决了内存问题。在那个循环中还有其他东西导致它急剧上升。

让我详细解释一下目的。想象一下,我们正在处理各种食谱(每个食谱都是文档),字典中的每个项目都是一种成分。在下面找到六个这样的食谱。

corpus = [[Olive Oil, Tomato, Brocolli, Oregano], [Garlic, Olive Oil, Bread, Cheese, Oregano], [Avocado, Beans, Cheese, Lime], [Jalepeneo, Lime, Tomato, Tortilla, Sour Cream], [Chili Sauce, Vinegar, Mushrooms, Rice], [Soy Sauce, Noodles, Brocolli, Ginger, Vinegar]]

有成千上万种这样的食谱。我想要实现的是为每种成分分配 0 到 100 之间的权重(其中权重较高的成分是最重要或最独特的)。实现这一目标的最佳方法是什么。

4

1 回答 1

2

让我们分解一下:

  1. 除非我误解了你的目的,你可以简单地使用左奇异向量lsi.projection.u来获得你的权重:

    # create #features x #corpus 2D matrix of weights
    doc_feature_matrix = numpy.dot(lsi.projection.u, index.index.T)
    

    该矩阵的行应该是您要查找的“文档权重”,一行对应一个特征。

  2. list()在你的调用list(lsi[corpus])使你的代码非常低效。它基本上将整个文档主题矩阵序列化到 RAM 中。删除list()并直接使用流版本,它的内存效率更高:index = MatrixSimilarity(lsi[corpus], num_features=lsi.num_topics).

  3. LSI 通常比正则化输入效果更好。在将其传递给 LSI 之前,考虑通过例如TF-IDF对数熵转换来转换普通的词袋向量(=整数) 。

于 2014-04-24T17:50:01.827 回答