繁体   English   中英

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

[英]Using scikit-learn classifier inside nltk, multiclass case

文本文档的分类是scikit-learn的一个简单任务,但是在NLTK中没有对它的干净支持,也有像这样做的样本。 我想用NLTK进行预处理并使用sckit-learn进行分类,我在NLTK中找到了SklearnClassifier,但是有一点问题。

在scikit中学习一切都很好:

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可以更轻松。

免责声明 :根据常见问题解答 ,我应该披露我的从属关系。 我为scikit-learn编写了DictVectorizer和NLTK包装器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM