在上一章中介绍了用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. ubuntu12.04下sun-java1.6-jdk配置

    1. 下载安装 2. 设置安装的默认程序 $ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.7.0_2 ...

  2. Location配置与ReWrite语法

    1 Location语法规则 1.1 Location规则 语法规则: location [=|~|~*|^~] /uri/ {… } 首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是 ...

  3. JVM源码分析之FinalReference完全解读

    Java对象引用体系除了强引用之外,出于对性能.可扩展性等方面考虑还特地实现了4种其他引用:SoftReference.WeakReference.PhantomReference.FinalRefe ...

  4. redux VS mobx (装饰器配合使用)

    前言:redux和mobx都是状态管理器,避免父级到子级再到子子级嵌套单向数据流,可以逻辑清晰的管理更新共享数据.(刷新页面redux储蓄数据即消失) 配置使用装饰器(使用高阶函数包装你的组件): n ...

  5. Excel中判断一个表中的某一列的数据在另一列中是否存在

      A B C D 1 10   3 有 2 6   e 无 3 3   6 有 判断c列的值在A列中是否存在(假定C列为需要判断列,A列为目标列) 在D1中输入以下公式,然后下拉公式即可 =IF(C ...

  6. mysql主从从

    1.从官网下载安装percona-xtrabackup2.xtrabackup只能备份和恢复innodb的表,所以这里用innobackupex,可以实现对myisam和innodb的表在线备份和恢复 ...

  7. js删除cookie的方法

    以上图片有两种方法,推荐第二种

  8. Eclipse Plugin Installation and Windows User Access Control

    I make Eclipse Plugins and I sell them to developers using Eclipse. Most of the visitors to my web s ...

  9. scala 编写wordCount

    加载文件 scala> var f1=sc.textFile("/tmp/dataTest/followers.txt") scala> f1.flatMap(x=&g ...

  10. esper 附录A

    A2 select irstream symbol, volume, price from MarketDate.win.time(5.5 sec) seconds seconds seconds s ...