word2vec - KeyError: «слово X отсутствует в словаре» - PullRequest
0 голосов
/ 02 ноября 2019

Использование Word2Vec реализации модуля gensim для построения вложений слов для предложений, которые у меня есть в текстовом файле. Несмотря на то, что слово happy определено в словаре, получается ошибка KeyError: "word 'happy' not in vocabulary". Пытался применить данные ответы на аналогичный вопрос , но не получилось. Значит, выложил свой вопрос.

Вот код:

try:
    data = []
    with open(TXT_PATH, 'r', encoding='utf-8') as txt_file:
        for line in txt_file:
            for part in line.split(' '):
                data.append(part.strip())

    # When I debug, both of the words 'happy' and 'birthday' exist in the variable 'data'
    word2vec = Word2Vec(data, min_count=5, size=10000, window=5, workers=4)

    # Print result
    word_1 = 'happy'
    word_2 = 'birthday'
    print(f'Similarity between {word_1} and {word_2} thru word2vec: {word2vec.similarity(word_1, word_2)}')
except Exception as err:
    print(f'An error happened! Detail: {str(err)}')

1 Ответ

0 голосов
/ 02 ноября 2019

Когда вы получаете сообщение об ошибке «not in запасной словарь» от Word2Vec, вы можете верить этому: 'happy' действительно нет в модели.

Даже если ваша визуальная проверка показывает 'happy' внутри вашего файла, есть несколько причин, по которым он может не оказаться внутри модели:

  • этого не происходитпо крайней мере min_count=5 раз

  • формат data неверен для Word2Vec, поэтому он не видит слов, которые вы ожидаете увидеть.

Глядя на то, как data подготовлен вашим кодом, он выглядит как гигантский список всех слов в вашем файле. Word2Vec вместо этого ожидает последовательность, которая имеет, как каждый элемент, список слов для этого одного текста. Итак: не список слов, а список, где каждый элемент представляет собой список слов.

Если вы поставили ...

[
  'happy',
  'birthday',
]

... вместо ожидаемого ...

[
  ['happy', 'birthday',],
]

... эти одно слово-Строки будут видны как списки символов, поэтому Word2Vec будет думать, что вы хотите выучить векторы слов для набора односимвольных слов. Вы можете проверить, повлияло ли это на вашу модель, посмотрев, кажется ли размер словарного запаса небольшим (len(model.wv)) или образец слов для изучения состоит только из односимвольных слов ('model.wv.index2entity [: 10] `).

Если вы введете слово в правильном формате, по крайней мере, min_count раз, как часть обучающих данных, в модели появится вектор.

(Отдельно: size=10000 - выход за пределы обычного диапазона 100-400. Я никогда не видел проекта, использующего такую ​​большую размерность для векторов слов, и это было бы теоретически оправданно, если бы у вас был очень большой словарный запас иобучающий набор. Негабаритные векторы с меньшими словарями / данными, вероятно, приведут к бесполезным результатам перебора.)

...