python+NLTK 自然语言学习处理七:N-gram标注
在上一章中介绍了用pos_tag进行词性标注。这一章将要介绍专门的标注器。
首先来看一元标注器,一元标注器利用一种简单的统计算法,对每个标识符分配最有可能的标记,建立一元标注器的技术称为训练。
from nltk.corpus import brown
brown_tagged_sents=brown.tagged_sents(categories='news')
brown_sents=brown.sents(categories='news')
unigram_tagger=nltk.UnigramTagger(brown_tagged_sents)
unigram_tagger.tag(brown_sents[2007])
在上面的例子中,首先得到布朗新闻中的news类别中的词语标注器。然后通过nltk.UnigramTagger对这个词语标注器进行训练。然后通过得到的训练器对brown_sents[2007]进行训练。得到如下结果,这个结果就是根据之前的训练集合进行的标注。通过在初始化标注器时指定已标注的句子数据作为参数来训练一元标注器。训练过程中涉及检查每个词的标记,将所有词的可能标记存储在一个字典里面,这个字典存储在标注器内部
[('Various', 'JJ'), ('of', 'IN'), ('the', 'AT'), ('apartments', 'NNS'), ('are', 'BER'), ('of', 'IN'), ('the', 'AT'), ('terrace', 'NN'), ('type', 'NN'), (',', ','), ('being', 'BEG'), ('on', 'IN'), ('the', 'AT'), ('ground', 'NN'), ('floor', 'NN'), ('so', 'QL'), ('that', 'CS'), ('entrance', 'NN'), ('is', 'BEZ'), ('direct', 'JJ'), ('.', '.')]
对于这个标注结果还可以用evaluate来看下标注准确度。
unigram_tagger.evaluate(brown_tagged_sents)
标注成功率为0.9349006503968017
一般的N-grim的标注:
当基于unigrams处理语言处理任务时,可使用上下文中的项目。标注的时候只考虑当前的标识符,而不考虑其他上下文。但是实际的情况是一个词的标记其实是依赖上下文的。一元标注器又称为1-gram. 那么对应的如果考虑当前词的前一个词的标记称为二元标注器bigramTagger,如果考虑当前词的前二个词的标记称为二元标注器triramTagger,对于前面的例子我们用二元标注器来做下测试
brown_tagged_sents=brown.tagged_sents(categories='news')
brown_sents=brown.sents(categories='news')
train_sents=brown_tagged_sents[:4000]
test_sents=brown_tagged_sents[4200:]
bigram_tagger=nltk.BigramTagger(train_sents)
bigram_tagger.tag(brown_sents[2007])
print(bigram_tagger.evaluate(train_sents))
print(bigram_tagger.evaluate(test_sents))
在这里train_sents为训练采用的句子,用的是前4000个句子。test_sents为测试有那个的句子,用的是从第4200之后的句子。但是用train_sents进行训练。来看下针对train_sents和test_sents的标注成功率
一个是0.78,一个是0.09.
0.78845977433263
0.09980237154150198
为什么二元标注器的成功率这么小呢,原因在于因为要考虑前面的词的词性。因此如果前面的词标记为None,训练过程中也从来没有见过它前面有None标记的词,因此标注器也无法标注句子的其余部分,这就是准确度很低的原因。当n越大的时候,上下文的特异性就会增加,要标注的数据中包含训练数据中不存在的上下文几率也增大,这被称为数据稀疏问题。要解决这个问题,可以采用组合标注器。步骤如下:
1 使用bigram标注器标注标识符
2 如果bigram标注器无法找到标记,尝试unigram标注器
3 如果unigram标注器也无法找到标记,使用默认标注器
代码如下:
t0=nltk.DefaultTagger('NN')
t1=nltk.UnigramTagger(train_sents,backoff=t0)
t2=nltk.BigramTagger(train_sents,backoff=t1)
print(t2.evaluate(test_sents))
t0代表默认标注器,词性是NN,t1是一元标注器,设置backoff=t0代表的是如果找不到则采用默认标注器,t2是二元标注器,设置backoff=t1代表的是如果找不到则采用二元标注器,
经过这种联合标注器,标注准确度提升到0.8447518664909969
在大语料库中训练标注器需要大量的时间,没有必要重复训练标注器,可以将一个训练好的标注器保存到文件后以后使用.
将标注器t2保存到文件t2.pkl中
from cPickle import dump
output=open(‘t2.pkl’,’wb’)
dump(t2,output,-1)
output.close()
从文件中导入
input=open(‘t2.pkl’,’rb’)
tagger=load(input)
input.close()
python+NLTK 自然语言学习处理七:N-gram标注的更多相关文章
- python+NLTK 自然语言学习处理:环境搭建
首先在http://nltk.org/install.html去下载相关的程序.需要用到的有python,numpy,pandas, matplotlib. 当安装好所有的程序之后运行nltk.dow ...
- python+NLTK 自然语言学习处理二:文本
在前面讲nltk安装的时候,我们下载了很多的文本.总共有9个文本.那么如何找到这些文本呢: text1: Moby Dick by Herman Melville 1851 text2: Sense ...
- python+NLTK 自然语言学习处理六:分类和标注词汇一
在一段句子中是由各种词汇组成的.有名词,动词,形容词和副词.要理解这些句子,首先就需要将这些词类识别出来.将词汇按它们的词性(parts-of-speech,POS)分类并相应地对它们进行标注.这个过 ...
- python+NLTK 自然语言学习处理八:分类文本一
从这一章开始将进入到关键部分:模式识别.这一章主要解决下面几个问题 1 怎样才能识别出语言数据中明显用于分类的特性 2 怎样才能构建用于自动执行语言处理任务的语言模型 3 从这些模型中我们可以学到那些 ...
- python+NLTK 自然语言学习处理五:词典资源
前面介绍了很多NLTK中携带的词典资源,这些词典资源对于我们处理文本是有大的作用的,比如实现这样一个功能,寻找由egivronl几个字母组成的单词.且组成的单词每个字母的次数不得超过egivronl中 ...
- python+NLTK 自然语言学习处理四:获取文本语料和词汇资源
在前面我们通过from nltk.book import *的方式获取了一些预定义的文本.本章将讨论各种文本语料库 1 古腾堡语料库 古腾堡是一个大型的电子图书在线网站,网址是http://www.g ...
- python+NLTK 自然语言学习处理三:如何在nltk/matplotlib中的图片中显示中文
我们首先来加载我们自己的文本文件,并统计出排名前20的字符频率 if __name__=="__main__": corpus_root='/home/zhf/word' word ...
- Python+NLTK自然语言处理学习(一):环境搭建
Python+NLTK自然语言处理学习(一):环境搭建 参考黄聪的博客地址:http://www.cnblogs.com/huangcong/archive/2011/08/29/2157437.ht ...
- Python NLTK 自然语言处理入门与例程(转)
转 https://blog.csdn.net/hzp666/article/details/79373720 Python NLTK 自然语言处理入门与例程 在这篇文章中,我们将基于 Pyt ...
随机推荐
- WEB接口测试之Jmeter接口测试自动化 (二)(数据分离)
转载: http://www.cnblogs.com/chengtch/p/6105231.html 通过逐个录入的方式,好不容易将需要测试几十个接口的300多个测试用例录入sampler-ht ...
- 原来,多年以来,我一直是个curl/CRUD程序员
curl,就是create,update,remove,list的首字母简写.说是CRUD似乎更流行些,不过无所谓,知道是一个意思就好. curl程序员,就是增改删查程序员,中文说增删改查更加顺口. ...
- Vue笔记五
十二.过滤器(filter) 示例代码: <template> <div id="app"> {{ msg | capitalize }} </div ...
- Appium Android Bootstrap源代码分析之简单介绍
在上一个系列中我们分析了UiAutomator的核心源代码,对UiAutomator是怎么执行的原理有了根本的了解.今天我们会開始另外一个在安卓平台上基于UiAutomator的新起之秀--Appiu ...
- mysql :安装过程中的问题
安装mysql 选择路径的问题 出现如下问题:说明之前安装过mysql,写在的不干净
- Android 冷兵器 之 tools
代码地址如下:http://www.demodashi.com/demo/12612.html 前言 Android开发在所难免的就是UI的预览和调整,一般情况下都是直接run看效果,或者是使用AS的 ...
- 解决scrollView中嵌套viewPager的冲突问题
很简单,在外层ScrollView中添加android:fillViewport="true"属性,然后给viewPager添加一个固定高度
- java笔记之static&final&abstract
知识需要不断回顾和重新认识 一:static static类型变量初始值只能被赋值一次,它的整个生命周期是源程序,程序结束前变量都不会被释放. 例如: for(int i = 0; i<10; ...
- android读取xml文件来实现省份,城市,区的选择
本博客如需转载.请注明出处. ------------------------------------------------------------------------------------- ...
- Unity2D实现人物三连击
之前写过一个系列<HTML5 2D平台游戏开发>,在此过程中发现有很多知识点没有掌握,而且用纯JavaScript来开发一个游戏效率极低,因为调试与地图编辑都没有可视化的工具,开发起来费时 ...