web-dev-qa-db-ja.com

SpaCy:GoogleニュースWord2vecベクターを読み込む方法

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: 
18
Jasper

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')
22
Jasper

この質問にはすでに答えられていることは知っていますが、より簡単な解決策を提供します。このソリューションは、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)
8
Nate Raw

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
1
cedrickchee

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
1
Evan