《使用Python进行自然语言处理》学习笔记八

第六章 学习分类文本

6.1 有监督分类

1 分类概述

分类是为给定的输入选择正确的类标签的任务。在基本的分类任务中,每个输入被认为是与所有其它输入隔离的,并且标签集是预先定义的。基本的分类任务有许多有趣的变种。例如: 在多类分类中, 每个实例可以分配多个标签;在开放性分类中, 标签集是事先没有定义的; 在序列分类中, 一个输入链表作为一个整体分类。如果分类的建立基于包含每个输入的正确标签的训练语料,被称为有监督分类。

《使用Python进行自然语言处理》学习笔记八_第1张图片

(a)在训练过程中,特征提取器用来将每一个输入值转换为特征集。这些特征集捕捉每个输入中应被用于对其分类的基本信息。特征集与标签的配对被送入机器学习算法,生成模型。 (b) 在预测过程中,相同的特征提取器被用来将未见过的输入转换为特征集。之后,这些特征集被送入模型产生预测标签。

在处理大型语料库时,构建一个包含每一个实例的特征的单独的链表会使用大量的内存。在这些情况下,使用函数nltk.classify.apply_features,返回一个行为像一个链表而不会在内存存储所有特征集的对象:

2 选择正确的特征

建立一个分类器的很多有趣的工作之一是找出哪些特征可能是相关的,以及我们如何能够表示它们。虽然使用相当简单而明显的特征集往往可以得到像样的性能,但是使用精心构建的基于对当前任务的透彻理解的特征,通常会显著提高收益。

然而,你要用于一个给定的学习算法的特征的数目是有限的,如果你提供太多的特征,那么该算法将高度依赖你的训练数据的特性而一般化到新的例子的效果不会很好。这个问题被称为过拟合,当运作在小训练集上时尤其会有问题。

3 文档分类

书里的实验介绍原理就像写小说一样有好几条线索,看第一遍竟然还绕了一下,其实看明了是这样的:第一条线是按照movie_reviews里的分类pos和neg和里面包含的文本生成一个元组(文件内容,文件的评价倾向),到这一步第一条线就暂时完成了;第二条线是对词频进行统计取movie_reviews频次最高的2000个词作为特征词(其实评价的多是群众,群众的词汇使用还是很集中的,2000个足够了);第三条线是对某篇文档的内容对照2000词的词表进行布尔判断,判断特征词在或者不在,其实是一个局部测试,测试词抽取;第四条线,也就是主线是取movie_reviews中的前100篇文档作为测试语料,其余的作为训练语料,训练一个NB分类器然后测试性能,然后评价出featuresets中平评价倾向最清楚的5个词,其细节应该是计算特征词在pos和neg里的出现次数然后比较一下。

《使用Python进行自然语言处理》学习笔记八_第2张图片

4 探索上下文语境

为了采取基于词的上下文的特征,我们必须修改以前为我们的特征提取器定义的模式。

不是只传递已标注的词,我们将传递整个(未标注的)句子,以及目标词的索引。

5 序列分类

一种序列分类器策略,称为连续分类或贪婪序列分类,是为第一个输入找到最有可能的类标签,然后使用这个问题的答案帮助找到下一个输入的最佳的标签。这个过程可以不断重

复直到所有的输入都被贴上标签。

6.2 有监督分类的更多例子

1 句子分割

句子分割可以看作是一个标点符号的分类任务:每当我们遇到一个可能会结束一个句子的符号,如句号或问号,我们必须决定它是否终止了当前句子。

这很重要,对于正规文本可能还好一点,但是对于那些比较不规整的社会媒体的数据有很多不断句的内容,也许预处理就可以靠这个来处理这个问题。当然只是用标点符号来判断就太简单了,应该是靠上下文,词语,表情,种种…

运行NltkTest212. segment_sentences(words)时出错了,得到了一个

ValueError: need more than 1 value tounpack可能是words的格式不对,今天好累啊,没有力气去排查了,先mark一下按下不表。

2识别对话行为类型

