3

我用 Python2 训练了一个 doc2vec 模型,我想在 Python3 中使用它。

当我尝试在 Python 3 中加载它时,我得到:

Doc2Vec.load('my_doc2vec.pkl')

UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 0: ordinal not in range(128)

这似乎与泡菜兼容性问题有关,我试图通过以下方式解决:

with open('my_doc2vec.pkl', 'rb') as inf:
    data = pickle.load(inf)
data.save('my_doc2vec_python3.pkl')

Gensim 保存了我重命名的其他文件,以便在调用时可以找到它们

de = Doc2Vec.load('my_doc2vec_python3.pkl')

load() 不会因 UnicodeDecodeError 而失败,但在推理之后会提供毫无意义的结果。

我无法在 Python 3 中使用 Gensim 轻松重新训练它,因为我使用此模型从中创建派生数据,因此我必须重新运行一个漫长而复杂的管道。

如何使 doc2vec 模型与 Python 3 兼容?

4

1 回答 1

2

回答我自己的问题,这个答案对我有用。

以下是更详细的步骤:

  1. 下载 gensim 源代码,例如从 repo 克隆
  2. 在 gensim/utils.py 中,编辑方法 unpickle 以添加编码参数:

     return _pickle.loads(f.read(), encoding='latin1')
    
  3. 使用 Python 3 和修改后的 gensim,加载模型:

    de = Doc2Vec.load('my_doc2vec.pkl')
    
  4. 保存:

    de.save('my_doc2vec_python3.pkl')
    

这个模型现在应该可以在 Python 3 中使用未修改的 gensim 加载。

于 2016-07-20T16:33:27.297 回答