通过gensim

时间:2018-05-31 07:31:42

标签: python word2vec gensim google-news

我想在语料库中为单词嵌入字词。我决定通过 gensim 库在 GoogleNews 中使用预训练的单词向量。但我的语料库中包含一些GoogleNews中没有的单词。对于这些遗漏的单词,我想在GoggoleNews的单词中使用n个最相似的单词的算术平均值。首先我加载GoogleNews并检查“to”一词是否在其中?

#Load GoogleNews pretrained word2vec model
model=word2vec.KeyedVectors.Load_word2vec_format("GoogleNews-vectors-negative33.bin",binary=True)
print(model["to"])

我收到错误消息:keyError: "word 'to' not in vocabulary" 有可能这么大的数据集没有这个词吗?对于像“a”这样的其他常用词也是如此!

为了向word2vec模型添加缺失的单词,首先我想获得GoogleNews中的单词索引。对于遗漏的单词,我使用了索引0。

#obtain index of words
word_to_idx=OrderedDict({w:0 for w in corpus_words})
word_to_idx=OrderedDict({w:model.wv.vocab[w].index for w in corpus_words if w in model.wv.vocab})

然后我计算将大多数相似单词的向量嵌入每个缺失单词的平均值。

missing_embd={}
for key,value in word_to_idx.items():
    if value==0:
        similar_words=model.wv.most_similar(key)
        similar_embeddings=[model.wv[a[0]] for a in similar_words]
        missing_embd[key]=mean(similar_embeddings)

然后我将这些新闻嵌入添加到word2vec模型中:

for word,embd in missing_embd.items():
    # model.wv.build_vocab(word,update=True)
    model.wv.syn0[model.wv.vocab[word].index]=embd

存在不一致性。当我打印missing_embed时,它是空的。好像没有任何遗漏的话。 但是当我通过这个检查它时:

for w in tokens_lower:
    if(w in model.wv.vocab)==False:
        print(w)
        print("***********")

我发现了很多遗漏的词。 现在,我有3个问题: 1-为什么 missing_embed 是空的,而有一些遗漏的字? 2- GoogleNews是否可能没有像“to”这样的词? 3-如何在word2vec模型中添加新的嵌入?我使用 build_vocab syn0 。感谢。

2 个答案:

答案 0 :(得分:1)

Google可能会删除常见的填充词,例如“to”和“a”。如果该文件似乎没有损坏,并且在load()显示它们存在之后检查其他单词,那么假设Google将过于常见的单词丢弃为具有低价值的这种扩散意义是合理的。

目前还不清楚你想要做什么。您分配给word_to_idx两次 - 所以只有第二行才对。

(第一个作业,创建一个所有单词都有0值的词典,在第二行创建一个全新的词典之后没有延迟效果,只有w in model.wv.vocab的条目。在此步骤之后使用0的可能条目将是单词矢量集中的任何单词已位于0位置 - 当且仅当该单词也在您的corpus_words中时。)< / p>

您似乎想要根据相似单词的平均值为未知单词构建新的向量。但是,most_similar()仅适用于已知单词。如果尝试使用完全未知的单词,则会出错。所以这种方法不起作用。

更深层次的问题是gensim KeyedVectors类不支持动态添加新的word-&gt;向量条目。您必须深入了解其源代码,并添加一个或一批新向量,修改其内部属性(包括其vectors数组,vocab dict和{{1} } list以自洽的方式获得新条目。

答案 1 :(得分:1)

在这种情况下,我们添加了一个丢失的小写字母。

from gensim.models import KeyedVectors
path = '../input/embeddings/GoogleNews-vectors-negative300/GoogleNews-vectors-negative300.bin'
embedding = KeyedVectors.load_word2vec_format(path, binary=True)

'Quoran' in embedding.vocab
 Output : True

'quoran' in embedding.vocab
 Output : False

这里有Quoran,但缺少小写的quoran

# add quoran in lower case
embedding.add('quoran',embedding.get_vector('Quoran'),replace=False)

'quoran' in embedding.vocab
 Output : True