NLTK(5)词性标注

2024-04-14 23:32
文章标签 标注 词性 nltk

本文主要是介绍NLTK(5)词性标注,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 如何确定一个词的词性
    • 1形态学线索
    • 2句法线索
    • 3语义线索
  • NLTK标注器
  • 标注语料库
    • 查看标注
    • 未简化标记集
    • 词性搜索
  • @字典
    • 定义字典
    • 反转字典
    • 字典方法
  • 自动标注
    • 默认标注器(不好)
  • 标注效果评估
    • 正则表达式标注器
    • 查询标注器
    • 回退
  • N-gram标注
    • 一元标注器
    • N-gram标注器
      • 缺点
  • 组合标注器
  • 标注生词
      • 一个基于上下文标注生词的方法:
  • @准确性的极限
  • Brill标注器
    • 思想
    • Brill标注的步骤
    • 代码

如何确定一个词的词性

1形态学线索

一个词的内部结构可能为这个词分类提供有用的线索。举例来说:-ness是一个后缀,与形容词结合产生一个名词,如happy → happiness, ill → illness。如果我们遇到的一个以-ness结尾的词,很可能是一个名词。

英语动词也可以是形态复杂的。例如,一个动词的现在分词以-ing结尾,表示正在进行的还没有结束的行动(如falling, eating)。-ing后缀也出现在从动词派生的名词中,如the falling of the leaves(这被称为动名词)。

2句法线索

另一个信息来源是一个词可能出现的典型的上下文语境。
例如,假设我们已经确定了名词类。那么我们可以说,英语形容词的句法标准是它可以立即出现在一个名词前,或紧跟在词be或very后。

3语义线索

一个词的意思对其词汇范畴是一个有用的线索。例如,名词的众所周知的一个名词定义是根据语义的:“一个人、地方或事物的名称”。在现代语言学,词类的语义标准受到怀疑,主要是因为它们很难规范化。
然而,语义标准巩固了我们对许多词类的直觉,使我们能够在不熟悉的语言中很好的猜测词的分类。
例如,如果我们都知道荷兰语词verjaardag的意思与英语词birthday相同,那么我们可以猜测verjaardag在荷兰语中是一个名词。
然而,一些修补是必要的:虽然我们可能翻译zij is vandaag jarig为it’s her birthday today,词jarig在荷兰语中实际上是形容词,与英语并不完全相同。

NLTK标注器

nltk.pos_tag

import nltk
text = nltk.word_tokenize("and now for something completely different")
nltk.pos_tag(text)
#[('and', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'), ('completely', 'RB'), ('different', 'JJ')]

你可能想知道要引进这种额外的信息的理由是什么。很多这些类别源于对文本中单词分布的粗略分析。考虑下面的分析,涉及woman(名词),bought(动词),over(介词)和the(限定词)。text.similar()方法接收一个单词w,找出所有上下文w1w w2,然后找出所有出现在相同上下文中的词w’,即w1w’w2。可以观察到,搜索woman找到名词;搜索bought找到的大部分是动词;搜索over一般会找到介词;搜索the找到几个限定词。
一个标注器能够正确识别一个句子的上下文中的这些词的标记。
标注器还可以为我们对未知词的认识建模,例如我们可以根据词根scrobble猜测scrobbling可能是一个动词,并有可能发生在he was scrobbling这样的上下文中。

标注语料库

查看标注

只要语料库包含已标注的文本,NLTK的语料库接口都将有一个tagged_words() 方法

nltk.corpus.treebank.tagged_words(tagset='universal')
#[('Pierre', 'NOUN'), ('Vinken', 'NOUN'), (',', '.'), ...]

一个简化的标记集

ADJ      形容词          new, good, high, special, big, local
ADV      副词            really, already, still, early, now
CNJ      连词            and, or, but, if, while, although
DET      限定词          the, a, some, most, every, no
EX       存在量词        there, there's
FW       外来词         dolce, ersatz, esprit, quo, maitre
MOD      情态动词        will, can, would, may, must, should
N        名词           year, home, costs, time, education
NP       专有名词        Alison, Africa, April, Washington
NUM      数词          twenty-four, fourth, 1991, 14:24
PRO      代词          he, their, her, its, my, I, us
P        介词          on, of, at, with, by, into, under
TO       词 to         to
UH       感叹词        ah, bang, ha, whee, hmpf, oops
V        动词          is, has, get, do, make, see, run
VD       过去式         said, took, told, made, asked
VG       现在分词       making, going, playing, working
VN       过去分词       given, taken, begun, sung
WH       Wh 限定词      who, which, when, what, where, how

