我正在从word2vec C代码生成的二进制文件中加载预训练的向量,如下所示:
model_1 = Word2Vec.load_word2vec_format('vectors.bin', binary=True)
我正在使用这些向量来生成包含vectors.bin
中可能尚未存在的向量的单词的句子的向量表示。例如,如果vectors.bin
没有“酸奶”这个词的关联向量,我会尝试
yogurt_vector = model_1['yogurt']
我得到KeyError: 'yogurt'
,这很有道理。我想要的是能够获取没有相应向量的句子并将它们的表示添加到model_1
。我从this post知道你无法继续训练C矢量。那么有没有办法训练一个新模型,比如说model_2
,没有向量的单词,并将model_2
与model_1
合并?
或者,有没有办法在我实际尝试检索它之前测试模型是否包含一个单词,这样我至少可以避免KeyError?
答案 0 :(得分:5)
避免关键错误很简单:
[x for x in 'this model hus everything'.split() if x in model_1.vocab]
更难的问题是将新单词合并到现有模型。问题是word2vec计算了2个单词彼此相邻的可能性,以及单词' yogurt'在模型训练的第一个机构中并没有接近任何一个单词,因此第二个模型与第一个模型不相关。
您可以在保存模型时查看内部结构(使用numpy.save),我有兴趣与您合作提供允许添加词汇的代码。
答案 1 :(得分:0)
这是一个很好的问题,遗憾的是,如果不改变代码的内部结构,就无法添加词汇表。看看这个讨论:https://groups.google.com/forum/#!searchin/word2vec-toolkit/online $ 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'>
答案 2 :(得分:0)
YoonKim在#34;句子分类的卷积神经网络&#34;
中提出了处理缺席/遗漏单词的可能替代方案。其代码:https://github.com/yoonkim/CNN_sentence/blob/master/process_data.py#L88
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)
但这适用于bcoz,你使用模型找到找到相应的向量。像相似性等功能丢失
答案 3 :(得分:0)
您可以继续向模型词汇表中添加新词/句子并训练增强模型,使用 gensim 在线训练算法 (https://rutumulkar.com/blog/2015/word2vec/),
https://radimrehurek.com/gensim/auto_examples/tutorials/run_word2vec.html
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)
相关: