关于分类文本,有三个问题
怎么识别出文本中用于明显分类的特征
怎么构建自动分类文本的模型
相关的语言知识
按照这个思路,博主进行了艰苦学习(手动捂脸。。)
一、监督式分类:建立在训练语料基础上的分类
训练过程中,特征提取器将输入转化为特征集,并且记录对应的正确分类。生成模型。预测过程中,未见过的输入被转换特征集,通过模型产生预测标签。
特征提取器和朴素贝叶斯分类器
特征提取器返回字典,这个字典被称为特征集。然后利用
nltk自带的朴素贝叶斯分类器 NaiveBayesClassifier 生成分类器。并且可以用nltk.classify.accuracy(分类器,测试集) 测试准确度。
import nltk
from nltk.corpus import names
import random
def gender_features(word): #特征提取器
return {'last_letter':word[-1]} #特征集就是最后一个字母
names = [(name,'male') for name in names.words('male.txt')]+[(name,'female') for name in names.words('female.txt')]
random.shuffle(names)#将序列打乱
features = [(gender_features(n),g) for (n,g) in names]#返回对应的特征和标签
train,test = features[500:],features[:500] #训练集和测试集
classifier = nltk.NaiveBayesClassifier.train(train) #生成分类器
print('Neo is a',classifier.classify(gender_features('Neo')))#分类
print(nltk.classify.accuracy(classifier,test)) #测试准确度
classifier.show_most_informative_features(5)#得到似然比,检测对于哪些特征有用
当然,当我们训练大的语料库的时候,链表会占用很大内存。这时候nltk提供了:apply_features,会生成链表,但是不会在内存中存储所有对象。
from nltk.classify import apply_features
train_set = apply_features(gender_features,names[500:])
test_set = apply_features(gender_features,names[:500])
过拟合:当特征过多
当特征过多的时候(特征集的键值过多),会对一般化的新例子不起作用,称为过拟合。如果抉择特征集的大小,需要不停的测试,找到最吻合的特征集。
错误分析
为了使特征提取器准确度更高,一般将源数据分为两大部分,三小部分:
开发集:
训练集:负责开发
开发测试集:负责错误分析
测试集:负责最终评估
下面