Gensim W2V - UnicodeDecodeError: 'utf-8' 编解码器无法解码位置 0 中的字节 0x80:起始字节无效

问题描述

我训练并保存了一个 word2Vec 模型“myWord2Vec.model”以将其传递给逻辑回归模型进行训练,但向量大小大于我的训练数据集,因此我需要减小向量大小。我试过下面的代码

model = gensim.models.KeyedVectors.load_word2vec_format('myWord2Vec.model',limit=2021)

它给了我这个错误

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte

我不知道如何修复它,也不知道如何减小矢量大小。 我将不胜感激!

解决方法

在 UTF-8 中,多字节序列以具有位 11xxxxxx 的字节和具有连续字节 10xxxxxx 的字节开始。该错误指出在开始位置遇到了一个连续字节 0x80 = 10000000。

这可能发生在非 UTF-8 文本/二进制数据上,或者当不小心读取文本缓冲时,缓冲区开始或结束拆分多字节序列。

限制可能会破坏解码,但我会考虑先检查数据。您可以尝试 ISO-8859-1 来检查解码静默通过时会发生什么。

0x80 位置 0 处的错误数据/错误算法。

,

你是如何拯救myWord2Vec.model的?

如果用.save()保存,则需要用同模型类的.load()加载。 (并注意:.load() 是全有或全无,没有任何 limit= 选项仅加载向量集的一部分。)

仅当您使用 .save_word2vec_format() 保存时,才适合使用 .load_word2vec_format() 加载。 (而且,尝试使用 .load_word2vec_format() 加载格式错误的文件可能会产生您所看到的那种错误。)

另外:limit=2021 是一个非常奇怪的选项。你真的只想加载 2,021 个向量吗? (通常人们希望至少加载数万个。)

此外,您的观察“向量大小比我的训练数据集大”也没有任何意义。 word2vec 中的向量大小通常为 100-400 维,前提是您有足够的训练数据来支持该大小。如果您的数据较少,则更有可能减小向量大小,这不足以训练高维模型。减少矢量大小确实可以节省一点内存。但是,模型大小更多地是词汇大小(唯一词的数量)的函数,而不是训练数据集站点。而且,如果您的词汇量确实太大而无法记忆,通常舍弃低频词,选择较高的 min_count 选项,比缩小 vector_size 更好。