Probé varios métodos para cargar los vectores word2vec de 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')Lo anterior da:
MemoryError: Error assigning 18446744072820359357 bytesTambién probé con los vectores empaquetados .gz; o cargándolos y guardándolos con gensim en un nuevo formato:
from gensim.models.word2vec import Word2Vec model = Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True) model.save_word2vec_format('googlenews2.txt')Este archivo contiene las palabras y sus vectores de palabras en cada línea. Intenté cargarlos con:
en_nlp.vocab.load_vectors('googlenews2.txt')pero devuelve "0".
¿Cuál es la forma correcta de hacer esto?
Actualizar:
Puedo cargar mi propio archivo creado en spacy. Uso un archivo test.txt con "string 0.0 0.0 ...." en cada línea. Luego comprima este txt con .bzip2 en test.txt.bz2. Luego creo un archivo binario compatible con espacio:
spacy.vocab.write_binary_vectors('test.txt.bz2', 'test.bin')Que puedo cargar en espaciosos:
nlp.vocab.load_vectors_from_bin_loc('test.bin')¡Esto funciona! Sin embargo, cuando hago el mismo proceso para googlenews2.txt, aparece el siguiente error:
lib/python3.6/site-packages/spacy/cfile.pyx in spacy.cfile.CFile.read_into (spacy/cfile.cpp:1279)() OSError:Para spacy 1.x, cargue los vectores de noticias de Google en gensim y conviértalos a un nuevo formato (cada línea en .txt contiene un solo vector: cadena, 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')Elimina la primera línea del .txt:
tail -n +2 googlenews.txt > googlenews.new && mv -f googlenews.new googlenews.txtComprima el txt como .bz2:
bzip2 googlenews.txtCree un archivo binario compatible con SpaCy:
spacy.vocab.write_binary_vectors('googlenews.txt.bz2','googlenews.bin')Mueva googlenews.bin a /lib/python/site-packages/spacy/data/en_google-1.0.0/vocab/googlenews.bin de su entorno de python.
Luego carga los vectores de palabras:
import spacy nlp = spacy.load('en',vectors='en_google')o cargarlos después más tarde:
nlp.vocab.load_vectors_from_bin_loc('googlenews.bin')Sé que esta pregunta ya ha sido respondida, pero voy a ofrecer una solución más simple. Esta solución cargará vectores de noticias de Google en un objeto nlp espacioso en blanco.
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)Estoy usando spaCy v2.0.10.
Cree un archivo binario compatible con SpaCy:
spacy.vocab.write_binary_vectors('googlenews.txt.bz2','googlenews.bin')
Quiero resaltar que el código específico en la respuesta aceptada no funciona ahora. Encontré "AttributeError: ..." cuando ejecuto el código.
Esto ha cambiado en spaCy v2. write_binary_vectors se eliminó en v2. De la documentación de spaCy , la forma actual de hacer esto es la siguiente:
$ python -m spacy init-model en /path/to/output -v /path/to/vectors.bin.tar.gz