如何保存textblob NaiveBayesClassifier的分类结果?

4 投票
3 回答
3370 浏览
提问于 2025-04-18 11:11

我正在使用TextBlob的NaiveBayesclassifier来进行文本分析,这些分析是基于我选择的主题。

我的数据量很大,大约有3000条记录。

虽然我得到了结果,但我无法保存这些结果,以便将来使用,而是每次都得重新调用那个函数,还得等上好几个小时才能处理完成。

我尝试用以下方法进行数据保存:

ab = NaiveBayesClassifier(data)

import pickle

object = ab
file = open('f.obj','w') #tried to use 'a' in place of 'w' ie. append
pickle.dump(object,file)

但是我遇到了一个错误,错误信息如下:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\pickle.py", line 1370, in dump
    Pickler(file, protocol).dump(obj)
  File "C:\Python27\lib\pickle.py", line 224, in dump
    self.save(obj)
  File "C:\Python27\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Python27\lib\pickle.py", line 419, in save_reduce
    save(state)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Python27\lib\pickle.py", line 663, in _batch_setitems
    save(v)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 600, in save_list
    self._batch_appends(iter(obj))
  File "C:\Python27\lib\pickle.py", line 615, in _batch_appends
    save(x)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 562, in save_tuple
    save(element)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Python27\lib\pickle.py", line 662, in _batch_setitems
    save(k)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 501, in save_unicode
    self.memoize(obj)
  File "C:\Python27\lib\pickle.py", line 247, in memoize
    self.memo[id(obj)] = memo_len, obj
MemoryError

我也尝试过用sPickle,但也出现了这样的错误:

#saving object with function sPickle.s_dump
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\sPickle.py", line 22, in s_dump
    for elt in iterable_to_pickle:
TypeError: 'NaiveBayesClassifier' object is not iterable

#saving object with function sPickle.s_dump_elt
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\sPickle.py", line 28, in s_dump_elt
    pickled_elt_str = dumps(elt_to_pickle)
MemoryError: out of memory

有没有人能告诉我该怎么做才能保存这个对象?

或者有没有什么办法可以保存分类器的结果,以便将来使用?

3 个回答

0

在Python 3.0及以上版本中,cPickle这个东西似乎不见了,不过默认的pickle可以完成同样的工作。只要确保使用与你的Python安装版本相匹配的协议就可以了。如果你使用的是Python 3.4及以上版本,可以使用下面的代码:

import pickle
with open(r"blobClassifier.pickle",'wb') as file:
    pickle.dump(cl_Title, file, protocol=pickle.HIGHEST_PROTOCOL,fix_imports=False)
6

我自己解决了这个问题。

首先,使用64位版本的Python(适用于2.6到3.4的所有版本)。

64位版本可以解决所有内存问题

使用cPickle。

import cPickle as pickle

其次,以以下方式打开你的文件:

file = open('file_name.pickle','wb') #same as what Robert said in the above post

这样可以把对象写入文件。

pickle.dump(object,file)

你的对象会被存储在文件中。但你必须检查一下你的对象占用了多少内存。

使用pickle也会占用内存,所以至少要有25%的内存可用,才能顺利存储对象。

对我来说,我的笔记本电脑有8GB的内存,所以只够存储一个对象。

(我的分类器非常复杂,有3000个字符串实例,每个字符串大约包含15到30个单词。情感/主题的数量是22个。)

所以如果你的笔记本电脑死机了(或者说,停止工作),你可能需要关机重启,然后尝试使用更少的实例或者更少的情感/主题。

在这里,cPickle非常有用,因为它比其他任何pickle模块都要快,我建议使用它。

2

你需要使用“wb”来处理二进制格式:

file = open('f.obj','wb')

撰写回答