我在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-IDF或log entropy转换.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。