在上一章中介绍了用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. jdk/java版本与Android源码编译中的错误

    错误一:javap未指向有效的java版本 Traceback (most recent call last): File "../../base/android/jni_generator ...

  2. Windows虚拟内存如何设置

    当我们在运行一些大型的软件,或者是刚刚退出游戏的时候经常会提示"你的虚拟内存过低"的提示,出现这种情况一般是:一:你的物理内存比较小,运行大的软件比较吃力:二:你运行了许多窗口或者 ...

  3. Windows网页上碰到无法完全显示的图片怎么办

    如图所示,下一幅图片只能显示一半. 我们选中并在新标签中打开 一般即可正常显示,如果还不行,留意地址栏,这就是这个图片的真实地址,我们完全可以用迅雷直接把这幅图片下载下来. 我们甚至可以猜测,去掉后缀 ...

  4. python实现大文件分割与合并

    小U盘传大电影时可以免去用winrar分割文件时的压缩和解压缩过程. file.py import sys from os.path import exists fileCount = 0 def s ...

  5. SQL语句练习手册--第四篇

    一.变量那点事儿 1.1 局部变量 (1)声明局部变量 DECLARE @变量名 数据类型 ) DECLARE @id int (2)为变量赋值 SET @变量名 =值 --set用于普通的赋值 SE ...

  6. 为什么要上大四???why

    毕业证        即将要上大四了.近期一直在思考,毕业证对于我有什么作用呢?我从来不忌讳表露自己的观点.哪怕这个观点是错误的. 如今这个观点,想必又要激起无数人对我的责骂吧?        但是毕 ...

  7. sql server内置函数

    MSDN标准文档:https://msdn.microsoft.com/zh-cn/library/ff848784(v=sql.120).aspx 配置函数 select @@servername ...

  8. ylb:使用sql语句实现添加、删除约束

    ylbtech-SQL Server:SQL Server-使用sql语句实现添加.删除约束 --主键约束(Primary Key constraint):要求主键列的数据唯一,并且不允许为空. -- ...

  9. C# 接口中的索引器

    索引器可在 接口(C# 参考) 上声明.接口索引器的访问器与类索引器的访问器具有以下方面的不同: 接口访问器不使用修饰符. 接口访问器没有体. 因此,访问器的用途是指示索引器是读写.只读还是只写.以下 ...

  10. 使用eclipse开发hbase程序

      一:在eclipse创建一个普通的java项目 二:新建一个文件夹,把hbase需要的jar放进去,我这里把hbase/lib/*.jar 下所有的jar都放进去了,最后发现就用到了下面三个jar ...