我正在尝试使用NLTK的SklearnClassifier和MultinomialNB对文本文档进行分类。这是代码:
pipeline = Pipeline([('tfidf', TfidfTransformer()),
('chi2', SelectKBest(chi2, k=1000)),
('nb', MultinomialNB())])
classifier = SklearnClassifier(pipeline)
test_skl = []
t_test_skl = []
for d in test_set:
test_skl.append(d[0])
t_test_skl.append(d[1])
p_class = classifier.batch_classify(test_skl)
print classification_report(t_test_skl, p_class, labels=list(set(t_test_skl)),target_names=cls_set)
我得到了这个错误:
Traceback (most recent call last):
File "classify.py", line 72, in <module>
p_class = classifier.batch_classify(test_skl)
File "/Users/me/anaconda/lib/python2.7/site-packages/nltk-3.0a3-py2.7.egg/nltk/classify/scikitlearn.py", line 84, in batch_classify
X = self._vectorizer.transform(featuresets)
File "/Users/me/anaconda/lib/python2.7/site-packages/sklearn/feature_extraction/dict_vectorizer.py", line 213, in transform
vocab = self.vocabulary_
AttributeError: 'DictVectorizer' object has no attribute 'vocabulary_'
我使用NLTK 3.0a3和scikit学习0.14.1.
有线索吗?
感谢
您尚未训练分类器。在尝试对任何内容进行分类之前,请调用其train
方法。(作为这段代码的作者,我承认错误消息可能更友好。)
您的DictVectorizer对象没有词汇表,这意味着它没有被拟合,或者它被拟合了一个空数据集。
您需要使用可用的数据集在DictVectorizer上调用fit(X[,y])方法。
vocabulary_属性是矢量器在对特征矩阵进行拟合后存储特征矩阵的位置。没有词汇表-没有可用的矢量器。
将管道更改为:
pipeline = Pipeline([('tfidf', TfidfVectorizer()),
('chi2', SelectKBest(chi2, k=1000)),
('nb', MultinomialNB())])
然后它应该工作