Word2vec保存的模型不是UTF-8编码,但输入到Word2vec模型的句子是UTF-8编码

时间:2017-06-22 23:06:43

标签: python-3.x utf-8 nlp gensim word2vec

我使用gensim包训练了一个word2vec模型并使用以下名称保存。

==

我收到了这些日志消息信息。而模型正在接受培训和保存。

model_name = "300features_1minwords_10context"
model.save(model_name)

然后,我尝试使用此加载模型,

INFO : not storing attribute syn0norm
INFO : not storing attribute cum_table

我收到以下错误。

from gensim.models import Word2Vec
model = Word2Vec.load("300features_1minwords_10context")

此外,在文件" 300features_1minwords_10context"中,它显示

2017-06-22 21:27:14,975 : INFO : loading Word2Vec object from 300features_1minwords_10context
2017-06-22 21:27:15,496 : INFO : loading wv recursively from 300features_1minwords_10context.wv.* with mmap=None
2017-06-22 21:27:15,497 : INFO : setting ignored attribute syn0norm to None
2017-06-22 21:27:15,498 : INFO : setting ignored attribute cum_table to None
2017-06-22 21:27:15,499 : INFO : loaded 300features_1minwords_10context
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-25-9d90db0f07c0> in <module>()
      1 from gensim.models import Word2Vec
      2 model = Word2Vec.load("300features_1minwords_10context")
----> 3 model.syn0.shape

AttributeError: 'Word2Vec' object has no attribute 'syn0'

要修复上述属性错误,我还在google论坛中尝试了以下内容,

"300features_1minwords_10context" is not UTF-8 encoded
Saving disabled.
Open console for more details 

导致另一个错误

import gensim
model = gensim.models.KeyedVectors.load_word2vec_format("300features_1minwords_10context")
model.syn0.shape

该模型使用UTF-8编码的句子进行训练。我不确定为什么会抛出这个错误?

更多信息:

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

在这里,我不得不使用&#39; mac_roman&#39;编码以便使用pandas dataframe访问它。由于数据框中的文本在训练模型时必须是UTF-8,因此我将该特定功能保存在单独的csv文件中,方法是使用UTF-8对其进行编码,之后我访问了该特定列。

任何帮助都很明显

1 个答案:

答案 0 :(得分:2)

您使用的是最新的gensim吗?如果没有,请务必尝试一下 - 旧版本中有时会出现save() / load()个错误。

INFO&#34;不存储&#34;日志行是正常的 - 它们并不表示任何问题(因此可以从您的问题中删除。)

你是否得到了#34;没有属性&#34;错误直接在load()上? (这里的完整错误堆栈很有用,并澄清这一点。)

更新:从现在显示的错误堆栈中,load()行中出现 not 错误,但在下一行中,当您尝试访问model.syn0.shape。最新版本的gensim不再具有syn0作为Word2Vec类对象的属性 - 该信息将移动到KeyedVectors属性中的成分wv对象。因此,model.wv.syn0.shape可能会在没有错误的情况下访问您正在寻找的内容。

当您的模型较大时,save()可以为模型的大型数组属性(如syn0)生成多个文件,并附加扩展名。这些文件必须与主文件名一起保留,以便模型重新load()。您是否有可能将300features_1minwords_10context文件(而非任何此类随附文件)移至load()不完整的新位置?

你不能load_word2vec_format()一个本机gensim save() d文件 - 完全不同的格式,所以编码错误只是试图读取二进制Python pickle文件的工件(来自save())完全是另一种格式。