python - 在 nltk 中使用 scikit-learn 分类器,多类案例

标签 python nltk scikit-learn

分类文本文档是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 通过将矢量化器和分类器绑定(bind)在一个对象中使这更容易。

免责声明:根据FAQ ,我应该公开我的隶属关系。我为 scikit-learn 编写了 DictVectorizer 和 NLTK 包装器。

关于python - 在 nltk 中使用 scikit-learn 分类器,多类案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13516364/

相关文章:

python - 无论时态或形式如何匹配单词?

python - 重新采样 - 无法单独创建训练集和测试集

pandas - 将日期拆分为新列的自定义转换器

python - 在Python中指定变量

python - 重定向通过python执行的shell脚本的输出

NLTK Stanford POS 标记器中的 Java 命令失败

machine-learning - 如何知道 scikit-learn 混淆矩阵的标签顺序并更改它

python - Python解析海量.dat文件并进行算术运算

python - Django 生产服务器的 Linux 用户方案

python - 网络抓取最常见的名字