NLTK中还有其他几种语言的已标注语料库,包括中文,印地语,葡萄牙语,西班牙语,荷兰语和加泰罗尼亚语。

未简化标记集

查看布朗语料库的词性标注,发现优许多NN的变种;有$表示所有格名词,S表示复数名词(因为复数名词通常以s结尾),以及P表示专有名词。此外,大多数的标记都有后缀修饰符:-NC表示引用,-HL表示标题中的词,-TL表示标题(布朗标记的特征)。

NN [('year', 137), ('time', 97), ('state', 88), ('week', 85), ('man', 72)]
NN$ [("year's", 13), ("world's", 8), ("state's", 7), ("nation's", 6), ("company's", 6)]
NN$-HL [("Golf's", 1), ("Navy's", 1)]
NN$-TL [("President's", 11), ("Army's", 3), ("Gallery's", 3), ("University's", 3), ("League's", 3)]
NN-HL [('sp.', 2), ('problem', 2), ('Question', 2), ('business', 2), ('Salary', 2)]
NN-NC [('eva', 1), ('aya', 1), ('ova', 1)]
NN-TL [('President', 88), ('House', 68), ('State', 59), ('University', 42), ('City', 41)]
NN-TL-HL [('Fort', 2), ('Dr.', 1), ('Oak', 1), ('Street', 1), ('Basin', 1)]
NNS [('years', 101), ('members', 69), ('people', 52), ('sales', 51), ('men', 46)]
NNS$ [("children's", 7), ("women's", 5), ("janitors'", 3), ("men's", 3), ("taxpayers'", 2)]
NNS$-HL [("Dealers'", 1), ("Idols'", 1)]
NNS$-TL [("Women's", 4), ("States'", 3), ("Giants'", 2), ("Bros.'", 1), ("Writers'", 1)]
NNS-HL [('comments', 1), ('Offenses', 1), ('Sacrifices', 1), ('funds', 1), ('Results', 1)]
NNS-TL [('States', 38), ('Nations', 11), ('Masters', 10), ('Rules', 9), ('Communists', 9)]
NNS-TL-HL [('Nations', 1)]

词性搜索

使用一个图形化的词性索引工具nltk.app.concordance()
用它来寻找任一单词和词性标记的组合如N N N N, hit/VD, hit/VN或者the ADJ man。

@字典

定义字典

我们可以使用键-值对格式创建字典,有两种方式做这个,我们通常会使用第一个
pos = {'colorless': 'ADJ', 'ideas': 'N', 'sleep': 'V', 'furiously': 'ADV'}

 pos = dict(colorless='ADJ', ideas='N', sleep='V', furiously='ADV')

反转字典

通过值查找键

pos.update({'cats': 'N', 'scratch': 'V', 'peacefully': 'ADV', 'old': 'ADJ'})
pos2 = defaultdict(list)
for key, value in pos.items():pos2[value].append(key)pos2['ADV']
#['peacefully', 'furiously']

字典方法

常用的方法与字典相关习惯用法的总结。

示例	描述
d = {}	创建一个空的字典,并将分配给d
d[key] = value	分配一个值给一个给定的字典键
d.keys()	字典的键的列表
list(d)	字典的键的列表
sorted(d)	字典的键,排好序
key in d	测试一个特定的键是否在字典中
for key in d	遍历字典的键
d.values()	字典中的值的列表
dict([(k1,v1), (k2,v2), ...])	从一个键-值对列表创建一个字典
d1.update(d2)	添加d2中所有项目到d1
defaultdict(int)	一个默认值为0的字典

自动标注

默认标注器(不好)

最简单的标注器是为每个词符分配同样的标记。
为了得到最好的效果,我们用最有可能的标记标注每个词。
nltk.DefaultTagger()

tags = [tag for (word, tag) in brown.tagged_words(categories='news')]
nltk.FreqDist(tags).max()
#'NN'
 raw = 'I do not like green eggs and ham, I do not like them Sam I am!'tokens = word_tokenize(raw)
default_tagger = nltk.DefaultTagger('NN')
default_tagger.tag(tokens)

标注效果评估

.evaluate()

default_tagger.evaluate(brown_tagged_sents)

0.13089484257215028
不出所料,这种方法的表现相当不好。在一个典型的语料库中,它只标注正确了八分之一的标识符
由于我们通常很难获得专业和公正的人的判断,所以使用黄金标准测试数据来代替。这是一个已经手动标注并作为自动系统评估标准而被接受的语料库。当标注器对给定词猜测的标记与黄金标准标记相同,标注器被视为是正确的。

