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 ...
随机推荐
- Encourage_by_WeChat
- VLC Web插件的浏览器兼容性
网页插件实现原理 IE浏览器基于Activex插件来实现,非IE浏览器采用NPAPI来实现,所以,非浏览器需要支持NPAPI来实现. IE浏览器 FF浏览器(版本小于52) 原因从 Firefox 版 ...
- Spring MVC简单URL处理程序映射
以下示例显示如何使用Spring Web MVC框架来实现一个简单URL处理程序映射. SimpleUrlHandlerMapping类分别显式地将URL映射到相应的控制器上. 所下所示配置 - &l ...
- 大量数据导入导致mysql自动重启
昨天晚上第十款做数据库迁移,数据库版本:Version: '5.1.61',数据量27G左右 message报错信息如下: Mar :: VM_163_210_tlinux kernel: [, oo ...
- Unity3D学习笔记——IDE工作视图
Unity3D中五个界面的使用: Project视图:存放游戏资源,比如贴图,音频,JS脚本等 Project中可创建的文件如下: Hierarchy视图:主要存放游戏场景中的对象,如摄像机,精灵,箱 ...
- python3----函数(sort和sorted)
在学习python的过程中,感觉python中的排序相和c++中的泛型算法还是比较相似的,但相对于c++而言更加简单易用. python中列表的内置函数sort()可以对列表中的元素进行排序,而全局性 ...
- 5-1、easyUI-菜单与按钮(上节问题与解决)
首先把上节的代码copy过来,如下: <html> <head> <meta http-equiv="Content-Type" content=&q ...
- Android无线测试之—UiAutmator运行命令介绍与快速调试
一.运行命令介绍: #Test.java package com.uiautomatortest; import android.os.Bundle; import android.os.Remote ...
- 基于Boost无锁队列实现的内存池
- Ubuntu 系统下可以做什么?
ubuntu和windows到底有什么不同呢?从大的方面讲,它们的设计理念不同.借用一位知乎前辈说的“windows为不知道自己正在做什么的人设计,linux为知道自己要做什么,正在做什么的人设计”. ...