SpaCy:как загрузить Google news word2vec векторы?
Я пробовал несколько методов загрузки векторов Google news word2vec (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. Я использую тест.txt-файл с " строкой 0.0 0.0 ...."на каждой линии. Затем застегните этот txt .помощи bzip2 для тестирования.тхт.bz2 файл. Затем я создаю двоичный файл, совместимый с spacy:
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:
4 ответов
для spacy 1.x, загрузите векторы Google news в 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 to/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')
Я знаю, что на этот вопрос уже дан ответ, но я собираюсь предложить более простое решение. Это решение загрузит векторы Google news в пустой объект spacy 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)
Я использую spaCy v2.0.10.
создать spaCy совместимый двоичный файл:
spacy.vocab.write_binary_vectors('googlenews.txt.bz2','googlenews.bin')
Я хочу подчеркнуть, что конкретный код в принятом ответе сейчас не работает. Я столкнулся с "AttributeError: ..."когда я запускаю код.
Это изменилось в spaCy v2. write_binary_vectors
был удален в v2. От spaCy documentations нынешний способ сделать это следующим образом:
$ python -m spacy init-model en /path/to/output -v /path/to/vectors.bin.tar.gz
гораздо проще использовать api gensim для загрузки сжатой модели word2vec с помощью google, она будет храниться в /home/"your_username"/gensim-data/word2vec-google-news-300/
. Загрузите векторы и играйте в мяч. У меня есть 16GB ОЗУ, которого более чем достаточно для обработки модели
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