добавить новые слова в GoogleNews от gensim - PullRequest
0 голосов
/ 31 мая 2018

Я хочу получить вложения слов для слов в корпусе.Я решил использовать предварительно обученные векторы слов в библиотеке 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 .Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Вот сценарий, в котором мы добавляем пропущенное слово в нижнем регистре.

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
0 голосов
/ 02 июня 2018

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

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

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

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

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

...