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