正则表达式标注器

nltk.RegexpTagger()

patterns = [(r'.*ing$', 'VBG'),               # gerunds(r'.*ed$', 'VBD'),                # simple past(r'.*es$', 'VBZ'),                # 3rd singular present(r'.*ould$', 'MD'),               # modals
(r'.*\'s$', 'NN$'),               # possessive nouns(r'.*s$', 'NNS'),                 # plural nouns(r'^-?[0-9]+(.[0-9]+)?$', 'CD'),  # cardinal numbers(r'.*', 'NN')                     # nouns (default)
]
regexp_tagger = nltk.RegexpTagger(patterns)
regexp_tagger.tag(brown_sents[3])
#[('``', 'NN'), ('Only', 'NN'), ('a', 'NN'), ('relative', 'NN'), ('handful', 'NN'),
('of', 'NN'), ('such', 'NN'), ('reports', 'NNS'), ('was', 'NNS'), ('received', 'VBD'),
("''", 'NN'), (',', 'NN'), ('the', 'NN'), ('jury', 'NN'), ('said', 'NN'), (',', 'NN'),
('``', 'NN'), ('considering', 'VBG'), ('the', 'NN'), ('widespread', 'NN'), ...]
regexp_tagger.evaluate(brown_tagged_sents)
#0.20326391789486245

查询标注器

nltk.UnigramTagger()
找出100个最频繁的词,存储它们最有可能的标记。
然后我们可以使用这个信息作为“查找标注器”(NLTK UnigramTagger)的模型

>>> fd = nltk.FreqDist(brown.words(categories='news'))
>>> cfd = nltk.ConditionalFreqDist(brown.tagged_words(categories='news'))
>>> most_freq_words = fd.most_common(100)
>>> likely_tags = dict((word, cfd[word].max()) for (word, _) in most_freq_words)
>>> baseline_tagger = nltk.UnigramTagger(model=likely_tags)
>>> baseline_tagger.evaluate(brown_tagged_sents)
0.45578495136941344

如果词不在100个最频繁的词之中,会被分配一个None标签
在这些情况下,我们想分配默认标记NN。

回退

换句话说,我们要先使用查找表,如果它不能指定一个标记就使用默认标注器,这个过程叫做回退

N-gram标注

一元标注器

一元标注器基于一个简单的统计算法:对每个标识符分配这个独特的标识符最有可能的标记。
一元标注器的行为和查找标注器很相似。

nltk.UnigramTagger()

>>> 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])
[('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'), ('.', '.')]
>>> unigram_tagger.evaluate(brown_tagged_sents)
0.9349006503968017

我们训练一个UnigramTagger,通过在我们初始化标注器时指定已标注的句子数据作为参数。训练过程中涉及检查每个词的标记,将所有词的最可能的标记存储在一个字典里面,这个字典存储在标注器内部。

N-gram标注器

N元标注器,就是检索index= n 的 word,并且检索n-N<=index<=n-1 的 tag。即通过前面词的tag标签,进一步确定当前词汇的tag。类似于nltk.UnigramTagger(),
自带的二元标注器为:nltk.BigramTagger() 用法一致。
在这里插入图片描述

缺点

  • 请注意,二元标注器能够标注训练中它看到过的句子中的所有词,但对一个没见过的句子表现很差。只要遇到一个新词,就无法给它分配标记。
    当n越大,上下文的特异性就会增加,我们要标注的数据中包含训练数据中不存在的上下文的几率也增大。这被称为数据稀疏问题 ,在NLP中是相当普遍的。因此,我们的研究结果的精度和覆盖范围之间需要有一个权衡(这与信息检索中的精度/召回权衡有关)。

-N-gram标注器不应考虑跨越句子边界的上下文。因此,NLTK的标注器被设计用于句子列表,其中一个句子是一个词列表。在一个句子的开始,tn-1和前面的标记被设置为None。

组合标注器

例如,我们可以按如下方式组合二元标注器、一元注器和一个默认标注器,如下:
1尝试使用二元标注器标注标识符。
2如果二元标注器无法找到一个标记,尝试一元标注器。
3如果一元标注器也无法找到一个标记,使用默认标注器。
大多数NLTK标注器允许指定一个回退标注器。回退标注器自身可能也有一个回退标注器
backoff

