使用Word2Vec
模块的实现gensim
为了为我在纯文本文件中拥有的句子构建单词嵌入。尽管这个词happy
在词汇表中定义,得到错误KeyError: "word 'happy' not in vocabulary"
。尝试将给出的答案应用到类似的问题 https://stackoverflow.com/questions/41133844/keyerror-word-word-not-in-vocabulary-in-word2vec,但没有成功。因此,发布了我自己的问题。
这是代码:
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'
在您的文件中,它可能不会出现在模型中的一些原因包括:
看看如何data
由您的代码准备,它看起来像文件中所有单词的巨大列表。Word2Vec
相反,需要一个序列,其中每个项目都有该文本的单词列表。所以:不是一个单词列表,而是一个其中每个项目都是单词列表的列表。
如果您已提供...
[
'happy',
'birthday',
]
...而不是预期的...
[
['happy', 'birthday',],
]
...那些单字字符串将被视为字符列表,所以Word2Vec
会认为你想学习一堆单字符单词的词向量。您可以通过查看词汇量是否看起来很小来检查这是否影响了您的模型(len(model.wv)
)或者如果学习单词的样本只是单字符单词('model.wv.index2entity[:10]`)。
如果您以正确的格式提供一个单词,至少min_count
有时,作为训练数据的一部分,它最终会在模型中得到一个向量。
(分别地:size=10000
是超出通常 100-400 范围的选择方式。我从未见过一个项目使用如此高维的词向量,并且只有在拥有大量词汇和训练集的情况下,这才在理论上是合理的。词汇量/数据较小的超大向量可能会产生无用的过度拟合结果。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)