web-dev-qa-db-fra.com

SpaCy: comment charger les nouvelles vecteurs de Google Word2vec?

J'ai essayé plusieurs méthodes de chargement des vecteurs Word2vec dans Google News ( 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')

Ce qui précède donne:

MemoryError: Error assigning 18446744072820359357 bytes

J'ai également essayé avec les vecteurs compressés .gz; ou en les chargeant et en les sauvegardant avec gensim dans un nouveau format:

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

Ce fichier contient ensuite les mots et leurs vecteurs Word sur chaque ligne .J'ai essayé de les charger avec:

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

mais il retourne "0".

Quelle est la bonne façon de faire cela?

Mettre à jour:

Je peux charger mon propre fichier créé dans spacy . J'utilise un fichier test.txt avec "chaîne 0.0 0.0 ...." sur chaque ligne. Ensuite, compressez ce txt avec .bzip2 en test.txt.bz2 . Ensuite, je crée un fichier binaire compatible avec spacy:

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

Que je peux charger dans Spacy:

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

Cela fonctionne! Cependant, lorsque je fais le même processus pour le googlenews2.txt, j'obtiens l'erreur suivante:

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

OSError: 
15
Jasper

Pour spacy 1.x, chargez les vecteurs d'actualités Google dans Gensim et convertissez-les dans un nouveau format (chaque ligne du fichier .txt contient un seul vecteur: 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')

Supprimez la première ligne du fichier .txt:

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

Compressez le txt au format .bz2:

bzip2 googlenews.txt

Créez un fichier binaire compatible SpaCy:

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

Déplacez googlenews.bin vers /lib/python/site-packages/spacy/data/en_google-1.0.0/vocab/googlenews.bin de votre environnement python.

Puis chargez les vecteurs de mots:

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

ou les charger après plus tard:

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

Je sais que cette question a déjà reçu une réponse, mais je vais proposer une solution plus simple. Cette solution chargera les vecteurs de nouvelles Google dans un objet spacy nlp vierge.

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

J'utilise SpaCy v2.0.10.

Créez un fichier binaire compatible SpaCy:

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

Je tiens à souligner que le code spécifique dans la réponse acceptée ne fonctionne pas maintenant. J'ai rencontré "AttributeError: ..." lorsque je lance le code.

Cela a changé dans SpaCy v2. write_binary_vectors a été supprimé dans la v2. A partir de documentation de spaCy , la manière actuelle de procéder est la suivante:

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

il est beaucoup plus facile d’utiliser l’API Gensim pour télécharger le modèle compressé Word2vec par Google, il sera stocké dans /home/"your_username"/gensim-data/Word2vec-google-news-300/. Chargez les vecteurs et jouez au ballon. J'ai 16 Go de RAM ce qui est plus que suffisant pour gérer le modèle

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