代码在python中。我将二进制模型加载到python上的gensim,&使用" init_sims"选项使执行更快。操作系统是OS X. 加载它需要将近50-60秒。并且找到" most_similar"的等效时间。这是正常的吗?在使用init_sims选项之前,它花了几乎两倍的时间!我觉得这可能是OS RAM分配问题。
model=Word2Vec.load_word2vec_format('GoogleNewsvectorsnegative300.bin',binary=True)
model.init_sims(replace=True)
model.save('SmallerFile')
#MODEL SAVED INTO SMALLERFILE & NEXT LOAD FROM IT
model=Word2Vec.load('SmallerFile',mmap='r')
#GIVE RESULT SER!
print model.most_similar(positive=['woman', 'king'], negative=['man'])
答案 0 :(得分:4)
请注意,init_sims(replace=True)
的内存节省效果在保存/加载周期内不会持续存在,因为保存始终会保存“原始”内容。向量(可以从中重新计算单位归一化向量)。因此,即使在重新加载后,当您第一次呼叫most_similar()
时,将在后台调用init_sims()
,并且内存使用量将加倍。
并且,GoogleNews数据集相当大,甚至在单位规范化可能使内存使用量翻倍之前,需要加载3 GB以上。因此,根据您运行的其他内容和计算机的RAM,您可能会在most_similar()
计算运行时使用交换内存 - 这对于计算 - 来说非常慢每个矢量和排序结果相似性操作。 (仍然,在第一次赢得之后的任何most_similar()
检查都需要重新填充单位规范化的向量缓存,因此应该比第一次调用更快。)
鉴于您已在init_sims(replace=True)
之后保存了模型,其原始向量已经过单位规范化。因此,您可以在load()
:
model.syn0norm = model.syn0
然后,即使你的第一个most_similar()
只会查询(单个,内存映射的)向量集,而不会触发init_sims()
。
如果这仍然太慢,您可能需要更多内存或将向量修剪为子集。 GoogleNews向量似乎被排序为最常见的最常用词,因此抛出最后10%,50%甚至90%可能仍然会为您提供一组最常用的单词。 (您需要通过查看模型对象和源代码来自行执行此修剪。)
最后,您可以使用最近邻居索引来获得更快的前N个匹配,但代价是额外的内存和近似结果(可能会错过一些真正的前N个匹配)。在gensim annoytutorial.ipynb目录中的docs/notebooks
IPython笔记本中,有一个IPython笔记本教程,最近的gensim版本是演示IPython笔记本的IPython笔记本。