NLTK基础教程学习笔记(六)

简介:

用NLYK库实现标注任务的方式有两种:
1:使用NLTK库或其他库中的预置标注器,并将其运用到测试数据上。这两种标注器应该足以应对英语文本环境,以及非特殊领域语料库中的所有词性标注任务。
2:基于测试数据来创建或训练出适合的标注器。
深入了解标注器:
一个典型的标注器通常要用到大量的训练数据,它主要被用于标注出句子中的各种单词,并为其贴上POS标签。标注是一个纯手工的工作,具体如下:

Well/UH what/WP do/VBP you/PRP think/VB about/IN the/DT idea/NN of/IN...

以上是来自Penn Treebank的语义库。其中还有一个语言数据联盟(LDC)专门用来研究不同语言的标注,不同文本种类以及不同标注操作,如词性标注,句法分析标注,以及对话标注等。
通常情况下,像词性标注这样的标注问题往往会被视为顺序标签化的问题或者某种分类问题,后者特指人们为特定token所生成的正确标签,并用先关判别模型对其进行判别的一类问题。
下面是分析Brown语料库中各POS标签的分布频率:

from nltk.corpus import  brown
import nltk
tags=[tag for (word,tag)in brown.tagged_words(categories='news')]
print(nltk.FreqDist(tags))
out=nltk.FreqDist(tags)

结果:

<FreqDist with 218 samples and 100554 outcomes>

由于个数太多无法打印,可以通过debug进去看各个词的的频率。
Debug进去看可以看到NN在这里出现频率最高,可以用来创建一个POS标注器,用来给所有的测试文本分配NN标签。
DefaultTagger函数是顺序性标注器,标注器会去调用evaluate()函数,该函数主要用来评估相关单词POS的准确度,是对Brown语料库的标注器所用的基准:

from nltk.corpus import  brown
import nltk
brown_tagged_sents=brown.tagged_sents(categories='news')
default_tagger=nltk.DefaultTagger('NN')
print(default_tagger.evaluate(brown_tagged_sents))

结果:

0.13089484257215028

准确率大概13%左右
DefaultTagger的表现并不是很好,DefaultTagger本质上只是基类SequentialBackoffTagger的一部分,后者是一个顺序性标注服务。
标注器会试着基于其所处的上下文环境来模型化先关的标签。而且如果它不能进行正确的标签预测,就会去咨询BackoffTagger。通常情况下,DefaultTagger参数都可以被当作一个BackoffTagger实体来使用。
N-gram标注器

from nltk.tag import UnigramTagger
from nltk.tag import DefaultTagger
from nltk.tag import BigramTagger
from nltk.tag import TrigramTagger
from nltk.corpus import  brown
import nltk
brown_tagged_sents=brown.tagged_sents(categories='news')
default_tagger=nltk.DefaultTagger('NN')
train_data=brown_tagged_sents[:int(len(brown_tagged_sents)*0.9)]
test_data=brown_tagged_sents[int(len(brown_tagged_sents)*0.9):]
unigram_tagger=UnigramTagger(train_data,backoff=default_tagger)
print(unigram_tagger.evaluate(test_data))
bigram_tagger=BigramTagger(train_data,backoff=unigram_tagger)
print(bigram_tagger.evaluate(test_data))
trigram_tagger=TrigramTagger(train_data,backoff=bigram_tagger)
print(trigram_tagger.evaluate(test_data))

结果:

0.8368384331705372
0.8460081730290043
0.8439150802352238

其中,基于元模型的标注只考虑相关标签的条件概率,以及针对每个给定token所能预测到的、频率最高的标签。而bigram-tagger参数将会考虑给定的单词和该单词的前一个单词,其标签将以元组的形式来关联被测试单词所得到的标签。类似的,TrigramTagger参数将让其查找过程兼顾到给定单词的前两个单词。
TrigramTagger参数的覆盖范围比较小,而实例精度则高一些。从另一方面来说,UnigramTagger的覆盖范围则会大一些。为了让准确率和反馈率之间保持平衡,上述代码结合了这三种标注器。
timg

目录
相关文章
|
5月前
|
机器学习/深度学习 数据采集 算法
Scikit-Learn基础教程
Scikit-Learn基础教程
112 2
|
自然语言处理 Python
NLTK 基础知识总结
NLTK 基础知识总结
118 0
NLTK 基础知识总结
|
机器学习/深度学习 自然语言处理
|
机器学习/深度学习 自然语言处理
|
机器学习/深度学习
|
机器学习/深度学习 数据可视化
|
JSON JavaScript 数据格式
|
自然语言处理 算法 Python