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

Python 如何保存分类器textblob NaiveBayesClassifier的结果?,python,classification,pickle,sentiment-analysis,textblob,Python,Classification,Pickle,Sentiment Analysis,Textblob,我使用TextBlob的NaiveBayesclassifier根据我选择的给定主题进行文本分析 数据量很大(大约3000条条目) 虽然我能够得到一个结果,但如果不再次调用该函数并等待数小时直到处理完成,我无法保存它以备将来使用 我试着用下面的方法酸洗 ab = NaiveBayesClassifier(data) import pickle object = ab file = open('f.obj','w') #tried to use 'a' in place of 'w' ie.

我使用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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Python27\lib\pickle.py”,第1370行,在转储中
Pickler(文件,协议).dump(obj)
文件“C:\Python27\lib\pickle.py”,第224行,位于转储文件中
自我保存(obj)
文件“C:\Python27\lib\pickle.py”,第331行,保存
自我保存(obj=obj,*rv)
文件“C:\Python27\lib\pickle.py”,第419行,在save\u reduce中
保存(状态)
文件“C:\Python27\lib\pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
保存目录中第649行的文件“C:\Python27\lib\pickle.py”
self.\u batch\u setitems(obj.iteritems())
文件“C:\Python27\lib\pickle.py”,第663行,在批处理设置项中
保存(v)
文件“C:\Python27\lib\pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
保存列表中第600行的文件“C:\Python27\lib\pickle.py”
自批附录(iter(obj))
文件“C:\Python27\lib\pickle.py”,第615行,在批处理附录中
保存(x)
文件“C:\Python27\lib\pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
文件“C:\Python27\lib\pickle.py”,第562行,在save\u元组中
保存(元素)
文件“C:\Python27\lib\pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
保存目录中第649行的文件“C:\Python27\lib\pickle.py”
self.\u batch\u setitems(obj.iteritems())
文件“C:\Python27\lib\pickle.py”,第662行,在批处理设置项中
保存(k)
文件“C:\Python27\lib\pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
文件“C:\Python27\lib\pickle.py”,第501行,保存为unicode
自我记忆(obj)
文件“C:\Python27\lib\pickle.py”,第247行,在memoize中
self.memo[id(obj)]=备忘录
记忆者
我也尝试过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
#使用函数sPickle.s#dump保存对象
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Python27\lib\site packages\sPickle.py”,第22行,在s_转储中
对于iterable_to_pickle中的英语教学:
TypeError:“NaiveBayesClassifier”对象不可编辑
#使用函数sPickle.s\u dump\u elt保存对象
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Python27\lib\site packages\sPickle.py”,第28行,在s_dump_elt中
pickled_elt_str=转储(elt_to_pickle)
内存错误:内存不足
有人能告诉我如何保存该对象吗

或者是否有保存分类器结果以备将来使用的方法?

二进制格式需要使用“wb”:

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

我自己解决了这个问题

首先,使用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%的内存可用于要pickle的对象

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

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

因此,如果你的笔记本电脑死机(或者,一般来说,停止工作),那么你可能不得不关闭它,重新开始,尝试使用较少数量的实例或较少数量的情感/主题


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

对于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)

哦有趣。我在某个时候遇到了类似的错误,
b
解决了它。让我再看一眼,我希望你取得好成绩。我也看看smthing是否可行。你能试着打印数据和ab的值吗?似乎有些东西太大了,或者某种程度上是格式不正确的,
cpickler
内存不足。@Robert..列表中的数据有2500个字符串那么大。每个字符串的长度至少为50。在我的i5处理器上用8gb内存处理这些数据大约需要一个小时。。。我不认为任何东西的格式都不正确。请尝试cPickle:
import cPickle;cPickle.dump(对象,文件,1)
我训练了一个模型,成功保存了5000条记录,它有2.18GB。当我加载和分类样本文本时,需要8分钟。我使用以下代码来加载和分类。classifierPickle=pickle.load(open(“classifier.pickle”,“rb”))classifierPickle.classify(“用于分类的测试字符串”),是否有任何方法可以减少分类时间。