Управление ошибкой ключа с помощью gensim и предварительно подготовленной модели word2vec

#python #nlp #gensim

#python #nlp #gensim

Вопрос:

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

 KeyError: "word 'kjklk' not in vocabulary"
 

Итак, я подумал о добавлении элемента в словарь, чтобы отобразить, скажем, слова oov (вне словаря) <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? Я просмотрел документ gensim и нашел это: https://radimrehurek.com/gensim/models/word2vec.html#gensim.models.word2vec.Word2Vec.build_vocab
но, похоже, это не работает с параметром обновления.

Ответ №1:

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

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

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

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