2

我可以将序列化的语料库保存到foobar.mm其中,但是当我尝试加载它时,它给出了UnpicklingError. 加载字典似乎很好。任何人都知道如何解决这个问题?为什么会发生这种情况?

>>> from gensim import corpora
>>> docs = ["this is a foo bar", "you are a foo"]
>>> texts = [[i for i in doc.lower().split()] for doc in docs]
>>> print texts
[['this', 'is', 'a', 'foo', 'bar'], ['you', 'are', 'a', 'foo']]

>>> dictionary = corpora.Dictionary(texts)
>>> dictionary.save('foobar.dic')
>>> print dictionary
Dictionary(7 unique tokens)
>>> corpora.Dictionary.load('foobar.dic')
<gensim.corpora.dictionary.Dictionary object at 0x329f910>

>>> corpus = [dictionary.doc2bow(text) for text in texts]
>>> corpora.MmCorpus.serialize('foobar.mm', corpus)
>>> corpus = corpora.MmCorpus.load('foobar.mm')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/gensim-0.8.6-py2.7.egg/gensim/utils.py", line 166, in load
    return unpickle(fname)
  File "/usr/local/lib/python2.7/dist-packages/gensim-0.8.6-py2.7.egg/gensim/utils.py", line 492, in unpickle
    return cPickle.load(open(fname, 'rb'))
cPickle.UnpicklingError: invalid load key, '%'.
4

2 回答 2

4

请参阅http://radimrehurek.com/gensim/tut1.html#corpus-formats上的文档

您要做的是以 MatrixMarket 格式(=文本格式)存储语料库,然后使用save/load binary interface加载它。

要加载序列化的 MatrixMarket 语料库,只需corpus = corpora.MmCorpus('foobar.mm')

于 2013-12-04T22:15:34.757 回答
-1

由于gensim's corpora(无论这是什么)正在使用pickle堆栈跟踪显示,因此您将只能存储有限类型的数据。有关更多详细信息,请参阅可以腌制和取消腌制什么?在 Python 文档中。

如果这不适用(即,如果你想腌制和解开的东西应该是可腌制的)我担心你可能在 pickle 模块中发现了一个错误。也许您可以通过升级到更新的 Python 版本来解决您的问题。

于 2013-09-18T08:52:05.067 回答