首页 > 解决方案 > 使用 gensim 加载 word2vec 时出现内存错误

问题描述

我正在使用 gensim 库从 GoogleNews 数据集中加载预训练的词向量。该数据集包含 3000000 个词向量,每个词向量 300 个维度。当我想加载 GoogleNews 数据集时,我收到了内存错误。我之前试过这段代码没有内存错误,我不知道为什么我现在收到这个错误。我已经检查了很多网站来解决这个问题,但我无法理解。这是我加载 GoogleNews 的代码:

import gensim.models.keyedvectors as word2vec
model=word2vec.KeyedVectors.load_word2vec_format("GoogleNews-vectors-negative300.bin",binary=True)

这是我收到的错误:

File "/home/mahsa/PycharmProjects/tensor_env_project/word_embedding_DUC2007/inspect_word2vec-master/word_embeddings_GoogleNews.py", line 8, in <module>
    model=word2vec.KeyedVectors.load_word2vec_format("GoogleNews-vectors-negative300.bin",binary=True)
  File "/home/mahsa/anaconda3/envs/tensorflow_env/lib/python3.5/site-packages/gensim/models/keyedvectors.py", line 212, in load_word2vec_format
    result.syn0 = zeros((vocab_size, vector_size), dtype=datatype)
MemoryError

有谁能够帮我?谢谢。

标签: pythonword2vecgensimword-embeddinggoogle-news

解决方案


仅加载原始向量将需要...

3,000,000 字 * 300 维度 * 4 字节/维度 = 3.6GB

...可寻址内存(加上单词键到索引位置映射的一些开销)。

此外,只要您想要执行most_similar()-type 操作,就会创建向量的单位长度标准化版本——这将需要另外 3.6GB。(如果您只在单位范数向量之间进行余弦相似性比较,则可以改为将原始向量破坏到位,从而节省额外的内存,首先执行强制显式model.init_sims(replace=True).)

因此,您通常只想在至少有 8GB RAM 的机器上执行完整操作。(在全数组most_similar()查找期间进行任何交换都会使操作变得非常缓慢。)

如果其他任何东西都在使用 Python 堆空间,那可能是MemoryError您看到的原因。

load_word2vec_format()方法还有一个可选limit参数,它只会加载提供的向量数量——因此您可以使用它limit=500000来减少大约 5/6 的内存需求。(而且,由于 theGoogleNews和其他向量集通常是从最频繁的词到最不频繁的词排序的,所以你会得到 500K 最频繁的词。低频词的价值通常要小得多,甚至不是那么好的向量,所以忽略它们可能不会有太大的伤害。)


推荐阅读