Gensim内置model.load函数和PythonPickle.load文件
Gensim built-in model.load function and Python Pickle.load file
我正在尝试使用 Gensim 导入一些英文单词的 GoogelNews 预训练模型(这里采样的 15 个仅存储在一个 txt 文件中,每行一个,并且没有更多上下文作为语料库)。然后我可以使用 "model.most_similar()" 为他们获取类似的 words/phrases。但实际上从Python-Pickle方法加载的文件不能直接用于gensim内置的model.load()
和model.most_similar()
函数。
由于无法从头开始训练并保存和加载模型,我应该如何对这 15 个英语单词(以及将来更多)进行聚类?
import gensim
from gensim.models import Word2Vec
from gensim.models.keyedvectors import KeyedVectors
GOOGLE_WORD2VEC_MODEL = '../GoogleNews-vectors-negative300.bin'
GOOGLE_ENGLISH_WORD_PATH = '../testwords.txt'
GOOGLE_WORD_FEATURE = '../word.google.vector'
model = gensim.models.KeyedVectors.load_word2vec_format(GOOGLE_WORD2VEC_MODEL, binary=True)
word_vectors = {}
#load 15 words as a test to word_vectors
with open(GOOGLE_ENGLISH_WORD_PATH) as f:
lines = f.readlines()
for line in lines:
line = line.strip('\n')
if line:
word = line
print(line)
word_vectors[word]=None
try:
import cPickle
except :
import _pickle as cPickle
def save_model(clf,modelpath):
with open(modelpath, 'wb') as f:
cPickle.dump(clf, f)
def load_model(modelpath):
try:
with open(modelpath, 'rb') as f:
rf = cPickle.load(f)
return rf
except Exception as e:
return None
for word in word_vectors:
try:
v= model[word]
word_vectors[word] = v
except:
pass
save_model(word_vectors,GOOGLE_WORD_FEATURE)
words_set = load_model(GOOGLE_WORD_FEATURE)
words_set.most_similar("knit", topn=3)
---------------error message--------
AttributeError Traceback (most recent call last)
<ipython-input-8-86c15e366696> in <module>
----> 1 words_set.most_similar("knit", topn=3)
AttributeError: 'dict' object has no attribute 'most_similar'
---------------error message--------
您已将 word_vectors
定义为 Python dict
:
word_vectors = {}
然后您的 save_model()
函数只保存原始 dict
,而您的 load_model()
加载相同的原始 dict
。
此类字典对象不实现most_similar()
方法,该方法特定于KeyedVectors
接口(及相关类) gensim
。
因此,您必须将数据保留在类似 KeyedVectors
的对象中才能使用 most_similar()
。
幸运的是,您有几个选择。
如果您恰好需要 GoogleNews
文件中的 first 15 个单词(或前 15,000 个,等等),您可以使用可选的 limit
参数只读取那么多向量:
from gensim.models import KeyedVectors
model = KeyedVectors.load_word2vec_format(GOOGLE_WORD2VEC_MODEL, limit=15, binary=True)
或者,如果您真的需要 select 单词的任意子集,并将它们 assemble 到一个新的 KeyedVectors
实例中,您可以重复使用其中一个 类 inside gensim
而不是普通的 dict
,然后以稍微不同的方式添加向量:
# instead of a {} dict
word_vectors = KeyedVectors(model.vector_size) # re-use size from loaded model
...然后在您要添加的每个 word
的循环中...
# instead of `word_vectors[word] = _SOMETHING_`
word_vectors.add(word, model[word])
然后您将得到一个 word_vectors
,它是一个实际的 KeyedVectors
对象。虽然你 可以 通过普通的 Python-pickle 保存它,但那时你也可以使用 KeyedVectors
内置的 save()
和 load()
- 它们在大型矢量集上可能更有效(通过将大型原始矢量集保存为单独的文件,应与主文件一起保存)。例如:
word_vectors.save(GOOGLE_WORD_FEATURE)
...
words_set = KeyedVectors.load(GOOGLE_WORD_FEATURE)
words_set.most_similar("knit", topn=3) # should work
我正在尝试使用 Gensim 导入一些英文单词的 GoogelNews 预训练模型(这里采样的 15 个仅存储在一个 txt 文件中,每行一个,并且没有更多上下文作为语料库)。然后我可以使用 "model.most_similar()" 为他们获取类似的 words/phrases。但实际上从Python-Pickle方法加载的文件不能直接用于gensim内置的model.load()
和model.most_similar()
函数。
由于无法从头开始训练并保存和加载模型,我应该如何对这 15 个英语单词(以及将来更多)进行聚类?
import gensim
from gensim.models import Word2Vec
from gensim.models.keyedvectors import KeyedVectors
GOOGLE_WORD2VEC_MODEL = '../GoogleNews-vectors-negative300.bin'
GOOGLE_ENGLISH_WORD_PATH = '../testwords.txt'
GOOGLE_WORD_FEATURE = '../word.google.vector'
model = gensim.models.KeyedVectors.load_word2vec_format(GOOGLE_WORD2VEC_MODEL, binary=True)
word_vectors = {}
#load 15 words as a test to word_vectors
with open(GOOGLE_ENGLISH_WORD_PATH) as f:
lines = f.readlines()
for line in lines:
line = line.strip('\n')
if line:
word = line
print(line)
word_vectors[word]=None
try:
import cPickle
except :
import _pickle as cPickle
def save_model(clf,modelpath):
with open(modelpath, 'wb') as f:
cPickle.dump(clf, f)
def load_model(modelpath):
try:
with open(modelpath, 'rb') as f:
rf = cPickle.load(f)
return rf
except Exception as e:
return None
for word in word_vectors:
try:
v= model[word]
word_vectors[word] = v
except:
pass
save_model(word_vectors,GOOGLE_WORD_FEATURE)
words_set = load_model(GOOGLE_WORD_FEATURE)
words_set.most_similar("knit", topn=3)
---------------error message-------- AttributeError Traceback (most recent call last) <ipython-input-8-86c15e366696> in <module> ----> 1 words_set.most_similar("knit", topn=3) AttributeError: 'dict' object has no attribute 'most_similar' ---------------error message--------
您已将 word_vectors
定义为 Python dict
:
word_vectors = {}
然后您的 save_model()
函数只保存原始 dict
,而您的 load_model()
加载相同的原始 dict
。
此类字典对象不实现most_similar()
方法,该方法特定于KeyedVectors
接口(及相关类) gensim
。
因此,您必须将数据保留在类似 KeyedVectors
的对象中才能使用 most_similar()
。
幸运的是,您有几个选择。
如果您恰好需要 GoogleNews
文件中的 first 15 个单词(或前 15,000 个,等等),您可以使用可选的 limit
参数只读取那么多向量:
from gensim.models import KeyedVectors
model = KeyedVectors.load_word2vec_format(GOOGLE_WORD2VEC_MODEL, limit=15, binary=True)
或者,如果您真的需要 select 单词的任意子集,并将它们 assemble 到一个新的 KeyedVectors
实例中,您可以重复使用其中一个 类 inside gensim
而不是普通的 dict
,然后以稍微不同的方式添加向量:
# instead of a {} dict
word_vectors = KeyedVectors(model.vector_size) # re-use size from loaded model
...然后在您要添加的每个 word
的循环中...
# instead of `word_vectors[word] = _SOMETHING_`
word_vectors.add(word, model[word])
然后您将得到一个 word_vectors
,它是一个实际的 KeyedVectors
对象。虽然你 可以 通过普通的 Python-pickle 保存它,但那时你也可以使用 KeyedVectors
内置的 save()
和 load()
- 它们在大型矢量集上可能更有效(通过将大型原始矢量集保存为单独的文件,应与主文件一起保存)。例如:
word_vectors.save(GOOGLE_WORD_FEATURE)
...
words_set = KeyedVectors.load(GOOGLE_WORD_FEATURE)
words_set.most_similar("knit", topn=3) # should work