Word2Vec:使用 Gensim 和 Google-News 数据集 - 执行时间非常慢

Nac*_*gam 5 python gensim word2vec

代码在 python 中。我在 python 上将二进制模型加载到 gensim 中,并使用“init_sims”选项使执行速度更快。操作系统是 OS X。加载它需要将近 50-60 秒。以及找到“most_similar”的等效时间。这是正常的吗?在使用 init_sims 选项之前,几乎花费了两倍的时间!我有一种感觉,这可能是操作系统 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'])
Run Code Online (Sandbox Code Playgroud)

goj*_*omo 5

请注意, 的内存节省效果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
Run Code Online (Sandbox Code Playgroud)

然后,即使您的第一个most_similar()也只会查询(单个,内存映射)向量集,而不会触发init_sims().

如果这仍然太慢,您可能需要更多内存或将向量修剪为一个子集。GoogleNews 的向量似乎是按照最常用的词排在最前面的,所以去掉最后的 10%、50%、甚至 90% 可能仍然会给你留下一组最常用的词。(您需要通过查看模型对象和源代码来自己执行此修剪。)

最后,您可以使用最近邻索引来获得更快的前 N ​​个匹配,但以额外的内存和近似结果为代价(可能会错过一些真正的前 N ​​个匹配)。有近gensim版本的IPython的笔记本教程在annoytutorial.ipynb演示IPython的笔记本IPython的笔记本,在gensimdocs/notebooks目录。