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 ...
随机推荐
- jQuery的DOM操作之加入元素和删除元素
加入元素: .append()--在目标元素之后加入元素. .prepend()--在目标元素之前加入元素. .after()--在目标元素之后换行加入元素: .before()--在目标元素之前加入 ...
- HDU4911:Inversion
Problem Description bobo has a sequence a1,a2,-,an. He is allowed to swap two adjacent numbers for n ...
- shell定期转移日志文件到云盘并定期删除云盘文件
shell 脚本定期处理如下: cat /home/backup/logs_delete.sh #!/bin/bash /bin/find /data/logs/nginx/ -name " ...
- mongoDB 使用总结
http://blog.chinaunix.net/space.php?uid=22270773&do=blog&id=19935171. 如果无特别用途,建议:表名,字段名 全部用小 ...
- 【SpringMVC学习10】SpringMVC对RESTfull的支持
RESTful架构,就是目前流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越多网站的采用.RESTful架构对url进行规范,写RESTful格式的url是什么样子 ...
- requests 模块入门玩法和高级玩法
1.安装 pip install requests 2. http://docs.python-requests.org/zh_CN/latest/user/quickstart.html http: ...
- js事件之onmousedown和onmouseup
<!DOCTYPE html> <html> <head> <script> function mouseDown() { document.getEl ...
- javascript 温故而知新 getBoundingClientRect
getBoundingClientRect获取元素位置 getBoundingClientRect用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置. getBoundingClient ...
- O(n)求素数,求欧拉函数,求莫比乌斯函数,求对mod的逆元,各种求
筛素数 void shai() { no[1]=true;no[0]=true; for(int i=2;i<=r;i++) { if(!no[i]) p[++p[0]]=i; int j=1, ...
- 在ubuntu1604上使用aria2下载coco数据集效率非常高
简单的下载方法: 所以这里介绍一种能照顾大多数不能上外网的同学的一种简单便捷,又不会中断的下载方法:系统环境: Ubuntu 14.04 方法: a. 使用aria2 搭配命令行下载.需要先安装: s ...