有监督分类过程

![enter image description here][1]
例子:涉及一个特征器,给定一个姓名分析出是男性名字还是女性名字


分析:男性和女性的名字有一些鲜明的特点。以a,e 和i 结尾的很可能是女性,而
以k,o,r,s 结尾的很可能是男性。让我们建立一个分类器更精确地模拟这些差异。

特征提取器:名字最后一个字母

![enter image description here][2]

数据准备:

![enter image description here][3]

特征抽取,训练集测试集划分

![enter image description here][4]

模型生成

>>classifier=nltk.NaiveBayesClassifier.train(train_set)

准确率统计

>> print nltk.classify.accuracy(classifier, test_set)
0.758

似然比

>> classifier.show_most_informative_features(5)
我们可以看出最有区分度的5个特征
Most Informative Features
last_letter = ‘a’ female : male = 38.3 : 1.0
last_letter = 'k‘ male : female = 31.4 : 1.0
last_letter = ‘f’ male : female = 15.3 : 1.0
last_letter = 'p‘ male : female = 10.6 : 1.0
last_letter = ‘w’ male : female = 10.6 : 1.0

  • 如何选择正确的特征 选择相关的特征,并决定如何为一个学习方法编码它们,这对学习方法提取一个好的模 型可以产生巨大的影响。建立一个分类器的很多有趣的工作之一是找出哪些特征可能是相关 的,以及我们如何能够表示它们。虽然使用相当简单而明显的特征集往往可以得到像样的性 能,但是使用精心构建的基于对当前任务的透彻理解的特征,通常会显著提高收益。 典型地,特征提取通过反复试验和错误的过程建立的,由哪些信息是与问题相关的直觉 指引的。它通常以“厨房水槽”的方法开始,包括你能想到的所有特征,然后检查哪些特征 是实际有用

>>def gender_features2(name):

features = {}
features["firstletter"] = name[0].lower()
features["lastletter"] = name[–1].lower()
for letter in 'abcdefghijklmnopqrstuvwxyz':
features["count(%s)" % letter] = name.lower().count(letter)
features["has(%s)" % letter] = (letter in name.lower())
return features

我们看一下John这个名字的特征

>> gender_features2('John')
{'count(j)': 1, 'has(d)': False, 'count(b)': 0, ...}

我们来看一下精度:

>>> print nltk.classify.accuracy(classifier, test_set)
0.748
结果精度下降了一个百分点,事实告诉我们不是特征越多越好给定的学习算法的特征的数目是有限的,如果你提供太多的特征,那么该算法将高度依赖训练数据的特性而一般化到新的例子的效果不会很好。这个问题被称为过拟合一旦初始特征集被选定,完善特征集的一个非常有成效的方法是错误分析。首先,我们选择一个开发集,包含用于创建模型的语料数据。然后将这种开发集分为训练集和开发测试集。
>>> train_names = names[1500:]
>>> devtest_names = names[500:1500]
>>> test_names = names[:500]

训练集用于训练模型,开发测试集用于进行错误分析,测试集用于系统的最终评估

![enter image description here][5]
我们用这个思路看下第一个特征抽取器能不能给我们带来什么启发
>>> train_set = [(gender_features(n), g) for (n,g) in train_names]
>>> devtest_set = [(gender_features(n), g) for (n,g) in devtest_names]
>>> test_set = [(gender_features(n), g) for (n,g) in test_names]
>>> classifier = nltk.NaiveBayesClassifier.train(train_set)

