Python gensim为谷歌新闻添加新词
我想为语料库中的单词嵌入单词。我决定在gensim图书馆的GoogleNews中使用预先训练好的词向量。但我的语料库包含了一些谷歌新闻中没有的词。对于这些缺失的单词,我想使用GoggoleNews单词中最相似的n个单词的算术平均值。首先我加载GoogleNews并检查其中是否有“to”一词Python gensim为谷歌新闻添加新词,python,word2vec,gensim,google-news,Python,Word2vec,Gensim,Google News,我想为语料库中的单词嵌入单词。我决定在gensim图书馆的GoogleNews中使用预先训练好的词向量。但我的语料库包含了一些谷歌新闻中没有的词。对于这些缺失的单词,我想使用GoggoleNews单词中最相似的n个单词的算术平均值。首先我加载GoogleNews并检查其中是否有“to”一词 #Load GoogleNews pretrained word2vec model model=word2vec.KeyedVectors.Load_word2vec_format("GoogleNews-
#Load GoogleNews pretrained word2vec model
model=word2vec.KeyedVectors.Load_word2vec_format("GoogleNews-vectors-negative33.bin",binary=True)
print(model["to"])
我收到一个错误:keyError:“单词”to“不在词汇表中”
这么大的数据集有没有可能没有这个词?对于其他一些常用词,如“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
存在一种不一致性。当我打印缺少的内容时,它是空的。好像没有任何遗漏的单词。
但当我用这个来检查时:
for w in tokens_lower:
if(w in model.wv.vocab)==False:
print(w)
print("***********")
我发现了很多遗漏的单词。
现在,我有3个问题:
1-为什么缺少\u embed是空的,而有一些缺少的单词?
谷歌新闻有没有可能没有“to”这样的词?
3-如何将新嵌入添加到word2vec模型?我使用了build\u vocab和syn0。谢谢。谷歌可能会删除常见的填充词,如“to”和“a”。如果文件在其他方面看起来没有损坏,并且在
load()
之后检查其他单词表明它们存在,那么可以合理地假设Google放弃了那些过于普通的单词,因为它们具有分散的含义,因此价值很低
你想做的事情并不清楚,也不清楚。您将单词分配给idx两次,因此只有第二行起作用
(第一个赋值是在所有单词都有0
值的情况下创建一个dict,在第二行创建一个全新的dict后没有任何延迟效果,其中model.wv.vocab中只有w的条目。在这一步之后,只有0
的条目可能是单词向量集中已经处于位置的任何单词0
–当且仅当该单词也在您的语料库中时(单词
)
您似乎希望基于相似词的平均值为未知词构建新的向量。但是,most\u similure()
仅适用于已知词。如果在完全未知的词上尝试,则会出错。因此,该方法无法工作
还有一个更深层次的问题是gensim
KeyedVectors
类不支持动态添加新单词->向量项。您必须深入研究它的源代码,要添加一个或一批新向量,请修改它的一组内部属性(包括它的向量
数组、vocab
dict和index2entity
列表)以自一致的方式创建新条目。下面是一个场景,我们将添加一个缺少的小写单词
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
GoogleNews word2vec模型可能排除了“to”和“a”,因为它们作为停止词的意义不大。我认为不可能更新模型vocab,因为该模型是根据此处找到的从C工具生成的,但您可以使用model.build_vocab(句子,update=True)进行尝试
。你的意思是加载moldel后我使用model.build\u vocab(句子,update=True)?现在缺失单词的嵌入向量是什么?是的,你可以尝试一下,但我认为这是不可能的,因为谷歌的word2vec模型是用C工具包构建的。你将无法获得任何类似的缺失单词嵌入,因为模型vocab从未训练过这些单词。谢谢你的评论。但是当我使用model.build\u vocab
我得到了这个错误:`AttributeError:'KeyedVectors'对象没有属性'build\u vocab'。我如何使用build\u vocab?嗯,试试这个:model=gensim.models.Word2Vec.load\u Word2Vec\u格式('GoogleNews-vectors-negative33.bin',binary=True)
。如果您设法让build\u vocab
在之后工作,您仍然需要使用model.train(句子)进行额外的培训
现在我认为我不需要在GoogleNews中添加新单词。因为我的目标是为我的语料库中的每个单词获得一个单词嵌入向量。我可以使用GoogleNews单词嵌入来表示已知单词。对于缺少的单词,我可以使用与GoogleNews嵌入相同长度的随机初始化向量(300).但是你能告诉我生成初始化单词嵌入向量的最佳解决方案是什么吗?如果你有一个很好的语料库,训练你自己的嵌入!GoogleNews
集合没有什么神奇之处,如果你的问题域不是它训练过的同一类新闻文章,你的原生嵌入可能会更好。如果你有一个很好的训练语料库,但仍然需要为以后的词汇表外单词(OOV)引导单词向量考虑使用像脸谱网的FASTTEST这样的东西,一种高级的Word2VEC变体,它可以通过合成从原始语料库中学习的子词向量来近似新单词的向量。Such FastText OOV生成的向量是相当粗糙的,但是比随机的更好,并且可能对于席语和词形变体来说相当好,在这样的语言中rd结构/词根为词义提供了强有力的提示。Facebook还发布了经过预先训练的FastText Vector(),类似于GoogleNews,尽管只在Wikipedia上接受过很多语言的培训。你知道初始化向量的范围吗?我读到,只要随机初始化向量就足以给单词一个有效的向量。你知道如何在GoogleNews-vectors-negative300中初始化新词的向量吗?@JuanPerez,这些模型通常都是这样的将单词向量初始化为低幅度的随机位置——但这只能通过训练来实现