我正在使用GENSIM
一个包含 50000 个文档的语料库以及一个包含大约 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
编辑:
使用内存分析器解决了内存问题。在那个循环中还有其他东西导致它急剧上升。
让我详细解释一下目的。想象一下,我们正在处理各种食谱(每个食谱都是文档),字典中的每个项目都是一种成分。在下面找到六个这样的食谱。
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 之间的权重(其中权重较高的成分是最重要或最独特的)。实现这一目标的最佳方法是什么。