[Word2Vec] [gensim] Обработка пропущенных слов в словаре с параметром min_count - PullRequest
0 голосов
/ 17 марта 2020

Некоторые подобные вопросы были заданы в отношении этой темы c, но я пока не очень удовлетворен ответами; прошу прощения за это сначала.

Я использую функцию Word2Vec из библиотеки python gensim.

Моя проблема в том, что я не могу запустить моя модель на каждом слове моего корпуса, если я установил параметр min_count больше единицы . Кто-то скажет, что это логика c, потому что я предпочитаю игнорировать слова, появляющиеся только один раз. Но функция ведет себя странно, потому что выдает ошибку , говоря, что слово 'blabla' отсутствует в словаре , тогда как это именно то, что я хочу (я хочу, чтобы это слово было вне словарный запас).

Я могу представить, что это не очень понятно, а затем найти ниже воспроизводимый пример:

import gensim
from gensim.models import Word2Vec

# My corpus
corpus=[["paris","not","great","city"],
       ["praha","better","great","than","paris"],
       ["praha","not","country"]]

# Load a pre-trained model - The orignal one based on google news 
model_google = gensim.models.KeyedVectors.load_word2vec_format(r'GoogleNews-vectors-negative300.bin', binary=True)

# Initializing our model and upgrading it with Google's 
my_model = Word2Vec(size=300, min_count=2)#with min_count=1, everything works fine
my_model.build_vocab(corpus)
total_examples = my_model.corpus_count
my_model.build_vocab([list(model_google.vocab.keys())], update=True)
my_model.intersect_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True, lockf=1.0)
my_model.train(corpus, total_examples=total_examples, epochs=my_model.iter)

# Show examples
print(my_model['paris'][0:10])#works cause 'paris' is present twice
print(my_model['country'][0:10])#does not work cause 'country' appears only once

Вы можете найти модель Google там , например, но не стесняйтесь использовать любую модель или просто обходиться без нее, это не главное в моем сообщении.

Как отмечается в комментариях к коду: работа модели в «Париже» работает, но не в «стране» , И, конечно, если я установлю для параметра min_count значение 1, все будет работать нормально.

Надеюсь, это достаточно ясно.

Спасибо.

1 Ответ

1 голос
/ 19 марта 2020

Предполагается, что вы получите ошибку, если вы попросите слово, которого нет, потому что вы решили не изучать векторы для редких слов, например 'country' в вашем примере. (И: такие слова с несколькими примерами обычно не получают хороших векторов, и их сохранение может ухудшить векторы для оставшихся слов, поэтому min_count настолько большой, насколько вы можете управлять, и, возможно, намного больше, чем 1, обычно хорошая идея.)

Исправление состоит в том, чтобы сделать одно из следующего:

  1. Не просить слова, которых нет. Проверьте сначала через что-то вроде Python 's in оператора. Например:
if 'country' in my_model:
    print(my_model['country'][0:10])
else: 
    pass  # do nothing, since `min_count=2` means there's no 'country' vector
Поймай ошибку, возвращаясь к тому, что ты хочешь случиться, за отсутствующими словами:
try:
    print(my_model['country'][0:10])
except:
    pass  # do nothing, or perhaps print an error, whatever
Перейдите к использованию модели, которая всегда возвращает что-то для любого слова, например FastText - которая будет пытаться синтезировать вектор для неизвестных слов, используя подслова, изученные в процессе обучения. (Это может быть мусором, это может быть очень хорошо, если неизвестное слово очень похоже на известные слова в символах и значении, но для некоторых целей это лучше, чем ничего.)
...