Python Gensim word2vec增强或合并预训练向量

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:“酸奶”,这很有道理

我从word2vec C代码生成的二进制文件中加载预训练向量,如下所示:

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)