查看全课大纲(第 22 / 69 节)
  1. 1.NLP 的研究领域、应用与学习路径
  2. 2.自然语言的基本术语
  3. 3.信息论基础:信息熵与交叉熵
  4. 4.语言的进化与语义变迁
  5. 5.主观概率、客观概率与条件概率
  6. 6.贝叶斯原理与推理
  7. 7.随机变量:二项式、期望方差与联合概率
  8. 8.常见概率分布
  9. 9.辛普森悖论与贝叶斯解题实例
  10. 10.语言模型:语言概率与词袋模型
  11. 11.n-gram 语言模型(二元 / 三元 / N-Gram)
  12. 12.语言模型评价:交叉熵、困惑度与插值
  13. 13.朴素贝叶斯文本分类:垃圾邮件
  14. 14.拼写检查
  15. 15.中文分词:构词法、最大匹配、最优路径与 Jieba
  16. 16.词表示问题与语义相似度
  17. 17.TF-IDF 权重处理
  18. 18.One-Hot 表达与词表示的局限
  19. 19.Word2Vec 核心思想
  20. 20.Word2Vec 训练过程
  21. 21.Skip-gram 模型详解
  22. 22.词性标注任务与标注方法(规则 + N-Gram)
  23. 23.EM 算法与混合模型
  24. 24.高斯混合模型 GMM
  25. 25.从混合模型到隐马尔可夫模型
  26. 26.隐马尔可夫模型(HMM)推导与维特比解码
  27. 27.线性链条件随机场 CRF
  28. 28.贝叶斯网络与图模型
  29. 29.隐马尔可夫链与 HMM 推导
  30. 30.PLSA 主题模型
  31. 31.LSI 与 SVD 向量表达
  32. 32.LDA 与狄利克雷分布
  33. 33.主题模型实验复现(困惑度 / 分类 / 相似度 / 延展)
  34. 34.上下文无关文法(CFG)与句法分析
  35. 35.概率上下文无关文法 PCFG
  36. 36.统计机器翻译:词对齐与翻译模型
  37. 37.统计机器翻译中的对齐模型与参数估计
  38. 38.从统计机器翻译到神经机器翻译
  39. 39.神经元与反向传播速览(指向深度学习课)
  40. 40.CNN 原理及其在 NLP 中的应用
  41. 41.循环神经网络的基本原理与 Elman / Jordan 网络
  42. 42.LSTM:长短期记忆网络的核心思想与分步实现
  43. 43.Encoder-Decoder 框架
  44. 44.Seq2Seq 与早期注意力机制
  45. 45.注意力机制的背景与动机
  46. 46.注意力模型实现原理与匹配函数
  47. 47.记忆网络:组成与计算
  48. 48.注意力机制的应用与历史延展
  49. 49.Transformer 结构:Encoder-Decoder 栈与 Self-Attention
  50. 50.Multi-Head Attention、FFNN 与位置编码
  51. 51.层归一化、损失函数与 Universal Transformer 延展
  52. 52.预训练范式:从 ELMo 到 BERT
  53. 53.BERT 与掩码语言模型
  54. 54.BERT 下游任务微调与 GLUE 口径
  55. 55.GPT 与自回归语言建模
  56. 56.GPT-1 到 GPT-4 的演进
  57. 57.指令微调与 RLHF
  58. 58.分词器:BPE、WordPiece 与中文词表
  59. 59.上下文窗口与长文本处理
  60. 60.能力边界、成本与适用场景
  61. 61.文本分类实战:从朴素贝叶斯到逻辑回归
  62. 62.命名实体识别实战
  63. 63.文本生成与摘要实战
  64. 64.语义检索与向量库实战
  65. 65.RAG 知识库问答
  66. 66.NLP 评估指标:BLEU / ROUGE / BERTScore 与人工评估
  67. 67.幻觉与事实性问题
  68. 68.文本与知识结合(知识图谱压缩)
  69. 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),用于描述词的语法类别。

词性标注的应用价值

词性标注远非一个孤立的学术问题,它在众多自然语言处理应用中扮演着基础且关键的角色:

  1. 句法分析(Parsing)的基础:句法分析器需要知道每个词的词性,才能构建出正确的句法树。词性标签是句法解析最重要的输入特征之一。
  2. 语音合成(Speech Synthesis):同一个词,词性不同,其发音和重音可能完全不同。
    • 例如,名词 wind(风)读作 /wɪnd/,而动词 wind(上发条)读作 /waɪnd/。
    • 名词 record(记录)读作 /ˈrek.ɔːd/,而动词 record(录制)读作 /rɪˈkɔːd/。 准确的词性标注是生成正确语音的前提。
  3. 改进语言模型(Language Model):在预测下一个词时,如果知道前一个词的词性,可以极大地缩小候选词的范围。
    • 例如,在“我喜欢喝”之后,接一个名词(如水、茶)的概率远高于接一个介词或动词。词性信息为语言模型提供了强约束。
  4. 信息检索与文本挖掘:词性信息可以帮助识别名词短语(常为关键实体)、动词短语(常表示动作或关系),提升检索和挖掘的精度。