>>> t0 = nltk.DefaultTagger('NN')
>>> t1 = nltk.UnigramTagger(train_sents, backoff=t0)
>>> t2 = nltk.BigramTagger(train_sents, backoff=t1)
>>> t2.evaluate(test_sents)
0.844513...
  • 请注意,我们在标注器初始化时指定回退标注器,从而使训练能利用回退标注器。于是,在一个特定的上下文中,如果二元标注器将分配与它的一元回退标注器一样的标记,那么二元标注器丢弃训练的实例。这样保持尽可能小的二元标注器模型。我们可以进一步指定一个标注器需要看到一个上下文的多个实例才能保留它,例如nltk.BigramTagger(sents, cutoff=2, backoff=t1)将会丢弃那些只看到一次或两次的上下文。

标注生词

标注生词的方法是回退到一个正则表达式标注器或一个默认标注器,则无法利用上下文。

一个基于上下文标注生词的方法:

是限制一个标注器的词汇表为最频繁的n 个词,替代每个其他的词为一个特殊的词UNK。训练时,一个一元标注器可能会学到UNK通常是一个名词。然而,n-gram标注器会检测它的一些其他标记中的上下文。例如,如果前面的词是to(标注为TO),那么UNK可能会被标注为一个动词。

@准确性的极限

另一个方法查看标注错误是混淆矩阵
它用图表表示期望的标记(黄金标准)与实际由标注器产生的标记

>>> test_tags = [tag for sent in brown.sents(categories='editorial')
...                  for (word, tag) in t2.tag(sent)]
>>> gold_tags = [tag for (word, tag) in brown.tagged_words(categories='editorial')]
>>> print(nltk.ConfusionMatrix(gold_tags, test_tags))     

Brill标注器

nltk.tag.brill.demo()

import nltk
from nltk.tag import brill
brill.nltkdemo18plus()
brill.nltkdemo18()

思想

Brill标注的的过程通常是与绘画类比来解释的。假设我们要画一棵树,包括大树枝、树枝、小枝、叶子和一个统一的天蓝色背景的所有细节。不是先画树然后尝试在空白处画蓝色,而是简单的将整个画布画成蓝色,然后通过在蓝色背景上上色“修正”树的部分。以同样的方式,我们可能会画一个统一的褐色的树干再回过头来用更精细的刷子画进一步的细节。
Brill标注使用了同样的想法:以大笔画开始,然后修复细节,一点点的细致的改变。

Brill标注的步骤

让我们看看下面的例子:

(1) The President said he will ask Congress to increase grants to states for vocational rehabilitation
我们将研究两个规则的运作:
(a)当前面的词是TO时,替换NN为VB;
(b)当下一个标记是NNS时,替换TO为IN。
首先使用一元标注器标注,然后运用规则修正错误。

在这里插入图片描述
在此表中,我们看到两个规则。所有这些规则由以下形式的模板产生:“在上下文C中替换T1为T2”。典型的上下文是之前或之后的词的内容或标记,或者当前词的两到三个词范围内出现的一个特定标记。

在其训练阶段,标注器猜测T1、T2和C的值,创造出数以千计的候选规则。
每一条规则都根据其净收益打分:它修正的不正确标记的数目减去它错误修改的正确标记的数目。

  • Brill标注器的另一个有趣的特性:规则是语言学可解释的。

代码

