我买了一台新笔记本电脑并安装了最新版本的 NLTK 和 SciKit-Learn。我正在使用旧脚本进行情绪分析,该脚本加载了我今年早些时候创建的旧 pickle,但我收到了以下错误。似乎来自 NLTK 的 SciKitClassifier 包装器现在具有 _vectorizer 属性,而它以前没有。
File "c:\users\yoprado\pycharmprojects\gnip_sentiment\gnip_sentiment\main.py", line 64, in mongoaddsentiment
MongoSentiment(mongo_server, mongo_port, dbname, colname, pickle_file)
File "c:\users\yoprado\pycharmprojects\gnip_sentiment\gnip_sentiment\MongoSentiment.py", line 61, in MongoSentiment
senti = classifier_eng.classify(get_features(cleanedBody.split()))
File "C:\Python27\lib\site-packages\nltk-3.0.0-py2.7-win32.egg\nltk\classify\api.py", line 54, in classify
return self.classify_many([featureset])[0]
File "C:\Python27\lib\site-packages\nltk-3.0.0-py2.7-win32.egg\nltk\classify\scikitlearn.py", line 84, in classify_many
X = self._vectorizer.transform(featuresets)
AttributeError: 'SklearnClassifier' object has no attribute '_vectorizer'
我使用了与之前创建分类器 pickle 相同的脚本,新的 pickle 似乎工作正常。似乎代码中的某些内容已通过最近的更新进行了修改。有什么方法可以将当前的 pickle 转换为新格式吗?
谢谢
最佳答案
这type of problem is a known issue使用 sklearn
。在更新到最新版本的软件包后,我遇到了同样的一般问题,即对训练有素的 sklearn 模型进行去 pickle 。无论出于何种原因,版本之间通常没有足够的一致性,因此您可以可靠地从先前版本中去除经过训练的模型。当您最初对经过训练的分类器进行 pickle 时,它序列化了对本身未序列化的函数的调用。因此,当您 depickle 时,它会反序列化调用,但会调用该函数的新版本,该函数不再采用相同的参数或具有相同的属性(在您的情况下为 _vectorizer
)。您有两个选择:(1) 使用新版本重新训练模型或 (2) 安装您使用的先前版本,而不是最新版本的 sklearn。
关于python - SklearnClassifier 对象没有属性 _vectorizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26899025/