第六章 学习分类文本
本章目标 是 回答如下问题:
- 我们怎样才能识别语言数据中能明显用于对其分类的特征?
- 我们怎样才能构建语言模型,用于自动执行语言处理任务?
- 从这些模型中我们可以学到哪些关于语言的知识
6.1 有监督分类
<一>整体流程示例:
- 在基本的分类任务中,每个输入被认为是与所有其它输入隔离的,并且标签集是预先定义的。
- 如果分类的建立基于包含每个输入的正确标签的训练语料,被称为有监督分类 将着眼于分类器如何能够解决各种各样的任务
- step1 定义一个特征提取器
# 定义一个 特征提取器
def gender_features(word):
return {'last_letter': word[-1]}
- step2 使用特征提取器处理名称数据,并划分特征集的结果链表为一个 训练集和 一个 测试集。
# 准备数据集。(例子 和 对应标签)(标签 是性别:male/female)
from nltk.corpus import names
import random
names = ([(name, 'male') for name in names.words('male.txt')] +
[(name, 'female') for name in names.words('female.txt')])
random.shuffle(names)
# 使用特征提取器处理名称数据,并划分特征集的结果链表为一个 训练集和
# 一个 测试集。训练集用于训练一个新的“朴素贝叶斯”分类器。
featuresets = [(gender_features(n), g) for (n, g) in names]
train_set, test_set = featuresets[500:], featuresets[:500]
classifier = nltk.NaiveBayesClassifier.train(train_set)
- step3 预测
# 测试一些没有出现在训练数据中的名字
print(classifier.classify(gender_features('Neo')))
print(classifier.classify(gender_features('Trinity')))
print(nltk.classify.accuracy(classifier, test_set))
# 检查分类器,确定哪些特征对于区分名字的性别是最有效的
print(classifier.show_most_informative_features(5))
这些比率称为 似然比,可以用于比较不同特征-结果关系
3) 在处理大型语料库时,构建一个包含每一个实例的特征的单独的链表会使用大量的内 存。在这些情况下,使用函数 nltk.classify.apply_features,返回一个行为像一个链表而不会在内存存储所有特征集的对象
>>> from nltk.classify import apply_features
>>> train_set = apply_features(gender_features, names[500:])
>>> test_set = apply_features(gender_features, names[:500])
<二> 选择正确的特征
- 建立一个分类器的很多有趣的工作之一是找出哪些特征可能是相关的,以及我们如何能够表示它们
- 由于用于一个给定的学习算法的特征的数目是有限的——如果你提供太多的特 征,那么该算法将高度依赖你的训练数据的特,性而一般化到新的例子的效果不会很好。这个问题被称为 过拟合,当运作在小训练集上时尤其会有问题。
3) 一旦初始特征集被选定,完善特征集的一个非常有成效的方法是 错误分析。首先,我们选择一个 开发集,包含用于创建模型的语料数据。然后将这种开发集分为 训练集和 开发测试集。
训练集用于训练模型,开发测试集用于进行错误分析,测试集用于系统的最终评估。
>>> train_names = names[1500:]
>>> devtest_names = names[500:1500]
>>> test_names = names[:500]
<三>文档分类
- 给文档 定义一个 特征提取器。从而使分类器知道 哪些方面的数据应注意
- 用特征提取器 训练一个分类器。
用测试集 计算 准确性。