使用Gensim对每个文档中的特征进行评分.也是一个Python内存问题

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

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

我需要一种更好的方法来实现这一点,因为我的系统在大约1000次迭代时耗尽了8 GB内存.实际上没有理由让内存继续上升,因为我只是在迭代期间重新分配它.令人惊讶的是,只有在大约200次迭代后,内存才开始上升.

>为什么内存问题?怎么解决?
>有没有更好的方法来找到特定文档中最高得分的特征(不是主题)?

这是一段耗尽内存的代码片段:

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

编辑:

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

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

语料库= [[橄榄油,番茄,Brocolli,牛至],[大蒜,橄榄油,面包,奶酪,牛至],[牛油果,豆类,奶酪,酸橙],[Jalepeneo,石灰,番茄,玉米饼,酸奶油], [辣椒酱,醋,蘑菇,米饭],[酱油,面条,Brocolli,生姜,醋]]

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

最佳答案 让我们打破这个:

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

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

此矩阵的行应该是您要查找的“文档权重”,一行是一行.
>列表中的list()调用(lsi [corpus])会使您的代码效率低下.它基本上将整个doc-topic矩阵序列化为RAM.删除列表()并直接使用流式版本,它的内存效率更高:index = MatrixSimilarity(lsi [corpus],num_features = lsi.num_topics).
> LSI通常比正则化输入更好.考虑通过例如转换简单的词袋矢量(=整数).在将其传递给LSI之前进行TF-IDFlog entropy转换.

点赞