Добавить новые слова в GoogleNews от gensim

Я хочу получить вложение слов для слов в корпусе. Я решил использовать предварительно обученные векторы слов в GoogleNews от библиотеки 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"Возможно ли, что такой большой набор данных не имеет этого слова? это верно и для некоторых других распространенных слов, таких как "а"!

Для добавления пропущенных слов в модель 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- почему пропущенное_имение пусто, а пропущены некоторые слова? 2- Возможно ли, что в GoogleNews нет слов вроде "to"? 3- как я могу добавить новые вложения в модель word2vec? Я использовал build_vocab и syn0. Благодарю.

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

Здесь Коран присутствует, но Коран в нижнем регистре отсутствует

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

'quoran' in embedding.vocab
 Output : True

Возможно, Google удалил распространенные слова-заполнители, такие как "to" и "a". Если файл кажется в противном случае не поврежден, и проверка других слов после load() показывает, что они присутствуют, было бы разумно предположить, что Google отбросил слишком часто встречающиеся слова как имеющие такой разбросанный смысл, чтобы иметь низкую ценность.

Непонятно и запутано, что вы пытаетесь сделать. Вы назначаете word_to_idx дважды - значит, важна только вторая строка.

(Первое задание - создание слова, в котором все слова имеют 0 значение, не имеет затяжного эффекта после того, как 2-я строка создает совершенно новый dict, только с записями где w in model.wv.vocab, Единственная возможная запись с 0 после этого шага будет любое слово в наборе слов-векторов, которое уже было в положении 0 - если и только если это слово было также в вашем corpus_words.)

Похоже, вы хотите построить новые векторы для неизвестных слов на основе среднего числа похожих слов. Тем не менее most_similar() работает только для известных слов. Это будет ошибка, если попытаться на совершенно неизвестное слово. Так что такой подход не может работать.

И более глубокая проблема заключается в gensimKeyedVectors Класс не поддерживает динамическое добавление новых слов-> векторных записей. Вы должны были бы покопаться в его исходном коде и, чтобы добавить один или несколько новых векторов, изменить кучу его внутренних свойств (включая его vectors массив, vocab диктовать и index2entity список) в согласованном порядке, чтобы новые записи.

Другие вопросы по тегам