词性标注的挑战:歧义性

词性标注之所以是一个非平凡的任务,核心在于语言的歧义性(Ambiguity)。这种歧义性体现在多个层面:

  1. 同一词性,不同语义:一个词即使词性相同,也可能有多个含义。

    • 例如,名词 file 既可以指“文件夹”,也可以指“锉刀”。区分它们需要依赖上下文语境。
  2. 同一词汇,不同词性:一个词形(Word Form)可能对应多个词性,这是词性标注中最常见的挑战。

    • 例如,round 这个词:
      • a round table(形容词,圆的)
      • a round of applause(名词,一轮)
      • to round out your interests(动词,使圆满)
      • to work the year round(副词,整年地)
  3. 词性与发音的关联:如上文所述,词性不同可能导致发音变化,这反过来也增加了从语音识别结果进行词性标注的难度。

这些歧义性使得基于简单规则的标注方法难以奏效,必须引入更复杂的、能够利用上下文信息的统计或机器学习模型。

词性标注集: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 是形容词。

早期方法:基于规则的标注

在机器学习方法普及之前,词性标注主要依赖基于规则的方法。

基本思路:

  1. 首先,为每个词分配其所有可能的词性标签(通常来自一个词典)。
  2. 然后,应用一系列手写的消歧规则,根据上下文移除不可能的标签。

示例规则:

  • “如果当前词后面是形容词、副词或量词,且再后面是句子边界(如句号),同时当前词的前一个词不是像 consider 这样的动词,则移除当前词的非副词标签,否则移除副词标签。”

这种方法简单直观,且不需要已标注的训练语料库。然而,它的缺点也很明显:

  • 规则难以完备:语言现象复杂多变,需要编写成百上千条规则,且规则之间可能存在冲突。
  • 缺乏泛化能力:规则是针对特定语言现象定制的,难以处理未见过的或不符合规则的句子。
  • 维护成本高:随着语言的发展或应用于新领域,规则需要不断更新。

因此,基于规则的方法逐渐被数据驱动的统计方法所取代。

统计基线:Unigram 与最高频词性标注器

在引入上下文之前,最朴素的统计标注器是 Unigram 标注器:对每个词,统计它在训练语料中各标签的出现频率,标注时直接把频率最高的标签分给该词,即 ti∗=arg⁡max⁡tP(t∣wi)t_i^* = \arg\max_t P(t \mid w_i)。它完全不利用相邻词或词性信息。

  • 未登录词回退:对于训练语料中没见过的词(OOV),无法查到 P(t∣wi)P(t \mid w_i),通常回退到该词性在整个语料中的先验频率(如最常出现的标签),或借助词形规则(后缀、大小写等)判断。
  • 基线作用:Unigram 标注器是后续 Bigram/Trigram 标注器和 HMM 的参照系。只有在独立测试集上,上下文模型的标注准确率明显高于这个最高频词性基线,才能说明上下文信息带来了收益。

统计方法入门:N-Gram标注器

N-Gram模型最初用于语言建模,预测下一个词的概率。我们可以将其思想迁移到词性标注上:预测下一个词的词性标签。

从词到词性标签的转换

在词性标注任务中,我们观察到的序列是词(Words),而我们想要预测的序列是词性标签(Tags)。因此,一个朴素的N-Gram标注器会尝试计算如下概率:

