4

我正在从 word2vec C 代码生成的二进制文件中加载预先训练的向量,例如:

model_1 = Word2Vec.load_word2vec_format('vectors.bin', binary=True)

我正在使用这些向量来生成句子的向量表示,其中包含在vectors.bin. 例如,如果vectors.bin没有与单词“yogurt”相关的向量,我尝试

yogurt_vector = model_1['yogurt']

我明白KeyError: 'yogurt'了,这很有意义。我想要的是能够将没有对应向量的句子单词添加到model_1. 我从这篇文章中了解到,您无法继续训练 C 向量。那么有没有办法为model_2没有向量的单词训练一个新模型并与model_2合并model_1

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

4

4 回答 4

5

避免关键错误很容易:

[x for x in 'this model hus everything'.split() if x in model_1.vocab]

更困难的问题是将新词合并到现有模型中。问题是 word2vec 计算 2 个单词彼此相邻的可能性,如果“酸奶”这个词不在模型训练的第一个主体中,那么它不会与这些词中的任何一个相邻,所以第二个模型不会与第一个相关联。

您可以在保存模型时查看内部​​结构(使用 numpy.save),我有兴趣与您一起编写代码以允许添加词汇表。

于 2015-04-14T23:34:38.273 回答
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'>    
于 2015-05-12T21:45:38.227 回答
0

YoonKim 在“用于句子分类的卷积神经网络”中提出了一种可能的替代方法来处理缺失/缺失的单词

其代码: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,您使用模型来查找以找到相应的向量。相似性等功能丢失

于 2016-01-04T09:08:09.510 回答
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)

有关的:

于 2021-03-19T05:05:32.100 回答