Gensim word2vec增强或合并预训练的矢量

时间:2015-04-12 16:14:54

标签: 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: 'yogurt',这很有道理。我想要的是能够获取没有相应向量的句子并将它们的表示添加到model_1。我从this post知道你无法继续训练C矢量。那么有没有办法训练一个新模型,比如说model_2,没有向量的单词,并将model_2model_1合并?

或者,有没有办法在我实际尝试检索它之前测试模型是否包含一个单词,这样我至少可以避免KeyError?

4 个答案:

答案 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)

相关: