Управляйте KeyError с помощью gensim и предварительно обученной модели word2vec - PullRequest
0 голосов
/ 15 апреля 2019

Я предварительно обучил встраиванию слова с помощью wang2vec (https://github.com/wlin12/wang2vec),) и загрузил его в python через gensim. Когда я попытался получить вектор некоторых слов, не входящих в словарь, я, очевидно, получил:

KeyError: "word 'kjklk' not in vocabulary"

Итак, я подумал о добавлении элемента в словарь для отображения слов (вне словарного запаса), скажем, <OOV>. Поскольку словарь имеет формат Dict, я бы просто добавил элемент {"<OOV>":0}.

Но, я искал элемент словаря, с

model = gensim.models.KeyedVectors.load_word2vec_format(w2v_ext, binary=False, unicode_errors='ignore')
dict(list(model.vocab.items())[5:6])

Вывод был что-то вроде

{'word': <gensim.models.keyedvectors.Vocab at 0x7fc5aa6007b8>}

Итак, есть ли способ добавить токен <OOV> в словарь предварительно встроенного слова, встроенного в gensim, и избежать ошибки KeyError? Я посмотрел на Генсука Дока и нашел это: https://radimrehurek.com/gensim/models/word2vec.html#gensim.models.word2vec.Word2Vec.build_vocab но, похоже, не работает с параметром обновления.

1 Ответ

1 голос
/ 16 апреля 2019

Добавление синтетического токена '<OOV>' просто позволит вам найти этот токен, например model['<OOV>']. Модель по-прежнему выдаст ключевые ошибки для отсутствующих ключей, таких как 'kjklk'.

Нет встроенной поддержки для добавления любого такого «универсального» отображения. Часто игнорирование неизвестных токенов лучше, чем использование некоторого значения плагина (такого как нулевой вектор или случайный вектор).

В Python довольно идиоматично явно проверять наличие ключа через ключевое слово * 1008, если вы хотите сделать что-то другое для отсутствующих ключей. Например:

vector = model['kjklk'] if 'kjklk' in model else DEFAULT_VECTOR

(Примечательно, что *expr1* if *expr2* else *expr3* откладывает оценку начального expr1 , избегая KeyError.)

Python также имеет вариантный словарь defaultdict, который может иметь значение по умолчанию, возвращаемое для любого неизвестного ключа. См:

https://docs.python.org/3.7/library/collections.html#collections.defaultdict

Можно попробовать заменить словарь KeyedVectors vocab одним из них, если поведение действительно важно, но могут быть побочные эффекты в другом коде.

...