>>> nltk.tag.brill.demo()
Training Brill tagger on 80 sentences...
Finding initial useful rules...Found 6555 useful rules.B      |S   F   r   O  |        Score = Fixed - Brokenc   i   o   t  |  R     Fixed = num tags changed incorrect -> correcto   x   k   h  |  u     Broken = num tags changed correct -> incorrectr   e   e   e  |  l     Other = num tags changed incorrect -> incorrecte   d   n   r  |  e
------------------+-------------------------------------------------------12  13   1   4  | NN -> VB if the tag of the preceding word is 'TO'8   9   1  23  | NN -> VBD if the tag of the following word is 'DT'8   8   0   9  | NN -> VBD if the tag of the preceding word is 'NNS'6   9   3  16  | NN -> NNP if the tag of words i-2...i-1 is '-NONE-'5   8   3   6  | NN -> NNP if the tag of the following word is 'NNP'5   6   1   0  | NN -> NNP if the text of words i-2...i-1 is 'like'5   5   0   3  | NN -> VBN if the text of the following word is '*-1'...
>>> print(open("errors.out").read())left context |    word/test->gold     | right context
--------------------------+------------------------+--------------------------|      Then/NN->RB       | ,/, in/IN the/DT guests/N
, in/IN the/DT guests/NNS |       '/VBD->POS       | honor/NN ,/, the/DT speed
'/POS honor/NN ,/, the/DT |    speedway/JJ->NN     | hauled/VBD out/RP four/CD
NN ,/, the/DT speedway/NN |     hauled/NN->VBD     | out/RP four/CD drivers/NN
DT speedway/NN hauled/VBD |      out/NNP->RP       | four/CD drivers/NNS ,/, c
dway/NN hauled/VBD out/RP |      four/NNP->CD      | drivers/NNS ,/, crews/NNS
hauled/VBD out/RP four/CD |    drivers/NNP->NNS    | ,/, crews/NNS and/CC even
P four/CD drivers/NNS ,/, |     crews/NN->NNS      | and/CC even/RB the/DT off
NNS and/CC even/RB the/DT |    official/NNP->JJ    | Indianapolis/NNP 500/CD a|     After/VBD->IN      | the/DT race/NN ,/, Fortun
ter/IN the/DT race/NN ,/, |    Fortune/IN->NNP     | 500/CD executives/NNS dro
s/NNS drooled/VBD like/IN |  schoolboys/NNP->NNS   | over/IN the/DT cars/NNS a
olboys/NNS over/IN the/DT |      cars/NN->NNS      | and/CC drivers/NNS ./.

Brill标注器演示:标注器有一个X -> Y if the preceding word is Z形式的模板集合;这些模板中的变量是创建“规则”的特定词和标记的实例;规则的得分是它纠正的错误例子的数目减去正确的情况下它误报的数目;除了训练标注器,演示还显示了剩余的错误。

这篇关于NLTK(5)词性标注的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/904324

相关文章

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

使用JavaScript将PDF页面中的标注扁平化的操作指南

《使用JavaScript将PDF页面中的标注扁平化的操作指南》扁平化(flatten)操作可以将标注作为矢量图形包含在PDF页面的内容中,使其不可编辑,DynamsoftDocumentViewer... 目录使用Dynamsoft Document Viewer打开一个PDF文件并启用标注添加功能扁平化

使用 Python 和 LabelMe 实现图片验证码的自动标注功能

《使用Python和LabelMe实现图片验证码的自动标注功能》文章介绍了如何使用Python和LabelMe自动标注图片验证码,主要步骤包括图像预处理、OCR识别和生成标注文件,通过结合Pa... 目录使用 python 和 LabelMe 实现图片验证码的自动标注环境准备必备工具安装依赖实现自动标注核心

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

vue3 为组件的 emits 标注类型,defineEmits基于类型的定义的简单理解

1)在 <script setup> 中,emit 函数的类型标注也可以通过运行时声明或是类型声明进行。 2)基于类型的: const emit = defineEmits<{ (e: 'change', id: number): void (e: 'update', value: string): void }>() 说明:e: 指定了方法名,id:数字型的参数,这个就是限定了方法名及

水面垃圾检测数据集 3000张 水面垃圾 带标注 voc yolo

数据集概述 该数据集包含3000张图像,专注于水面垃圾的检测。数据集已经按照VOC(Visual Object Classes)和YOLO(You Only Look Once)两种格式进行了标注,适用于训练深度学习模型,特别是物体检测模型,用于识别水面上的各种垃圾。 数据集特点 多样性:包含3000张图像,涵盖了多种类型的水面垃圾,确保模型能够识别各种类型的垃圾。双标注格式:提供VO

军事目标无人机视角检测数据集 3500张 坦克 带标注voc

数据集概述 该数据集包含3500张无人机拍摄的图像,主要用于坦克目标的检测。数据集已经按照VOC(Visual Object Classes)标准进行了标注,适用于训练深度学习模型,特别是物体检测模型。 数据集特点 目标明确:专注于坦克这一特定军事目标的检测。多样视角:图像采集自无人机的不同飞行高度和角度,涵盖了各种环境下的坦克图像。高质量标注:每个坦克实例都被精确标注,包括位置信息和类别

数据标注:深度学习图像自动标注及数据管理工具软件(包括可运行软件)

深度学习具有传统算法无法比拟的拟合能力,已经在工业领域的诸多方面得到了非常广泛的应用。然而,训练数据集的搭建需要大量的人工标注数据,为了尽可能的减少人工标注数据的工作量,开发了一套可以辅助人工进行数据标注的软件工具。该软件主要针对目标检测图像标注,能够生成txt和xml文件格式的标签。另外,软件还实现了标注数据整理的功能。下载链接:https://download.csdn.net/