对于一个词序列 w1,w2,...,wTw_1, w_2, ..., w_T,我们寻找最可能的标签序列 t1,t2,...,tTt_1, t_2, ..., t_T。 根据贝叶斯定理和马尔可夫假设,我们可以用二元(Bigram)模型来近似: P(t1,...,tT∣w1,...,wT)∝P(w1,...,wT∣t1,...,tT)⋅P(t1,...,tT)P(t_1, ..., t_T | w_1, ..., w_T) \propto P(w_1, ..., w_T | t_1, ..., t_T) \cdot P(t_1, ..., t_T) 进一步简化,假设一个词的生成只依赖于它自身的标签,并且一个标签只依赖于前一个标签(Bigram假设): ≈∏i=1TP(wi∣ti)⋅∏i=1TP(ti∣ti−1)\approx \prod_{i=1}^{T} P(w_i | t_i) \cdot \prod_{i=1}^{T} P(t_i | t_{i-1}) 其中,我们定义 t0t_0 为一个特殊的开始标签(<S>)。

  • 转移概率(Transition Probability):P(ti∣ti−1)P(t_i | t_{i-1}),表示给定前一个标签是 ti−1t_{i-1} 时,当前标签是 tit_i 的概率。这捕捉了标签序列的语法规律(如动词后常接名词)。
  • 发射概率(Emission Probability):P(wi∣ti)P(w_i | t_i),表示给定标签 tit_i 时,观察到词 wiw_i 的概率。这反映了某个词以特定词性出现的可能性。

一个简化的Bigram标注示例

在实际实现一个简单的Bigram标注器时,我们有时会做一个更强的假设:直接根据前一个词的标签来预测当前词的标签,而暂时忽略发射概率,或者将其融入到一个查找表中。

考虑一个任务:预测 still 这个词的词性。我们统计训练语料中,在 still 前面出现的不同词性,以及 still 在这些情况下被标注为什么词性。

假设我们有以下(虚构的)统计频率表:

前一个词的标签 (ti−1t_{i-1})still 被标为 DTstill 被标为 MDstill 被标为 JJ
NN (名词)816
RB (副词)271
JJ (形容词)429

现在,对于一个新句子,如果 still 的前一个词被标注为 NN,那么根据上表(注意分母是 still 在前词标为 NN 后的 15 次出现,条件同时包含当前词 still):

  • P(DT∣NN,still)=8/(8+1+6)=8/15≈0.533P(DT \mid NN, \text{still}) = 8 / (8+1+6) = 8/15 \approx 0.533
  • P(MD∣NN,still)=1/15≈0.067P(MD \mid NN, \text{still}) = 1/15 \approx 0.067
  • P(JJ∣NN,still)=6/15=0.4P(JJ \mid NN, \text{still}) = 6/15 = 0.4

这里统计的是固定目标词 still 时、给定前标签后的条件相对频率,不能直接当作通用的 Bigram 转移概率 P(DT∣NN)P(DT \mid NN)。

因此,我们会选择概率最大的 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.500

N-Gram标注器的局限性

  • 数据稀疏性:随着N增大(如使用Trigram),可能的标签组合呈指数增长,在有限训练数据中很多组合从未出现,导致概率估计为0。
  • 上下文窗口有限:N-Gram只考虑了前N-1个标签的上下文,无法利用更长距离的依赖关系。
  • 未考虑词本身:上述简化模型主要关注标签转移,而一个完整的模型必须同时考虑“给定标签,生成某个词”的概率(发射概率)。

标注效果如何评价

上述方法的优劣不能只看模型在训练语料上的拟合程度,而要在从未参与训练的独立测试集上统计标注准确率(Accuracy = 标签正确的词例数 / 测试集总词例数)。规则法、Unigram 基线、Bigram 标注器与后续 HMM 应在同一测试集上比较准确率;此外,模型算出的路径联合概率高,只代表打分高,并不等同于真实标注一定更准。

为了进一步联合建模标签转移和词生成的概率,并高效地找到全局最优的标签序列,我们引入下一节的隐马尔可夫模型(HMM)。需要注意:Bigram HMM 仍是一阶马尔可夫模型,转移与发射分布仍会遇到零计数,上下文长度也没有自动变长;稀疏性要靠平滑缓解,长程依赖则需要更强的模型解决,HMM 本身并不自动消除这些局限。

📝 动手练一练

  1. 概念辨析:请解释“词类型”(Word Type)和“词例”(Word Token)在自然语言处理中的区别,并各举一个例子说明。为什么在词性标注任务中区分这两者很重要?

  2. 概率计算:假设我们有一个极小的训练语料,统计得到以下Bigram词性转移频次表(<S>表示句子开始):

    ti−1t_{i-1} \ tit_iNNVBJJ
    <S>321
    NN142
    VB511
    JJ210

    同时,词发射频次表如下:

    Tag \ Wordcatdogrunsbigsmall
    NN23011
    VB00400
    JJ00021

    请根据上述表格,计算句子 “big dog runs” 在Bigram HMM假设下的所有可能标签序列的概率(忽略归一化常数)。你认为最可能的标签序列是什么?(提示:序列概率 ≈ ∏ P(ti∣ti−1)⋅P(wi∣ti)P(t_i \mid t_{i-1}) \cdot P(w_i \mid t_i))

