【问题标题】:Using scikit-learn classifier inside nltk, multiclass case在 nltk 中使用 scikit-learn 分类器,多类案例
【发布时间】:2012-11-11 01:37:44
【问题描述】:

文本文档的分类是 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')],它不是正确的。有什么解决办法吗?

【问题讨论】:

    标签: python nltk scikit-learn


    【解决方案1】:

    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 包装器。

    【讨论】:

      猜你喜欢
      • 2016-07-12
      • 2015-10-28
      • 2012-05-18
      • 2015-10-15
      • 2015-06-23
      • 2016-10-17
      • 2015-09-25
      • 2014-02-04
      相关资源
      最近更新 更多