【问题标题】:How to save the result of classifier textblob NaiveBayesClassifier?如何保存分类器 textblob NaiveBayesClassifier 的结果?
【发布时间】:2014-08-17 08:39:58
【问题描述】:

我正在根据我选择的给定主题使用 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

谁能告诉我我必须做些什么来保存对象?

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

【问题讨论】:

  • 可以尝试打印data和ab的值吗?似乎某些东西真的很大或格式不正确,以至于cpickler 内存不足。
  • @Robert..Data 与列表中的 2500 个字符串一样大。每个字符串的长度至少为 50。在我的带有 8gb ram 的 i5 处理器上处理这些数据大约需要一个小时......我不认为任何东西都是格式错误的。
  • 试试 cPickle:import cPickle; cPickle.dump(object, file, 1)

标签: python classification pickle sentiment-analysis textblob


【解决方案1】:

我自己解决了这个问题。

首先使用 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-ing 也占用内存空间,因此至少 25% 的内存可用于要腌制的对象

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

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

因此,如果您的笔记本电脑死锁(或者,一般来说,停止工作),那么您可能必须关闭它并重新开始并尝试使用较小的编号。实例数或更少。情绪/主题。

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

【讨论】:

  • 我已经训练了一个有 5000 条记录并成功保存的模型,它有 2.18 GB。当我使用示例文本加载和分类时,需要 8 分钟。我正在使用以下代码来加载和分类。 classifierPickle = pickle.load(open( "classifier.pickle", "rb" ) ) classifierPickle.classify("Test string for classification"),有什么办法可以减少分类时间。
【解决方案2】:

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

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

【讨论】:

  • 哦!有趣的。我在某个时候遇到了类似的错误,b 解决了它。让我再看看
  • 我希望你能取得好成绩。我也看看有没有可能。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2019-01-17
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2017-11-13
    相关资源
    最近更新 更多