SpaCy: как загрузить текстовые объявления word2vec в Google?

Я пробовал несколько способов загрузки векселей word2vec в новостях google (https://code.google.com/archive/p/word2vec/):

en_nlp = spacy.load('en',vector=False)
en_nlp.vocab.load_vectors_from_bin_loc('GoogleNews-vectors-negative300.bin')

Вышеприведенное дает:

MemoryError: Error assigning 18446744072820359357 bytes

Я также пытался использовать упакованные векторы.gz; или путем загрузки и сохранения их с помощью gensim в новый формат:

from gensim.models.word2vec import Word2Vec
model = Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
model.save_word2vec_format('googlenews2.txt')

Затем этот файл содержит слова и их векторы слов в каждой строке. Я попытался загрузить их с помощью:

en_nlp.vocab.load_vectors('googlenews2.txt')

но он возвращает "0".

Каков правильный способ сделать это?

Обновить:

Я могу загрузить свой собственный файл в spacy. Я использую файл test.txt с "строкой 0.0 0.0...." в каждой строке. Затем запишите этот txt с.bzip2 в test.txt.bz2. Затем я создаю совместимый двоичный файл:

spacy.vocab.write_binary_vectors('test.txt.bz2', 'test.bin')

Что я могу загрузить в spacy:

nlp.vocab.load_vectors_from_bin_loc('test.bin')

Это работает! Однако, когда я делаю тот же процесс для googlenews2.txt, я получаю следующую ошибку:

lib/python3.6/site-packages/spacy/cfile.pyx in spacy.cfile.CFile.read_into (spacy/cfile.cpp:1279)()

OSError: 

Ответ 1

Для spacy 1.x загрузите векторы новостей Google в gensim и конвертируйте в новый формат (каждая строка в.txt содержит один вектор: string, vec):

from gensim.models.word2vec import Word2Vec
from gensim.models import KeyedVectors
model = KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
model.wv.save_word2vec_format('googlenews.txt')

Удалите первую строку.txt:

tail -n +2 googlenews.txt > googlenews.new && mv -f googlenews.new googlenews.txt

Сжатие txt как.bz2:

bzip2 googlenews.txt

Создайте совместимый с SpaCy двоичный файл:

spacy.vocab.write_binary_vectors('googlenews.txt.bz2','googlenews.bin')

Переместите файл googlenews.bin в /lib/python/site-packages/spacy/data/en_google-1.0.0/vocab/googlenews.bin вашей среды python.

Затем загрузите wordvectors:

import spacy
nlp = spacy.load('en',vectors='en_google')

или загрузить их позже:

nlp.vocab.load_vectors_from_bin_loc('googlenews.bin')

Ответ 2

Я знаю, что на этот вопрос уже был дан ответ, но я собираюсь предложить более простое решение. Это решение будет загружать векторы новостей Google в пустой объект spy nlp.

import gensim
import spacy

# Path to google news vectors
google_news_path = "path\to\google\news\\GoogleNews-vectors-negative300.bin.gz"

# Load google news vecs in gensim
model = gensim.models.KeyedVectors.load_word2vec_format(gn_path, binary=True)

# Init blank english spacy nlp object
nlp = spacy.blank('en')

# Loop through range of all indexes, get words associated with each index.
# The words in the keys list will correspond to the order of the google embed matrix
keys = []
for idx in range(3000000):
    keys.append(model.index2word[idx])

# Set the vectors for our nlp object to the google news vectors
nlp.vocab.vectors = spacy.vocab.Vectors(data=model.syn0, keys=keys)

>>> nlp.vocab.vectors.shape
(3000000, 300)

Ответ 3

Я использую spaCy v2.0.10.

Создайте совместимый с SpaCy двоичный файл:

spacy.vocab.write_binary_vectors('googlenews.txt.bz2','googlenews.bin')

Я хочу подчеркнуть, что конкретный код в принятом ответе не работает сейчас. Когда я запускаю код, я столкнулся с "AttributeError:...".

Это изменилось в spaCy v2. write_binary_vectors был удален в v2. Из документации spaCy, текущий способ сделать это выглядит следующим образом:

$ python -m spacy init-model en /path/to/output -v /path/to/vectors.bin.tar.gz

Ответ 4

гораздо проще использовать gensim api для загрузки текстовой сжатой модели word2vec с помощью google, она будет храниться в /home/"your_username"/gensim-data/word2vec-google-news-300/. Загрузите векторы и играйте в мяч. У меня 16 ГБ оперативной памяти, которой более чем достаточно для обработки модели

import gensim.downloader as api

model = api.load("word2vec-google-news-300")  # download the model and return as object ready for use
word_vectors = model.wv #load the vectors from the model