在上一章中介绍了用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标注的更多相关文章

  1. python+NLTK 自然语言学习处理:环境搭建

    首先在http://nltk.org/install.html去下载相关的程序.需要用到的有python,numpy,pandas, matplotlib. 当安装好所有的程序之后运行nltk.dow ...

  2. python+NLTK 自然语言学习处理二:文本

    在前面讲nltk安装的时候,我们下载了很多的文本.总共有9个文本.那么如何找到这些文本呢: text1: Moby Dick by Herman Melville 1851 text2: Sense ...

  3. python+NLTK 自然语言学习处理六:分类和标注词汇一

    在一段句子中是由各种词汇组成的.有名词,动词,形容词和副词.要理解这些句子,首先就需要将这些词类识别出来.将词汇按它们的词性(parts-of-speech,POS)分类并相应地对它们进行标注.这个过 ...

  4. python+NLTK 自然语言学习处理八:分类文本一

    从这一章开始将进入到关键部分:模式识别.这一章主要解决下面几个问题 1 怎样才能识别出语言数据中明显用于分类的特性 2 怎样才能构建用于自动执行语言处理任务的语言模型 3 从这些模型中我们可以学到那些 ...

  5. python+NLTK 自然语言学习处理五:词典资源

    前面介绍了很多NLTK中携带的词典资源,这些词典资源对于我们处理文本是有大的作用的,比如实现这样一个功能,寻找由egivronl几个字母组成的单词.且组成的单词每个字母的次数不得超过egivronl中 ...

  6. python+NLTK 自然语言学习处理四:获取文本语料和词汇资源

    在前面我们通过from nltk.book import *的方式获取了一些预定义的文本.本章将讨论各种文本语料库 1 古腾堡语料库 古腾堡是一个大型的电子图书在线网站,网址是http://www.g ...

  7. python+NLTK 自然语言学习处理三:如何在nltk/matplotlib中的图片中显示中文

    我们首先来加载我们自己的文本文件,并统计出排名前20的字符频率 if __name__=="__main__": corpus_root='/home/zhf/word' word ...

  8. Python+NLTK自然语言处理学习(一):环境搭建

    Python+NLTK自然语言处理学习(一):环境搭建 参考黄聪的博客地址:http://www.cnblogs.com/huangcong/archive/2011/08/29/2157437.ht ...

  9. Python NLTK 自然语言处理入门与例程(转)

    转 https://blog.csdn.net/hzp666/article/details/79373720     Python NLTK 自然语言处理入门与例程 在这篇文章中,我们将基于 Pyt ...

随机推荐

  1. [Angular] ViewChild 'read' option

    It is not clear in the Docs about {read: xx} option for @ViewChild. Based on the Source code, @ViewC ...

  2. 关于ionic中几个问题

    第一.每个页面的独立样式style标签不能写在ion-view外面,否则会出现路由问题,建议写在ion-content后面,例如下面的例子中,如果style但在ion-view中的话会出想路由问题,显 ...

  3. ionic准备之angular基础——dom操作相关(6)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. SQL语句练习手册--第二篇

    一.书到用时方恨少:"图书-读者-借阅"类题目 1.1 本题目的表结构 本题用到下面三个关系表: CARDS 借书卡. CNO 卡号,NAME 姓名,CLASS 班级 BOOKS ...

  5. react-native 常见问题 及 解决方案

    一.报错 Warning:Navigator:isMounted is deprecated. Instead, make sure to clean up subscriptions and pen ...

  6. Shell脚本之:函数

    Shell 也支持函数.Shell函数必须先定义后使用. 函数的定义与调用 Shell 函数的定义格式如下: function_name () { list of commands [ return ...

  7. Maven学习小结

    简介:一款服务于Java的自动化构建工具 1 安装 必须已经安装了jdk且配置了环境变量,注意查看当前maven版本支持的jdk版本 配置Maven的环境变量 MAVEN_HOME PATH 使用mv ...

  8. asp.net core mvc视频A:笔记3-5.视图数据共享之TempData

    前几节讲的都是单页面数据共享,从本节开始讲跨页面数据共享 创建项目3.5,新建控制器 代码 控制器 设置TempData 另一个视图中读取TempData数据 运行 此时如果刷新页面,页面中的内容“张 ...

  9. different between method and function

    A method is on an object. A function is independent of an object. For Java, there are only methods. ...

  10. Html.BeginForm 与Section、Partial View 和 Child Action

    该方法用于构建一个From表单的开始,他的构造方法为: Html.BeginForm("ActionName","ControllerName",FormMet ...