使用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)}')
当您从 中收到这样的“不在词汇表中”错误时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 之外的一种选择方式。我从来没有见过一个项目使用如此高维的词向量,只有在你有大量词汇和训练的情况下才在理论上是合理的-set。具有较小词汇表/数据的超大向量可能会产生无用的过度拟合结果。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句