Jas*_*per 19 python nlp word2vec spacy
我尝试了几种加载google news 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')
Run Code Online (Sandbox Code Playgroud)
以上给出:
MemoryError: Error assigning 18446744072820359357 bytes
Run Code Online (Sandbox Code Playgroud)
我也试过.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')
Run Code Online (Sandbox Code Playgroud)
然后,该文件包含每行上的单词及其单词向量.我试着加载它们:
en_nlp.vocab.load_vectors('googlenews2.txt')
Run Code Online (Sandbox Code Playgroud)
但它返回"0".
这样做的正确方法是什么?
更新:
我可以将自己创建的文件加载到spacy中.我在每一行使用带有"string 0.0 0.0 ...."的test.txt文件.然后使用.bzip2将此txt压缩到test.txt.bz2.然后我创建一个spacy兼容的二进制文件:
spacy.vocab.write_binary_vectors('test.txt.bz2', 'test.bin')
Run Code Online (Sandbox Code Playgroud)
我可以加载到spacy:
nlp.vocab.load_vectors_from_bin_loc('test.bin')
Run Code Online (Sandbox Code Playgroud)
这有效!但是,当我为googlenews2.txt执行相同的过程时,我收到以下错误:
lib/python3.6/site-packages/spacy/cfile.pyx in spacy.cfile.CFile.read_into (spacy/cfile.cpp:1279)()
OSError:
Run Code Online (Sandbox Code Playgroud)
Jas*_*per 22
对于spacy 1.x,将Google新闻向量加载到gensim并转换为新格式(.txt中的每一行包含一个向量: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')
Run Code Online (Sandbox Code Playgroud)
删除.txt的第一行:
tail -n +2 googlenews.txt > googlenews.new && mv -f googlenews.new googlenews.txt
Run Code Online (Sandbox Code Playgroud)
将txt压缩为.bz2:
bzip2 googlenews.txt
Run Code Online (Sandbox Code Playgroud)
创建SpaCy兼容的二进制文件:
spacy.vocab.write_binary_vectors('googlenews.txt.bz2','googlenews.bin')
Run Code Online (Sandbox Code Playgroud)
将googlenews.bin移至python环境的/lib/python/site-packages/spacy/data/en_google-1.0.0/vocab/googlenews.bin.
然后加载wordvectors:
import spacy
nlp = spacy.load('en',vectors='en_google')
Run Code Online (Sandbox Code Playgroud)
或者在以后加载它们:
nlp.vocab.load_vectors_from_bin_loc('googlenews.bin')
Run Code Online (Sandbox Code Playgroud)
我知道已经回答了这个问题,但是我将提供一个更简单的解决方案。此解决方案会将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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9117 次 |
| 最近记录: |