NPS 聊天语料库包括超过 10,000 个来自即时消息会话的帖子。这些帖子都已经被贴上 15 种对话行为类型中的一种标签,例如:“陈述”,“情感”。书里给了一个基于词是否出现的布尔分类器,67%的准确率还是蛮准的,不过这种结果得到就是为了当baseline的还是最低的那个。书上给的是0.66的结果,这略有的不同可能是语料库更新了吧。

实现参考NltkTest218. PostClassifierTest

3 识别文字蕴含

RTE感觉很难,不作深入探讨。一个普通人是没有力量去了解整个宇宙的秘密的。

4 扩展到大型数据集

两个意思,第一:Python很好用;第二:Python很难做到非常快。我的打算是混合编程吧,C,Java和Python互相调用,取长补短吧。但是真要是做系统,估计很难说服老板接收这么干。

6.3 评估

1 测试集

大多数评估技术为模型计算一个得分,通过比较它在测试集(或评估集) 中为输入生成的标签与那些输入的正确标签。 该测试集通常与训练集具有相同的格式。 然而, 测试集与训练语料不同是非常重要的: 如果我们简单地重复使用训练集作为测试集, 那么一个只记住了它的输入而没有学会如何推广到新的例子的模型会得到误导人的高分。

建立测试集时,往往是一个可用于测试的和可用于训练的数据量之间的权衡。对于有少量平衡的标签和一个多样化的测试集的分类任务,只要 100 个评估实例就可以进行有意义的

评估。但是, 如果一个分类任务有大量的标签或包括非常罕见的标签, 那么选择的测试集的大小就要保证出现次数最少的标签至少出现 50 次。此外,如果测试集包含许多密切相关的实例——例如:来自一个单独文档中的实例——那么测试集的大小应增加,以确保这种多样性的缺乏不会扭曲评估结果。当有大量已标注数据可用时,只使用整体数据的 10%进行评估常常会在安全方面犯错。选择测试集时另一个需要考虑的是测试集中实例与开发集中的实例的相似程度。这两个数据集越相似,我们对将评估结果推广到其他数据集的信心就越小。

2精确度,召回率和F-度量值

假如公司有两个员工P和R,P追求精确度,R追求召回率,那么他们的办公室原则就是:

P:干的活中符合老板要求的占多少才是关键,高精确度需要少做无用功,做的多不如做的巧。

R:老板要求干的活尽量做遗漏少才是关键,高召回率需要尽量多去干活,多干总有干的对的。

老板让他们去找一些漂亮姑娘陪客户吃饭,P只找来6个,不过其中5个都很漂亮。R找来30个其中有15个比较漂亮。老板会想,能不能有懂事的副手啊?

P和R观点差距太大,是没办法一起愉快的玩耍的,不过他们都有个朋友叫F,F就是比较懂事的,知道老板是要请9个客户吃饭,自己虽然可以用心找但是能找到的姑娘是否符合老板心意有很难把握,那就找15个,15个里面至少有2/3符合老板要求,而且又不会使公司的接待费超标。

娱乐自己一下,应该都是说清楚了。

3 交叉验证

数据集有限的时候,不方便一次得出准确稳定的评价结果,就可以采取这个交叉验证的方法,每次取一部分数据作为测试数据,剩下的做训练数据,然后总结很多次的结果得出中肯的最终结果。


'''
Created on 2014-3-15

@author: liTC
'''
import nltk

class NltkTest218:
    posts = nltk.corpus.nps_chat.xml_posts()[:10000]
    def __init__(self):
       print 'Initing...'
    def dialogue_act_features(self,post):
        features = {}
        for word in nltk.word_tokenize(post):
            features['contains(%s)' % word.lower()] = True
        return features
    def PostClassifierTest(self):
        featuresets = [(self.dialogue_act_features(post.text), post.get('class'))for post in self.posts]
        size = int(len(featuresets) * 0.1)
        train_set, test_set = featuresets[size:], featuresets[:size]
        classifier = nltk.NaiveBayesClassifier.train(train_set)
        print nltk.classify.accuracy(classifier, test_set)
        
nt218=NltkTest218()
nt218.PostClassifierTest()


你可能感兴趣的:(windows,python,自然语言处理,NLP,7)