Googleニュースの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にロードできます。各行に「string 0.0 0.0 ....」を含むtest.txtファイルを使用します。次に、この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:
Spacy 1.xの場合、Googleニュースベクターをgensimにロードし、新しい形式に変換します(.txtの各行には単一のベクター:文字列、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をpython環境の/lib/python/site-packages/spacy/data/en_google-1.0.0/vocab/googlenews.binに移動します。
次に、ワードベクトルをロードします。
import spacy
nlp = spacy.load('en',vectors='en_google')
または後で読み込みます:
nlp.vocab.load_vectors_from_bin_loc('googlenews.bin')
この質問にはすでに答えられていることは知っていますが、より簡単な解決策を提供します。このソリューションは、Googleニュースベクターを空の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
googleでWord2vec圧縮モデルをダウンロードするためにgensim apiを使用する方がはるかに簡単で、/home/"your_username"/gensim-data/Word2vec-google-news-300/
。ベクトルをロードし、ボールをプレイします。 16GBのRAMで、モデルを処理するのに十分です
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