文本文档的分类是simple task with scikit-learn,但是在NLTK中并没有明确的支持,也有一些像this这样的困难示例。我想使用NLTK进行预处理,并使用sckit-learn进行分类,我在NLTK中找到了SklearnClassifier,但是存在一些问题。
在scikit-learn中,一切正常:
from sklearn.naive_bayes import MultinomialNB
from sklearn.multiclass import OneVsRestClassifier
X_train = [[0, 0], [0, 1], [1, 1]]
y_train = [('first',), ('second',), ('first', 'second')]
clf = OneVsRestClassifier(MultinomialNB())
clf.fit(X_train, y_train)
print clf.classes_
结果是
['first' 'second']
,这是我的期望。但是,当我尝试在NLTK中使用相同的代码时:from nltk.classify import SklearnClassifier
X_train = [{'a': 1}, {'b': 1}, {'c': 1}]
y_train = [('first',), ('second',), ('first', 'second')]
clf = SklearnClassifier(OneVsRestClassifier(MultinomialNB()))
clf.train(zip(X_train, y_train))
print clf.labels()
结果是
[('first',), ('second',), ('first', 'second')]
,这不是正确的代码。有什么解决办法吗? 最佳答案
scikit-learn的NLTK包装器不知道多标签分类,也不应该知道,因为它没有实现 MultiClassifierI
。要实现该功能,需要一个单独的类。
您可以实现缺少的功能,也可以使用不带包装的scikit-learn。较新版本的scikit-learn具有一个DictVectorizer
,它接受与NLTK包装器接受的输入大致相同的输入:
from sklearn.feature_extraction import DictVectorizer
X_train_raw = [{'a': 1}, {'b': 1}, {'c': 1}]
y_train = [('first',), ('second',), ('first', 'second')]
v = DictVectorizer()
X_train = v.fit_transform(X_train_raw)
clf = OneVsRestClassifier(MultinomialNB())
clf.fit(X_train, y_train)
然后,您可以使用
X_test = v.transform(X_test_raw)
将测试样本转换为矩阵。通过将矢量化器和分类器捆绑在一个对象中,sklearn.pipeline.Pipeline
使此操作更容易。免责声明:根据FAQ,我应该披露我的隶属关系。我为scikit-learn编写了
DictVectorizer
和NLTK包装器。关于python - 在nltk中使用scikit-learn分类器,多类情况,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13516364/