在nltk中使用scikit-learn分类器,多类情况

6

文本文档的分类是在scikit-learn中一个简单的任务,但在NLTK中没有很好的支持,虽然有一些像这个样的繁琐做法。我想用NLTK进行预处理并用scikit-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')],但它不是正确的结果。是否有任何解决方案?

1个回答

16
NLTK对scikit-learn的包装不支持多标签分类,这是正确的,因为它没有实现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,我应该披露我的从属关系。我编写了DictVectorizer和scikit-learn的NLTK封装器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接