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