webentwicklung-frage-antwort-db.com.de

SpaCy: Wie lädt man die Word2vec-Vektoren von Google?

Ich habe verschiedene Methoden zum Laden der Google News-Word2vec-Vektoren ausprobiert ( 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')

Das oben genannte gibt an:

MemoryError: Error assigning 18446744072820359357 bytes

Ich habe auch mit den .gz-gepackten Vektoren versucht; oder indem Sie sie mit gensim in ein neues Format laden und speichern:

from gensim.models.Word2vec import Word2Vec
model = Word2Vec.load_Word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
model.save_Word2vec_format('googlenews2.txt')

Diese Datei enthält dann die Wörter und ihre Word-Vektoren in jeder Zeile ... Ich habe versucht, sie mit zu laden:

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

aber es gibt "0" zurück.

Was ist der richtige Weg, dies zu tun?

Update:

Ich kann meine eigene erstellte Datei in spacy..__ laden. Ich verwende eine test.txt-Datei mit "Zeichenfolge 0.0 0.0 ...." in jeder Zeile. Dann packen Sie dieses TXT mit .bzip2 in test.txt.bz2 . Dann erstelle ich eine spacy kompatible Binärdatei:

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

Dass ich in Spacy laden kann:

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

Das funktioniert! __. Wenn ich jedoch den gleichen Vorgang für googlenews2.txt durchführe, erhalte ich die folgende Fehlermeldung:

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

OSError: 
15
Jasper

Für spacy 1.x laden Sie Google News-Vektoren in gensim und konvertieren sie in ein neues Format (jede Zeile in .txt enthält einen einzelnen Vektor: 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')

Entfernen Sie die erste Zeile der .txt:

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

Komprimieren Sie den Text als .bz2:

bzip2 googlenews.txt

Erstellen Sie eine SpaCy-kompatible Binärdatei:

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

Verschieben Sie die googlenews.bin in die Datei /lib/python/site-packages/spacy/data/en_google-1.0.0/vocab/googlenews.bin Ihrer Python-Umgebung.

Laden Sie dann die Wortvektoren:

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

oder laden Sie sie später

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

Ich weiß, dass diese Frage bereits beantwortet wurde, aber ich werde eine einfachere Lösung anbieten. Diese Lösung lädt Google News-Vektoren in ein leeres, spyhaftes NLP-Objekt.

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)
4
Nate Raw

Ich verwende spaCy v2.0.10.

Erstellen Sie eine SpaCy-kompatible Binärdatei:

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

Ich möchte hervorheben, dass der spezifische Code in der akzeptierten Antwort jetzt nicht funktioniert. Ich stieß auf "AttributeError: ...", wenn ich den Code ausführte.

Dies hat sich in spaCy v2 geändert. write_binary_vectors wurde in v2 entfernt. Aus spaCy-Dokumentationen sieht dies derzeit folgendermaßen aus:

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

es ist viel einfacher, das gensim api für das Herunterladen des komprimierten Word2vec-Modells über Google zu verwenden. Es wird in /home/"your_username"/gensim-data/Word2vec-google-news-300/ gespeichert. Laden Sie die Vektoren und spielen Sie den Ball. Ich habe 16 GB RAM, was für das Modell mehr als ausreichend ist

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