查看全课大纲(第 22 / 69 节)
- 1.NLP 的研究领域、应用与学习路径
- 2.自然语言的基本术语
- 3.信息论基础:信息熵与交叉熵
- 4.语言的进化与语义变迁
- 5.主观概率、客观概率与条件概率
- 6.贝叶斯原理与推理
- 7.随机变量:二项式、期望方差与联合概率
- 8.常见概率分布
- 9.辛普森悖论与贝叶斯解题实例
- 10.语言模型:语言概率与词袋模型
- 11.n-gram 语言模型(二元 / 三元 / N-Gram)
- 12.语言模型评价:交叉熵、困惑度与插值
- 13.朴素贝叶斯文本分类:垃圾邮件
- 14.拼写检查
- 15.中文分词:构词法、最大匹配、最优路径与 Jieba
- 16.词表示问题与语义相似度
- 17.TF-IDF 权重处理
- 18.One-Hot 表达与词表示的局限
- 19.Word2Vec 核心思想
- 20.Word2Vec 训练过程
- 21.Skip-gram 模型详解
- 22.词性标注任务与标注方法(规则 + N-Gram)
- 23.EM 算法与混合模型
- 24.高斯混合模型 GMM
- 25.从混合模型到隐马尔可夫模型
- 26.隐马尔可夫模型(HMM)推导与维特比解码
- 27.线性链条件随机场 CRF
- 28.贝叶斯网络与图模型
- 29.隐马尔可夫链与 HMM 推导
- 30.PLSA 主题模型
- 31.LSI 与 SVD 向量表达
- 32.LDA 与狄利克雷分布
- 33.主题模型实验复现(困惑度 / 分类 / 相似度 / 延展)
- 34.上下文无关文法(CFG)与句法分析
- 35.概率上下文无关文法 PCFG
- 36.统计机器翻译:词对齐与翻译模型
- 37.统计机器翻译中的对齐模型与参数估计
- 38.从统计机器翻译到神经机器翻译
- 39.神经元与反向传播速览(指向深度学习课)
- 40.CNN 原理及其在 NLP 中的应用
- 41.循环神经网络的基本原理与 Elman / Jordan 网络
- 42.LSTM:长短期记忆网络的核心思想与分步实现
- 43.Encoder-Decoder 框架
- 44.Seq2Seq 与早期注意力机制
- 45.注意力机制的背景与动机
- 46.注意力模型实现原理与匹配函数
- 47.记忆网络:组成与计算
- 48.注意力机制的应用与历史延展
- 49.Transformer 结构:Encoder-Decoder 栈与 Self-Attention
- 50.Multi-Head Attention、FFNN 与位置编码
- 51.层归一化、损失函数与 Universal Transformer 延展
- 52.预训练范式:从 ELMo 到 BERT
- 53.BERT 与掩码语言模型
- 54.BERT 下游任务微调与 GLUE 口径
- 55.GPT 与自回归语言建模
- 56.GPT-1 到 GPT-4 的演进
- 57.指令微调与 RLHF
- 58.分词器:BPE、WordPiece 与中文词表
- 59.上下文窗口与长文本处理
- 60.能力边界、成本与适用场景
- 61.文本分类实战:从朴素贝叶斯到逻辑回归
- 62.命名实体识别实战
- 63.文本生成与摘要实战
- 64.语义检索与向量库实战
- 65.RAG 知识库问答
- 66.NLP 评估指标:BLEU / ROUGE / BERTScore 与人工评估
- 67.幻觉与事实性问题
- 68.文本与知识结合(知识图谱压缩)
- 69.跨媒体信息检索与未来展望
词性标注任务与标注方法(规则 + N-Gram)
小象实战讲义 · 自然语言处理
在上一章学习了词的向量表示后,我们开始进入自然语言处理的核心任务之一:序列标注。词性标注(Part-of-Speech Tagging)是序列标注的经典范例,它要求我们为句子中的每个词赋予一个正确的词性标签(如名词、动词等)。本节将系统介绍词性标注的任务定义、应用价值、面临的挑战,并深入讲解基于规则和N-Gram模型的早期解决方案。掌握这些基础方法,是理解后续隐马尔可夫模型(HMM)等更强大模型的关键。
💡 核心导读
- 任务定义:词性标注是为文本中的每个词(Token)分配一个词性标签(Tag)的过程,是句法分析等高级任务的基础。
- 为何重要:词性信息是语音合成、语言模型、句法解析等任务的关键输入,能有效约束后续词的选择空间。
- 挑战何在:一个词可能对应多个词性(歧义性),同一词性也可能有不同语义,这使得自动标注充满挑战。
- 经典方法:从基于语法规则的简单方法,到利用统计信息的N-Gram模型,标志着从人工规则到数据驱动学习的转变。
- 标注标准:介绍广泛使用的Penn Treebank标注集,它是现代词性标注任务的事实标准。
什么是词性标注?
词性标注(Part-of-Speech Tagging, POS Tagging)的核心目标是为一段文本中的每个词(或称词元,Token)关联一个正确的词性(Part-of-Speech)标签。
例如,对于句子 “heat water in large vessel”,一个理想的标注结果可能是:
heat(动词, V)water(名词, N)in(介词, P)large(形容词, ADJ)vessel(名词, N)
这里的标签(如N, V, P, ADJ)构成了一个标注集(Tag Set),用于描述词的语法类别。
词性标注的应用价值
词性标注远非一个孤立的学术问题,它在众多自然语言处理应用中扮演着基础且关键的角色:
- 句法分析(Parsing)的基础:句法分析器需要知道每个词的词性,才能构建出正确的句法树。词性标签是句法解析最重要的输入特征之一。
- 语音合成(Speech Synthesis):同一个词,词性不同,其发音和重音可能完全不同。
- 例如,名词
wind(风)读作/wɪnd/,而动词wind(上发条)读作/waɪnd/。 - 名词
record(记录)读作/ˈrek.ɔːd/,而动词record(录制)读作/rɪˈkɔːd/。 准确的词性标注是生成正确语音的前提。
- 例如,名词
- 改进语言模型(Language Model):在预测下一个词时,如果知道前一个词的词性,可以极大地缩小候选词的范围。
- 例如,在“我喜欢喝”之后,接一个名词(如水、茶)的概率远高于接一个介词或动词。词性信息为语言模型提供了强约束。
- 信息检索与文本挖掘:词性信息可以帮助识别名词短语(常为关键实体)、动词短语(常表示动作或关系),提升检索和挖掘的精度。
词性标注的挑战:歧义性
词性标注之所以是一个非平凡的任务,核心在于语言的歧义性(Ambiguity)。这种歧义性体现在多个层面:
同一词性,不同语义:一个词即使词性相同,也可能有多个含义。
- 例如,名词
file既可以指“文件夹”,也可以指“锉刀”。区分它们需要依赖上下文语境。
- 例如,名词
同一词汇,不同词性:一个词形(Word Form)可能对应多个词性,这是词性标注中最常见的挑战。
- 例如,
round这个词:a round table(形容词,圆的)a round of applause(名词,一轮)to round out your interests(动词,使圆满)to work the year round(副词,整年地)
- 例如,
词性与发音的关联:如上文所述,词性不同可能导致发音变化,这反过来也增加了从语音识别结果进行词性标注的难度。
这些歧义性使得基于简单规则的标注方法难以奏效,必须引入更复杂的、能够利用上下文信息的统计或机器学习模型。
词性标注集:Penn Treebank
在进行标注之前,我们需要一套标准来定义有哪些词性标签。不同的语料库可能使用不同的标注集。
- Brown Corpus:包含87个标签。
- C5 (British National Corpus):包含61个标签。
- Penn Treebank:包含45个标签,是当今最广泛使用的标注集。
Penn Treebank 中约有 160 万个词来自道琼斯新闻社文本并经过人工句法分析,另有约 100 万个词仅做了词性标注;其标注集已成为许多软件包和研究的基准。
以下是Penn Treebank标注集的部分核心标签示例:
| 标签 | 描述 | 例子 |
|---|---|---|
| NN | 名词,单数或不可数 | dog, water |
| NNS | 名词,复数 | dogs |
| NNP | 专有名词,单数 | IBM, London |
| VB | 动词,原形 | eat |
| VBD | 动词,过去式 | ate |
| VBG | 动词,现在分词/动名词 | eating |
| JJ | 形容词 | big, red |
| JJR | 形容词,比较级 | bigger |
| JJS | 形容词,最高级 | biggest |
| RB | 副词 | quickly |
| IN | 介词/从属连词 | in, of, that |
| DT | 限定词 | the, a, this |
| PRP | 人称代词 | I, you, he |
| CC | 并列连词 | and, but, or |
| CD | 基数词 | one, two, 100 |
一个完整的标注示例如下(来自Penn Treebank风格):
Our/PRP$ enemies/NNS are/VBP innovative/JJ ./.- 这里,
PRP$是所有格代词,NNS是复数名词,VBP是非第三人称单数现在时动词,JJ是形容词。
早期方法:基于规则的标注
在机器学习方法普及之前,词性标注主要依赖基于规则的方法。
基本思路:
- 首先,为每个词分配其所有可能的词性标签(通常来自一个词典)。
- 然后,应用一系列手写的消歧规则,根据上下文移除不可能的标签。
示例规则:
- “如果当前词后面是形容词、副词或量词,且再后面是句子边界(如句号),同时当前词的前一个词不是像
consider这样的动词,则移除当前词的非副词标签,否则移除副词标签。”
这种方法简单直观,且不需要已标注的训练语料库。然而,它的缺点也很明显:
- 规则难以完备:语言现象复杂多变,需要编写成百上千条规则,且规则之间可能存在冲突。
- 缺乏泛化能力:规则是针对特定语言现象定制的,难以处理未见过的或不符合规则的句子。
- 维护成本高:随着语言的发展或应用于新领域,规则需要不断更新。
因此,基于规则的方法逐渐被数据驱动的统计方法所取代。
统计基线:Unigram 与最高频词性标注器
在引入上下文之前,最朴素的统计标注器是 Unigram 标注器:对每个词,统计它在训练语料中各标签的出现频率,标注时直接把频率最高的标签分给该词,即 。它完全不利用相邻词或词性信息。
- 未登录词回退:对于训练语料中没见过的词(OOV),无法查到 ,通常回退到该词性在整个语料中的先验频率(如最常出现的标签),或借助词形规则(后缀、大小写等)判断。
- 基线作用:Unigram 标注器是后续 Bigram/Trigram 标注器和 HMM 的参照系。只有在独立测试集上,上下文模型的标注准确率明显高于这个最高频词性基线,才能说明上下文信息带来了收益。
统计方法入门:N-Gram标注器
N-Gram模型最初用于语言建模,预测下一个词的概率。我们可以将其思想迁移到词性标注上:预测下一个词的词性标签。
从词到词性标签的转换
在词性标注任务中,我们观察到的序列是词(Words),而我们想要预测的序列是词性标签(Tags)。因此,一个朴素的N-Gram标注器会尝试计算如下概率:
对于一个词序列 ,我们寻找最可能的标签序列 。 根据贝叶斯定理和马尔可夫假设,我们可以用二元(Bigram)模型来近似: 进一步简化,假设一个词的生成只依赖于它自身的标签,并且一个标签只依赖于前一个标签(Bigram假设): 其中,我们定义 为一个特殊的开始标签(<S>)。
- 转移概率(Transition Probability):,表示给定前一个标签是 时,当前标签是 的概率。这捕捉了标签序列的语法规律(如动词后常接名词)。
- 发射概率(Emission Probability):,表示给定标签 时,观察到词 的概率。这反映了某个词以特定词性出现的可能性。
一个简化的Bigram标注示例
在实际实现一个简单的Bigram标注器时,我们有时会做一个更强的假设:直接根据前一个词的标签来预测当前词的标签,而暂时忽略发射概率,或者将其融入到一个查找表中。
考虑一个任务:预测 still 这个词的词性。我们统计训练语料中,在 still 前面出现的不同词性,以及 still 在这些情况下被标注为什么词性。
假设我们有以下(虚构的)统计频率表:
| 前一个词的标签 () | still 被标为 DT | still 被标为 MD | still 被标为 JJ |
|---|---|---|---|
| NN (名词) | 8 | 1 | 6 |
| RB (副词) | 2 | 7 | 1 |
| JJ (形容词) | 4 | 2 | 9 |
现在,对于一个新句子,如果 still 的前一个词被标注为 NN,那么根据上表(注意分母是 still 在前词标为 NN 后的 15 次出现,条件同时包含当前词 still):
这里统计的是固定目标词 still 时、给定前标签后的条件相对频率,不能直接当作通用的 Bigram 转移概率 。
因此,我们会选择概率最大的 DT 作为 still 的标签。
下面的Python代码演示了这个简单的Bigram计数过程。注意,这是一个极度简化的教学示例,真实系统需要处理未登录词、数据平滑等问题。
# 示例:简化的Bigram词性标注计数
# 假设我们有一个小的已标注训练数据(格式:(词, 标签))
training_data = [
[('I', 'PRP'), ('still', 'RB'), ('like', 'VBP'), ('it', 'PRP')],
[('The', 'DT'), ('water', 'NN'), ('is', 'VBZ'), ('still', 'JJ'), ('clear', 'JJ')],
[('He', 'PRP'), ('is', 'VBZ'), ('still', 'RB'), ('here', 'RB')],
[('A', 'DT'), ('still', 'NN'), ('day', 'NN'), ('in', 'IN'), ('summer', 'NN')], # 'still'作为名词(寂静)
[('We', 'PRP'), ('must', 'MD'), ('still', 'VB'), ('the', 'DT'), ('noise', 'NN')], # 'still'作为动词(使平静)
]
# 目标:统计对于词 'still',给定前一个词的标签,它被标注为各种标签的频率
target_word = 'still'
bigram_counts = {} # 结构:{prev_tag: {current_tag: count}}
for sentence in training_data:
for i in range(1, len(sentence)): # 从第二个词开始,才能有前一个词
current_word, current_tag = sentence[i]
prev_word, prev_tag = sentence[i-1]
if current_word == target_word:
if prev_tag not in bigram_counts:
bigram_counts[prev_tag] = {}
if current_tag not in bigram_counts[prev_tag]:
bigram_counts[prev_tag][current_tag] = 0
bigram_counts[prev_tag][current_tag] += 1
# 打印统计结果
print("对于词 'still' 的Bigram统计:")
for prev_tag in sorted(bigram_counts.keys()):
total = sum(bigram_counts[prev_tag].values())
print(f" 前一个标签是 '{prev_tag}':")
for curr_tag in sorted(bigram_counts[prev_tag].keys()):
count = bigram_counts[prev_tag][curr_tag]
prob = count / total
print(f" -> 被标为 '{curr_tag}': 频次 {count}, 概率 {prob:.3f}")对于词 'still' 的Bigram统计:
前一个标签是 'DT':
-> 被标为 'NN': 频次 1, 概率 1.000
前一个标签是 'MD':
-> 被标为 'VB': 频次 1, 概率 1.000
前一个标签是 'PRP':
-> 被标为 'RB': 频次 1, 概率 1.000
前一个标签是 'VBZ':
-> 被标为 'JJ': 频次 1, 概率 0.500
-> 被标为 'RB': 频次 1, 概率 0.500N-Gram标注器的局限性
- 数据稀疏性:随着N增大(如使用Trigram),可能的标签组合呈指数增长,在有限训练数据中很多组合从未出现,导致概率估计为0。
- 上下文窗口有限:N-Gram只考虑了前N-1个标签的上下文,无法利用更长距离的依赖关系。
- 未考虑词本身:上述简化模型主要关注标签转移,而一个完整的模型必须同时考虑“给定标签,生成某个词”的概率(发射概率)。
标注效果如何评价
上述方法的优劣不能只看模型在训练语料上的拟合程度,而要在从未参与训练的独立测试集上统计标注准确率(Accuracy = 标签正确的词例数 / 测试集总词例数)。规则法、Unigram 基线、Bigram 标注器与后续 HMM 应在同一测试集上比较准确率;此外,模型算出的路径联合概率高,只代表打分高,并不等同于真实标注一定更准。
为了进一步联合建模标签转移和词生成的概率,并高效地找到全局最优的标签序列,我们引入下一节的隐马尔可夫模型(HMM)。需要注意:Bigram HMM 仍是一阶马尔可夫模型,转移与发射分布仍会遇到零计数,上下文长度也没有自动变长;稀疏性要靠平滑缓解,长程依赖则需要更强的模型解决,HMM 本身并不自动消除这些局限。
📝 动手练一练
概念辨析:请解释“词类型”(Word Type)和“词例”(Word Token)在自然语言处理中的区别,并各举一个例子说明。为什么在词性标注任务中区分这两者很重要?
概率计算:假设我们有一个极小的训练语料,统计得到以下Bigram词性转移频次表(
<S>表示句子开始):\ NN VB JJ <S>3 2 1 NN 1 4 2 VB 5 1 1 JJ 2 1 0 同时,词发射频次表如下:
Tag \ Word cat dog runs big small NN 2 3 0 1 1 VB 0 0 4 0 0 JJ 0 0 0 2 1 请根据上述表格,计算句子 “big dog runs” 在Bigram HMM假设下的所有可能标签序列的概率(忽略归一化常数)。你认为最可能的标签序列是什么?(提示:序列概率 ≈ ∏ )
👉 点击查看参考答案
概念辨析:
- 词例(Word Token):指文本中特定位置出现的词的具体实例。例如,在句子“The cat and the dog”中,有5个词例:
The,cat,and,the,dog。词例the出现了两次。 - 词类型(Word Type):指词汇表中不同的词项,不计重复。在上面的句子中,词类型有4个:
The,cat,and,dog(通常忽略大小写,The和the算作同一类型)。 - 重要性:在词性标注中,我们处理的是一个个具体的词例(Token),需要为每个实例分配标签。而统计语言模型或词典构建时,更关心词类型(Type)。区分二者有助于准确描述任务(标注每个Token)和评估模型(类型频率影响未登录词处理)。
- 词例(Word Token):指文本中特定位置出现的词的具体实例。例如,在句子“The cat and the dog”中,有5个词例:
概率计算: 首先将频次表转换为概率(使用加1平滑等是标准做法,但此处为简化,直接用频次计算未平滑概率,注意概率和为1的约束在真实HMM中必须满足,此处计算的是未归一化的联合概率值,用于比较相对大小)。 我们需要计算三个词
w1=big,w2=dog,w3=runs的所有可能标签序列t1 t2 t3的得分(假设概率由转移和发射频次乘积得到)。可能序列1:
JJ NN VB- (频次1 / 总频次6)
- (频次2 / JJ总发射频次3)
- (频次2 / JJ行总转移频次3)
- (频次3 / NN总发射频次7)
- (频次4 / NN行总转移频次7)
- 得分(乘积):
可能序列2:
NN NN VB- 得分:
可能序列3:
JJ JJ VB(但runs作为VB发射概率高,但t2=JJ到t3=VB转移概率低)- (频次为0)
- 得分直接为0。
其他序列(如包含
big标为VB等)由于发射概率为0,得分为0。 比较非零得分,序列JJ NN VB的得分(~0.0181)远高于序列NN NN VB(~0.0025)。 因此,最可能的标签序列是JJ NN VB,对应“形容词-名词-动词”,符合“大狗跑”的语法直觉。
📝 动手练一练
- 概念辨析:请结合讲义内容,解释“词性标注的歧义性”具体包含哪两种主要情况,并各举一个讲义中未出现的新例子(英文或中文均可)。
👉 点击查看参考答案
根据讲义“词性标注的挑战:歧义性”部分的描述,歧义性主要包含两种情况:
- 同一词性,不同语义:一个词即使词性标签相同,也可能对应多个不同的含义。区分它们需要更深的语境理解。
- 新例子:英文名词 “bank” 可以指“银行”,也可以指“河岸”。
- 同一词汇,不同词性:一个词形(Word Form)可能对应多个不同的词性标签。这是词性标注中最常见和直接的挑战。
- 新例子:英文词 “present” 可以是名词(礼物)、动词(呈现)或形容词(在场的)。
手算练习:假设我们有一个极其简单的语言,其标注集只有两个标签:
N(名词)和V(动词)。我们基于一个微型训练语料统计得到一个Bigram词性转移概率表(即给定前一个词性,当前词性的概率),如下所示:前一个词性 \ 当前词性 N V N 0.3 0.7 V 0.8 0.2 同时,我们统计了词汇的词性发射概率如下:
“学习”:作为N的概率是 0.9,作为V的概率是 0.1。“代码”:作为N的概率是 0.7,作为V的概率是 0.3。“编写”:作为N的概率是 0.1,作为V的概率是 0.9。
现在,请计算对于序列
[“学习”, “代码”],在所有可能的词性标注路径(N, N)、(N, V)、(V, N)、(V, V)中,哪一条路径的联合概率最高?(假设序列开始的词性先验概率P(第一个词性)相等,均为0.5。路径概率 = P(第一个词性) * P(第一个词|第一个词性) * P(第二个词性|第一个词性) * P(第二个词|第二个词性))
👉 点击查看参考答案
我们可以通过编写一个简单的Python程序来计算并比较所有路径的概率。
import numpy as np
# 转移概率表 (prev_tag -> current_tag)
trans_prob = {
'N': {'N': 0.3, 'V': 0.7},
'V': {'N': 0.8, 'V': 0.2}
}
# 发射概率表 (word -> tag)
emit_prob = {
'学习': {'N': 0.9, 'V': 0.1},
'代码': {'N': 0.7, 'V': 0.3},
'编写': {'N': 0.1, 'V': 0.9}
}
# 序列
sequence = ['学习', '代码']
tags = ['N', 'V']
start_prob = 0.5 # P(第一个词性)
best_path = None
best_score = -np.inf
# 枚举所有可能的路径
for t1 in tags:
for t2 in tags:
# 计算路径概率
score = (start_prob *
emit_prob[sequence[0]][t1] *
trans_prob[t1][t2] *
emit_prob[sequence[1]][t2])
path = (t1, t2)
print(f"路径 {path}: 概率 = {score:.4f}")
if score > best_score:
best_score = score
best_path = path
print(f"\n最优路径是 {best_path},概率为 {best_score:.4f}")路径 ('N', 'N'): 概率 = 0.0945
路径 ('N', 'V'): 概率 = 0.0945
路径 ('V', 'N'): 概率 = 0.0280
路径 ('V', 'V'): 概率 = 0.0030
最优路径是 ('N', 'N'),概率为 0.0945因此,对于序列 [“学习”, “代码”],(N, N) 与 (N, V) 两条路径概率并列最高,均为 0.0945。上面的代码用严格大于号比较,只保留枚举中遇到的第一条并列最大值,所以打印出 (N, N);二者在当前参数下无法区分,实际系统需借助词频先验、平滑或更长上下文进一步判断。
本章小结
本节我们开启了序列标注篇章的学习,以词性标注这一经典任务作为切入点。我们明确了词性标注的定义、重要应用场景以及其核心挑战——词汇与词性间的复杂歧义性。我们介绍了作为行业标准的Penn Treebank标注集,并回顾了从依赖人工规则的早期方法,到利用数据统计信息的N-Gram模型的演进过程。N-Gram模型引入了概率化思维,为后续更强大的隐马尔可夫模型(HMM)奠定了基础。
📋 行动清单
- 理解任务:能清晰阐述词性标注的任务定义、输入输出以及至少三个实际应用。
- 辨识挑战:能举例说明导致词性标注困难的词汇歧义类型(一词多性、一性多义)。
- 查阅标准:熟悉Penn Treebank标注集中最常见的10-15个标签(如NN, VB, JJ, DT, IN等)及其含义。
- 手算概率:给定一个小型的词性转移和词发射频次表,能够计算一个短句所有可能标签序列的未归一化概率,并找出最可能的序列。
—— 小象教研组