Python自然语言处理 - 系列三的更多相关文章

  1. Python基础笔记系列三:list列表

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! python中的list列表是一种序列型数据类型,一有序数据集合用逗号间隔 ...

  2. Python自然语言处理-系列一

    一:python基础,自然语言概念 from nltk.book import * 1,text1.concordance("monstrous")      用语索引 2,tex ...

  3. python 10 min系列三之小爬虫(一)

    python10min系列之小爬虫 前一篇可视化大家表示有点难,写点简单的把,比如命令行里看论坛的十大,大家也可以扩展为抓博客园的首页文章 本文原创,同步发布在我的github上 据说去github右 ...

  4. Python自然语言处理系列之模拟退火算法

    1.基本概念 模拟退火算法(Simulated Annealing,SA)是一种模拟固体降温过程的最优化算法.其模拟的过程是首先将固体加温至某一温度,固体内部的粒子随温度上升慢慢变为无序的状态,内能增 ...

  5. Python自然语言处理 - 系列四

    一 如何使用形式化语法来描述无限的句子集合的结构?    --上下位无关文法       1.1 一个例子:      grammar1 = nltk.parse_cfg(""&q ...

  6. python 自然语言处理(三)____条件频率分布

    条件频率分布就是频率分布的集合,每个频率分布有一个不同的“条件”,这个条件通常是文本的类别.当语料文本分为几类(文体,主题,作者等)时,可以计算每个类别独立的频率分布,这样,就可以通过条件频率分布研究 ...

  7. 机器学习算法与Python实践之(三)支持向量机(SVM)进阶

    机器学习算法与Python实践之(三)支持向量机(SVM)进阶 机器学习算法与Python实践之(三)支持向量机(SVM)进阶 zouxy09@qq.com http://blog.csdn.net/ ...

  8. 《Python爬虫学习系列教程》学习笔记

    http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己 ...

  9. Python操作redis系列之 列表(list) (四)

    # -*- coding: utf- -*- import redis r =redis.Redis(host=,password="ZBHRwlb1608") 1. Lpush ...

随机推荐

  1. String类和StringBuilder

    1,首先,明确一点,String对象是不可变的,这个不可变的意思是说:任何看起来修改String值的方法,实际上都是创建了一个新的String对象. 2,String对+号操作符进行了重载,而这个重载 ...

  2. js实现pdf对页面的打印

    //-------------------------------点击打印的图标--------------------------------- <div class="dcsc&q ...

  3. 通过 after() 和 before() 方法添加若干新元素

    after() 和 before() 方法能够通过参数接收无限数量的新元素.可以通过 text/HTML.jQuery 或者 JavaScript/DOM 来创建新元素. 在下面的例子中,我们创建若干 ...

  4. 一个简单的servlet容器

    [0]README 0.1)本文部分文字转自 “深入剖析Tomcat”,旨在学习  一个简单的servlet容器  的基础知识: 0.2)for complete source code, pleas ...

  5. SSH框架解析

    当也许能够说是与你的初恋.妙龄的少女開始有些羞涩.是时候说说SHH的故事了.SHH是指Spring+Struts+Hibernate.还记研究生复试那天的面试,老师说了一句话Spring的核心是控制反 ...

  6. 一步步学习python

    python是一种功能比较强的脚本,尤其是在网络应用上,又称作:胶水语言.具体的简介可以在维基百科.百度百科等查得到他的发展史,有事一贯犹 如unix linux等老外打发无聊时间发明的强大工具,这是 ...

  7. lumen 单元测试

    laravel学院:http://laravelacademy.org/post/238.html 简书:https://www.jianshu.com/p/d8b3ac2c4623 问题解决:htt ...

  8. CodeIgniter框架——知识要点汇总

    NO1.学习要点: 一.CodeIgniter 框架的简介 二.CodeIgniter 框架的安装 三.CodeIgniter 框架的目录结构分析 四.CodeIgniter 框架是如何工作的? 五. ...

  9. 七、Dockerfile案例一(jdk1.8安装)

    七.Dockerfile案例一(jdk1.8安装) 1 获取一个简单的Docker系统镜像,并建立一个容器. 这里我选择下载CentOS镜像 docker pull centos 通过docker t ...

  10. 关于vue,angularjs1,react之间的对比

    1.时间投入的问题:相对于react和angularjs,学习vue的时间成本低,而且容易上手. 2.JSX的可读性比较一般.代码的可读性不如vue,当然,vue也支持jsx,但是vue更提倡temp ...