Python自然语言处理 - 系列三
有监督分类过程
![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自然语言处理 - 系列三的更多相关文章
- Python基础笔记系列三:list列表
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! python中的list列表是一种序列型数据类型,一有序数据集合用逗号间隔 ...
- Python自然语言处理-系列一
一:python基础,自然语言概念 from nltk.book import * 1,text1.concordance("monstrous") 用语索引 2,tex ...
- python 10 min系列三之小爬虫(一)
python10min系列之小爬虫 前一篇可视化大家表示有点难,写点简单的把,比如命令行里看论坛的十大,大家也可以扩展为抓博客园的首页文章 本文原创,同步发布在我的github上 据说去github右 ...
- Python自然语言处理系列之模拟退火算法
1.基本概念 模拟退火算法(Simulated Annealing,SA)是一种模拟固体降温过程的最优化算法.其模拟的过程是首先将固体加温至某一温度,固体内部的粒子随温度上升慢慢变为无序的状态,内能增 ...
- Python自然语言处理 - 系列四
一 如何使用形式化语法来描述无限的句子集合的结构? --上下位无关文法 1.1 一个例子: grammar1 = nltk.parse_cfg(""&q ...
- python 自然语言处理(三)____条件频率分布
条件频率分布就是频率分布的集合,每个频率分布有一个不同的“条件”,这个条件通常是文本的类别.当语料文本分为几类(文体,主题,作者等)时,可以计算每个类别独立的频率分布,这样,就可以通过条件频率分布研究 ...
- 机器学习算法与Python实践之(三)支持向量机(SVM)进阶
机器学习算法与Python实践之(三)支持向量机(SVM)进阶 机器学习算法与Python实践之(三)支持向量机(SVM)进阶 zouxy09@qq.com http://blog.csdn.net/ ...
- 《Python爬虫学习系列教程》学习笔记
http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己 ...
- Python操作redis系列之 列表(list) (四)
# -*- coding: utf- -*- import redis r =redis.Redis(host=,password="ZBHRwlb1608") 1. Lpush ...
随机推荐
- MyBatis实战——自动回复机器人
案例分析 基本功能 接收发送指令 根据指令自动回复对应内容 模块划分 回复内容维护 对话功能 回复内容列表 回复内容删除 MyBatis的下载和核心架构的搭建 下载地址:https://github. ...
- 视频输出hdtv和sdtv
SDTV和HDTV人们分别把它们叫标准清晰度数字电视和高清晰度数字电视,SDTV电视节目很早在欧洲就开始广播,如,DVB-S(卫星数字视频广播).DVB-C(有线数字视频广播).DVB-T(地面数字视 ...
- -webkit-transition: all .2s ease-in-out;
W3C标准中对CSS3的transition这是样描述的:CSS的transition允许CSS的属性值在一定的时间区间内平滑地过渡.这种效果可以在鼠标单击.获得焦点.被点击或对元素任何改变中触发,并 ...
- iOS --提取本地<通讯录>数据 <1>
#pragma mark - 获取手机所有联系人 - (void)obtainPhoneAllContact { //这个变量用于记录授权是否成功,即用户是否允许我们访问通讯录 ; //声明一个通讯簿 ...
- LeetCode Problem 9:Palindrome Number回文数
描述:Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could nega ...
- LightOJ1089
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26806 题目大意:略 题目思路:前缀和与离散化 可用线段树做,但是 ...
- 时间格式转换 json 转 datetime js c#
情景描述:使用C#在后台中传递时间到ajax中,因为是一个list<model>就直接用了Json 作为载体,但是在js中获得到的时间是var time='/Date(********** ...
- SQL查临时表没有返回数据集
问题描述:在SQL中可以查询到数据,返回不到页面上. 解决办法: set nocount on create table #list [转] 每次我们在使用查询分析器调试SQL语句的时候,通常会看到一 ...
- FZU 1063 三维扫描(三维连通块)
Accept: 415 Submit: 1291 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description 工业 ...
- 关于string的replace方法
今天写代码遇见一个小问题,就是当string a,b,c,d当腰删除b的时候如果replace(“a”,"");会造成,b,c,d 所以得replace("a&qu ...