👉 点击查看参考答案
  1. 概念辨析:

    • 词例(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)和评估模型(类型频率影响未登录词处理)。
  2. 概率计算: 首先将频次表转换为概率(使用加1平滑等是标准做法,但此处为简化,直接用频次计算未平滑概率,注意概率和为1的约束在真实HMM中必须满足,此处计算的是未归一化的联合概率值,用于比较相对大小)。 我们需要计算三个词 w1=big, w2=dog, w3=runs 的所有可能标签序列 t1 t2 t3 的得分(假设概率由转移和发射频次乘积得到)。

    可能序列1: JJ NN VB

    • P(t1=JJ∣t0=<S>)=1/6P(t1=JJ | t0=<S>) = 1/6 (频次1 / 总频次6)
    • P(big∣JJ)=2/3P(big | JJ) = 2/3 (频次2 / JJ总发射频次3)
    • P(t2=NN∣t1=JJ)=2/3P(t2=NN | t1=JJ) = 2/3 (频次2 / JJ行总转移频次3)
    • P(dog∣NN)=3/7P(dog | NN) = 3/7 (频次3 / NN总发射频次7)
    • P(t3=VB∣t2=NN)=4/7P(t3=VB | t2=NN) = 4/7 (频次4 / NN行总转移频次7)
    • P(runs∣VB)=4/4=1P(runs | VB) = 4/4 = 1
    • 得分(乘积): (1/6)∗(2/3)∗(2/3)∗(3/7)∗(4/7)∗1≈0.0181(1/6)*(2/3)*(2/3)*(3/7)*(4/7)*1 \approx 0.0181

    可能序列2: NN NN VB

    • P(t1=NN∣<S>)=3/6=0.5P(t1=NN | <S>) = 3/6 = 0.5
    • P(big∣NN)=1/7P(big | NN) = 1/7
    • P(t2=NN∣t1=NN)=1/7P(t2=NN | t1=NN) = 1/7
    • P(dog∣NN)=3/7P(dog | NN) = 3/7
    • P(t3=VB∣t2=NN)=4/7P(t3=VB | t2=NN) = 4/7
    • P(runs∣VB)=1P(runs | VB) = 1
    • 得分: 0.5∗(1/7)∗(1/7)∗(3/7)∗(4/7)∗1≈0.00250.5 * (1/7) * (1/7) * (3/7) * (4/7) * 1 \approx 0.0025

    可能序列3: JJ JJ VB (但 runs 作为 VB 发射概率高,但 t2=JJ 到 t3=VB 转移概率低)

    • P(t1=JJ∣<S>)=1/6P(t1=JJ | <S>) = 1/6
    • P(big∣JJ)=2/3P(big | JJ) = 2/3
    • P(t2=JJ∣t1=JJ)=0/3=0P(t2=JJ | t1=JJ) = 0/3 = 0 (频次为0)
    • 得分直接为0。

    其他序列(如包含 big 标为 VB 等)由于发射概率为0,得分为0。 比较非零得分,序列 JJ NN VB 的得分(~0.0181)远高于序列 NN NN VB(~0.0025)。 因此,最可能的标签序列是 JJ NN VB,对应“形容词-名词-动词”,符合“大狗跑”的语法直觉。

📝 动手练一练

  1. 概念辨析:请结合讲义内容,解释“词性标注的歧义性”具体包含哪两种主要情况,并各举一个讲义中未出现的新例子(英文或中文均可)。
👉 点击查看参考答案

根据讲义“词性标注的挑战:歧义性”部分的描述,歧义性主要包含两种情况:

  1. 同一词性,不同语义:一个词即使词性标签相同,也可能对应多个不同的含义。区分它们需要更深的语境理解。
    • 新例子:英文名词 “bank” 可以指“银行”,也可以指“河岸”。
  2. 同一词汇,不同词性:一个词形(Word Form)可能对应多个不同的词性标签。这是词性标注中最常见和直接的挑战。
    • 新例子:英文词 “present” 可以是名词(礼物)、动词(呈现)或形容词(在场的)。
  1. 手算练习:假设我们有一个极其简单的语言,其标注集只有两个标签:N(名词)和V(动词)。我们基于一个微型训练语料统计得到一个Bigram词性转移概率表(即给定前一个词性,当前词性的概率),如下所示:

    前一个词性 \ 当前词性NV
    N0.30.7
    V0.80.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等)及其含义。
  • 手算概率:给定一个小型的词性转移和词发射频次表,能够计算一个短句所有可能标签序列的未归一化概率,并找出最可能的序列。

—— 小象教研组