word2vec - KeyError: "word X not in vocabulary"

word2vec - KeyError: "word X not in vocabulary"

使用模块 gensimWord2Vec 实现来为纯文本文件中的句子构建词嵌入。尽管单词 happy 已在词汇表中定义,但出现错误 KeyError: "word 'happy' not in vocabulary"。试图将给定的答案应用于 a similar question,但没有成功。因此,发布了我自己的问题。

代码如下:

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)}')

当您从 Word2Vec 收到这样的 "not in vocabulary" 错误时,您可以相信它:'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的选择方式。我从未见过使用如此高维度的词向量的项目,并且它只是理论上合理如果你有一个非常大的词汇量和训练集。具有较小 vocabularies/data 的超大向量可能会产生无用的过度拟合结果。)