Python自然语言处理笔记【二】文本分类之监督式分类的细节问题
一、选择正确的特征
1.建立分类器的工作中如何选择相关特征,并且为其编码来表示这些特征是首要问题。
2.特征提取,要避免过拟合或者欠拟合
- 过拟合,是提供的特征太多,使得算法高度依赖训练数据的特性,而对于一般化的新例子不起作用,在小型训练集上通常会出现这种问题。
- 欠拟合,是特征太少,算法不能很好地反映实例的特性
3.用错误分析的方法来完善特征集,首先选择开发集,其中包含用于创建模型的语料数据。然后开发集分为训练集和开发测试集。
>>> train_names = names[1500:] >>> devtest_names = names[500:1500] >>> test_names = names[:500]
注意:
- 训练集用于训练模型,开发测试集用于进行错误分析,测试集用于系统的最终评估。进行错误分析的是单独的测试开发集,不是测试集。
- 语料数据分为两类:开发集和测试集 。 开发集通常被进一步分为训练集和开发测试集。
- 将语料分为适当的数据集,我们使用训练集训练一个模型,然后在开发测试集上运行。
4.使用开发测试集,我们可以生成一个分类器预测名字性别时的错误列表。
>>> errors = [] >>> for (name, tag) in devtest_names: ... guess = classifier.classify(gender_features(name)) ... if guess != tag: ... errors.append( (tag, guess, name) )
借助错误分析可以调整我们的特征提取器包括两个字母后缀的特征。这个错误分析过程可以不断重复,检查存在于由新改进的分类器产生的错误中的模式, 每一次错误分析过程被重复。
注意:一旦我们已经使用了开发测试集帮助我们开发模型,关于这个模型在新数据会表 现多好,我们将不能再相信它会给我们一个准确地结果!因此,保持测试集分离、未使用过, 直到我们的模型开发完毕是很重要的。
二、文档分类
对于分类文档时:
1.构造已经标记类别的文档清单
2.为文档定义特征提取器,对于文档主题识别,可以为每个词定义一个特性以表示该文档是否包含这个词。
三、词性标注
训练一个分类器来算出那个后缀最有信息量
1.找出最常见的后缀
>>> from nltk.corpus import brown >>> suffix_fdist = nltk.FreqDist() >>> for word in brown.words(): ... word = word.lower() ... suffix_fdist.inc(word[-1:]) ... suffix_fdist.inc(word[-2:]) ... suffix_fdist.inc(word[-3:]) >>> common_suffixes = suffix_fdist.keys()[:100] >>> print common_suffixes
2.定义一个特征提取器函数,检查给定的单词的这些后缀:
>>> def pos_features(word): ... features = {} ... for suffix in common_suffixes: ... features['endswith(%s)' % suffix] = word.lower().endswith(suffix) ... return features
分类器在标记时,将根据特征提取函数所强调的那些属性来做标记。
四、探索上下文语境
基于词的上下文特征,不能只传递已标注的词,而是传递整个(未标注的)句子,以及目标词的索引。
这种方式是使用依赖上下文的特征提取器来定义一个词性标记分类器。
这能提高词性标注器的性能,但无法研究一般的情况
五、序列分类
为了获取相关的分类任务之间的依赖关系,我们可以使用联合分类器模型,为相关输入选择适当的标签。
在词性标注的例子中,各种不同的序列分类器模型可以被用来为一个给定的句子中的所有的词共同选择词性标签。
连续分类或贪婪序列分类策略,即为第一个输入找到最有可能的 类标签,然后在此基础上帮助找到下一个输入的最佳的标签。这个过程不断重复直到所有的输入都被贴上标签。
过程:定义特征提取器,可以继续建立我们的序列分类器。在训练中,使用 已标注的标记为特征提取器提供适当的历史信息,但标注新的句子时,我们基于标注器本身的输出产生历史信息。
六、其他序列分类方法
转型联合分类的工作原理是为输入的标签创建一个初始值,然后反复提炼那个值,尝试修复相关输入之间的不一致。