我想在语料库中为单词嵌入字词。我决定通过 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 。感谢。
答案 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