sklearn、nltk、gensim语料输入对比之nltk

来源:互联网 发布:python 符号错误 编辑:程序博客网 时间:2024/06/09 23:16

经过测试,nltk虽然有包装了sklearn的SklearnClassifier,但是还是很局限,我在测试随机森林分类器时就出现了运行错误,因此建议整个流程都使用nltk!

nltk的数据集中每条记录的特征是通过自定义的特征提取方法获得的。每条记录的特征是一个字典对象,每个字典对象元由特征名称和对应的值组成。

例如

def gender_features(word):    return {'last_letter':word[-1]}

nltk的数据集是 元素为元组的列表,或者可迭代对象,每一元组的第一元素是特征字典可由gender_features生成,第二元素是一个类标签。
例如:总数据集可以是一个列表

names=([(name,"m") for name in names.words('male.txt')]+[(name,"f") for name in names.words('female.txt')])featuresets=[(gender_features(name),lable) for (name,lable) in names]

至于train_set和test_set也都是元素为元组的列表,或者可迭代对象,他们的划分可根据语料情况进行。

构造分类器:

train_set, test_set= featuresets[500:],featuresets[:500]classifier=nltk.NaiveBayesClassifier.train(train_set)

对测试集分类:classify函数的输入是一个特征字典对象

classifier.classify(test_set[0][0])#测试集准确性print nltk.classify.accuracy(classifier,test_set)

可见nltk的数据比sklearn感觉上更接近原始字符串,不用关心其空间向量化的过程。另外,nltk提供了sklearn分类器的包装类:nltk.classify.scikitlearn module

例:

from sklearn.feature_extraction.text import TfidfTransformerfrom sklearn.feature_selection import SelectKBest, chi2from sklearn.naive_bayes import MultinomialNBfrom sklearn.pipeline import Pipelinepipeline = Pipeline([('tfidf', TfidfTransformer()),...                      ('chi2', SelectKBest(chi2, k=1000)),...                      ('nb', MultinomialNB())])classif = SklearnClassifier(pipeline)

源码地址:http://www.nltk.org/_modules/nltk/classify/scikitlearn.html#SklearnClassifier
这个包装类使得nltk可以接受nltk的数据输入格式而使用sklearn中的分类器。

对于nltk来说,如果关键是写特征提取函数,然而对于常见的词袋模型,特征提取函数并不好写。

0 0