ошибка памяти при использовании gensim для загрузки word2vec - PullRequest
0 голосов
/ 23 мая 2018

Я использую библиотеку 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

Кто-нибудь может мне помочь?спасибо.

1 Ответ

0 голосов
/ 23 мая 2018

Загрузка только необработанных векторов займет ...

3 000 000 слов * 300 измерений * 4 байта / измерение = 3,6 ГБ

... адресуемой памяти (плюс некоторые накладные расходы дляслово-ключ к карте положения индекса).

Кроме того, как только вы захотите выполнить операцию типа most_similar(), будут созданы нормализованные версии векторов с единичной длиной, для чего потребуется еще 3,6 ГБ.(Вместо этого вы можете засорять необработанные векторы на месте, сохраняя эту дополнительную память, если вы будете только сравнивать косинусоподобие между единичными нормированными векторами, выполнив 1-е вынужденное явное model.init_sims(replace=True).)

Таким образом, вы, как правило, хотите выполнять полные операции только на машине с ОЗУ не менее 8 ГБ.(Любой обмен во время поиска в полном массиве most_similar() сделает операции очень медленными.)

Если бы что-то еще использовало пространство кучи Python, это могло бы составить MemoryError, которое вы видели.

Метод load_word2vec_format() также имеет необязательный аргумент limit, который будет загружать только указанное число векторов - так что вы можете использовать limit=500000, чтобы сократить требования к памяти примерно на 5/6.(И, поскольку GoogleNews и другие наборы векторов обычно упорядочены от наиболее редко встречающихся слов, вы получите наиболее часто встречающиеся слова размером 500 Кбайт. Слова с более низкой частотой обычно имеют гораздо меньшее значение и даже не так, как слова.хорошие векторы, поэтому их игнорирование может не повредить.)

...