Python Gensim word2vec增强或合并预训练向量
我从word2vec C代码生成的二进制文件中加载预训练向量,如下所示:Python Gensim word2vec增强或合并预训练向量,python,gensim,keyerror,word2vec,Python,Gensim,Keyerror,Word2vec,我从word2vec C代码生成的二进制文件中加载预训练向量,如下所示: model_1 = Word2Vec.load_word2vec_format('vectors.bin', binary=True) 我正在使用这些向量生成句子的向量表示,这些句子包含的单词可能在vectors.bin中还没有向量。例如,如果vectors.bin没有与单词“酸奶”相关联的向量,我会尝试 yogurt_vector = model_1['yogurt'] 我得到了KeyError:“酸奶”,这很有道理
model_1 = Word2Vec.load_word2vec_format('vectors.bin', binary=True)
我正在使用这些向量生成句子的向量表示,这些句子包含的单词可能在vectors.bin
中还没有向量。例如,如果vectors.bin
没有与单词“酸奶”相关联的向量,我会尝试
yogurt_vector = model_1['yogurt']
我得到了KeyError:“酸奶”
,这很有道理。我想要的是能够将没有相应向量的句子单词添加到model_1
。我知道你不能继续训练C向量。那么,有没有一种方法可以训练一个新的模型,比如说对没有向量的单词进行model_2
,并将model_2
与model_1
合并
或者,是否有一种方法可以在我实际尝试检索之前测试模型是否包含单词,这样我至少可以避免关键错误?避免关键错误很容易:
[x for x in 'this model hus everything'.split() if x in model_1.vocab]
更困难的问题是将新词合并到现有模型中。问题是word2vec计算了两个单词相邻的可能性,如果单词“酸奶”不在模型训练的第一个实体中,它就不在这些单词的旁边,因此第二个模型与第一个模型不相关
您可以在保存模型时查看内部(使用numpy.save),我有兴趣与您一起编写代码以允许添加词汇表。这是一个很好的问题,不幸的是,在不更改代码内部的情况下,无法添加词汇表。查看此讨论:$20word2vec/word2vec toolkit/L9zoczopPUQ/Zmy57TzxUQJ 我的建议是忽略词汇表中没有的单词,只使用词汇表中的单词。如果您使用的是python,可以通过以下方式实现:
for word in wordlist:
if word in model.vocab:
present.append(word)
else:
# this is all the words that are absent for your model
# might be useful for debugging. Ignore if you dont need this info
absent.append(word)
<Do whatever you want with the words in the list 'present'>
对于单词列表中的单词:
如果model.vocab中有单词:
present.append(word)
其他:
#这是您的模型中缺少的所有单词
#可能对调试有用。如果不需要此信息,请忽略
缺席。追加(单词)
YoonKim在“用于句子分类的卷积神经网络”中提出了一种处理缺失/缺失单词的可能替代方法
其代码:
但这是可行的,你们用模型来找到对应的向量。相似性等功能丢失您可以继续向模型词汇添加新词/句子并使用gensim在线训练算法()训练增强模型 相关的:
def add_unknown_words(word_vecs, vocab, min_df=1, k=300):
"""
For words that occur in at least min_df documents, create a separate word vector.
0.25 is chosen so the unknown vectors have (approximately) same variance as pre-trained ones
"""
for word in vocab:
if word not in word_vecs and vocab[word] >= min_df:
word_vecs[word] = np.random.uniform(-0.25,0.25,k)
model = gensim.models.Word2Vec.load(temporary_filepath)
more_sentences = [
['Advanced', 'users', 'can', 'load', 'a', 'model',
'and', 'continue', 'training', 'it', 'with', 'more', 'sentences'],
]
model.build_vocab(more_sentences, update=True)
model.train(more_sentences, total_examples=model.corpus_count, epochs=model.epochs)