Я хочу получить вложения слов для слов в корпусе.Я решил использовать предварительно обученные векторы слов в библиотеке GoogleNews by gensim .Но мой корпус содержит некоторые слова, которых нет в словах GoogleNews.для этих пропущенных слов я хочу использовать среднее арифметическое n самых похожих слов в словах GoggoleNews.Сначала я загружаю 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 .Спасибо.