查看全课大纲(第 35 / 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.跨媒体信息检索与未来展望
概率上下文无关文法 PCFG
小象实战讲义 · 自然语言处理
在上一节中,我们学习了上下文无关文法(CFG)如何为句子生成多种可能的句法解析树。然而,CFG 无法告诉我们哪种解析更“合理”或更“常见”。本节我们将引入概率上下文无关文法(PCFG),通过为每条语法规则赋予概率,量化不同解析树的可能性,从而在句法歧义中做出基于数据的、更优的选择。这是从纯语法规则迈向统计句法分析的关键一步。
💡 核心导读
- PCFG 的定义:在 CFG 的基础上,为每条重写规则
α → β引入一个概率q(α → β),构成一个概率化的语法模型。 - 概率的来源与估计:规则概率通常从已标注的句法树库(Treebank)中,通过最大似然估计(MLE)统计得出。
- 解析树的概率计算:一棵解析树的概率等于其所有节点所用规则概率的乘积。
- CKY 算法:一种基于动态规划的高效算法,用于在 PCFG 下为给定句子寻找概率最大的解析树(最可能解析)。
- 乔姆斯基范式(CNF):一种算法侧的规范形式——每条规则只能是
X → Y Z或X → w。要说清边界:PCFG 这个模型本身并不要求 CNF(它对α → β的长度没有限制),是 CKY 这类自底向上的动态规划算法要求 CNF;把语法转成 CNF 是为了跑算法,转换后概率可等值换算,语言不变。
从 CFG 到 PCFG:引入不确定性
回顾 CFG,它由四元组 (N, Σ, S, R) 定义。PCFG 在此基础上增加了一个关键组件:概率函数 Q。
一个 PCFG 定义为五元组 (N, Σ, S, R, Q),其中:
N:非终结符集合(如 S, NP, VP)。Σ:终结符集合(词汇表)。S:起始符号。R:规则集合,每条规则形如α → β,其中α ∈ N,β ∈ (N ∪ Σ)*。Q:从规则R到概率的映射函数q(α → β),满足概率公理。
概率公理:对于任意非终结符 α ∈ N,其所有可能的展开规则的概率之和必须为 1。即:
这意味着,给定一个非终结符 α,它按规则展开的所有可能性覆盖了一个完整的概率分布。
规则概率的直观例子
以我们熟悉的句子 “the man saw the dog with the telescope” 及其语法为例(本节玩具词表只收 the,不收 a,所以限定词规则只有一条)。假设从语料库中我们统计得到部分规则的概率如下:
IN → with: 0.6IN → in: 0.4NN → man: 0.1NN → woman: 0.1NN → dog: 0.3NN → telescope: 0.5S → NP VP: 1.0VP → Vt NP: 0.5VP → VP PP: 0.3VP → Vi: 0.2NP → DT NN: 0.8NP → NP PP: 0.2PP → IN NP: 1.0Vt → saw: 1.0Vi → sleeps: 1.0DT → the: 1.0
注意,对于每个非终结符(如 VP),其所有规则概率之和为 1(0.5+0.3+0.2=1)。这些概率并非人为指定,而是从大量已标注的句法树语料中通过最大似然估计(MLE) 计算得来。
这里有一处容易写错、也值得提前点明:上表只列了 DT → the 一条规则,因为本节的玩具词表里只有 the 这一个限定词,语料中不存在 a,所以 DT 的全部展开 就是”the”这一种,概率自然为 1.0。若真要把 DT → a 也收进规则集,两者就不能同时是 1.0(同一左部的概率和为 2,违反概率公理),必须按语料频次分成一对和为 1 的数(例如 0.9 与 0.1);而且一旦改动,凡树中含 k 个 DT 的解析树概率都会乘以 0.9^k,下游的 CKY 表格与练习答案也要同步改。规则表的改动永远不是”只改一行”——这是 PCFG 实现中最常见的连锁错误来源。
最大似然估计(MLE)计算规则概率
给定一个已标注的句法树库,规则 α → β 的概率 q(α → β) 可以通过以下公式估计: 其中:
Count(α → β)是语料库中规则α → β出现的次数。Count(α)是语料库中非终结符α作为规则左端出现的总次数。
例如,要估计 IN → with 的概率,我们统计语料中所有介词短语,看 IN 展开为 with 的次数,再除以 IN 出现的总次数。
计算解析树的概率
在 PCFG 中,一棵解析树 t 的概率 P(t) 定义为树中所有节点所用规则概率的乘积。假设树 t 包含 n 个节点,对应规则 r1, r2, ..., rn,则:
计算示例:考虑句子 “the man saw the dog” 的一种简单解析(假设没有 PP 附着歧义)。 解析树的一部分规则序列可能为:
S → NP VP(q=1.0)NP → DT NN(q=0.8)DT → the(q=1.0)NN → man(q=0.1)VP → Vt NP(q=0.5)Vt → saw(q=1.0)NP → DT NN(q=0.8)DT → the(q=1.0)NN → dog(q=0.3)
则该解析树的概率为: P(t) = 1.0 * 0.8 * 1.0 * 0.1 * 0.5 * 1.0 * 0.8 * 1.0 * 0.3 = 0.0096
通过比较不同解析树的概率,我们可以量化地判断哪一种句法结构更可能。对于有歧义的句子,我们选择 P(t) 最大的那棵树作为最可能的解析。
PP 到底挂在谁身上? 拿完整句子 “the man saw the dog with the telescope” 来说,with the telescope 既可以修饰 dog(NP 附着,望远镜是狗叼着的),也可以修饰 saw(VP 附着,用望远镜看)。两棵树用到的规则只差一处:前者把 PP 并进 NP,用到 NP → NP PP(q=0.2);后者把 PP 并进 VP,用到 VP → VP PP(q=0.3)。其余规则完全相同,所以两棵树的概率之比就等于这两条规则之比:
也就是说,VP 附着(saw ... with the telescope,用望远镜看)的概率是 NP 附着的 1.5 倍,模型会选 VP 附着。这个例子同时暴露了 PCFG 的软肋:决定胜负的只是两条全局规则概率,与”狗”和”望远镜”的现实搭配常识毫无关系——这正是后面要讲词汇化 PCFG 的动机。
乔姆斯基范式(CNF)
为了简化算法(特别是接下来的 CKY 算法),我们通常将 PCFG 转换为乔姆斯基范式(Chomsky Normal Form, CNF)。
一个 CNF 语法中的每条规则必须是以下两种形式之一:
- 二元规则:
X → Y Z,其中X, Y, Z ∈ N(都是非终结符)。 - 一元终结规则:
X → w,其中X ∈ N,w ∈ Σ(终结符)。
转换意义:任何 CFG/PCFG 都可以转换为等价的 CNF。转换过程可能引入额外的非终结符和规则,但不会改变语法生成的语言集合。CNF 保证了句法树是二叉树(除了叶子节点),这极大地简化了动态规划算法的设计。
我们之前示例中的语法规则,大部分已经符合 CNF(如 NP → DT NN, Vt → saw)。对于不符合的规则(例如 VP → Vt NP PP 这样的三元规则),可以通过引入新的非终结符将其拆分为多个二元规则。
CKY 算法:寻找最可能解析
给定一个已转换为 CNF 形式的 PCFG(CNF 是 CKY 递推的实现前提,不是 PCFG 模型本身的要求)和一个句子 s = w1 w2 ... wn,Cocke–Kasami–Younger (CKY) 算法 可以高效地计算出该句子的最可能解析树及其概率。
算法核心思想:动态规划
CKY 算法采用自底向上(bottom-up)的动态规划策略。其核心是填充一个三维表格(或二维表格的每个单元格是一个字典)。
我们定义:
π[i, j, X]:表示句子中从第i个词到第j个词(包含)的子串,以非终结符X为根的所有可能解析树中,概率最大的那棵树的概率值。bp[i, j, X]:回溯指针,记录为了达到π[i, j, X]的最大概率,子串[i, j]应该在哪个位置s分割,以及分割后的左右子非终结符Y和Z。
算法递推公式
初始化(长度为 1 的子串): 对于每个位置
i(1 ≤ i ≤ n) 和每个非终结符X:bp[i, i, X]为None(因为是叶子节点)。递归计算(长度
l从 2 到 n): 对于每个起始位置i(1 ≤ i ≤ n-l+1),令j = i + l - 1。 对于每个非终结符X: 同时,记录使上式取最大值的(s, Y, Z)到bp[i, j, X]中。 如果最大值是 0,则π[i, j, X] = 0。最终结果: 句子
s的最可能解析树的概率是π[1, n, S]。 通过从bp[1, n, S]开始递归回溯,可以重建整棵最可能解析树。
算法演示(概念性伪代码)
为了清晰展示 CKY 算法的流程,我们使用一个极简的语法和句子进行概念演示。请注意,以下代码块是伪代码,用于说明算法逻辑,并非完整可执行的 PCFG 解析器。
# 伪代码:CKY算法核心逻辑
输入:句子 words = [w1, w2, ..., wn],符合CNF的PCFG规则集R及其概率q
输出:最大概率值 max_prob,回溯指针表 bp
# 初始化三维表格 π 和 bp
n = len(words)
初始化 π[1..n][1..n][所有非终结符] = 0
初始化 bp[1..n][1..n][所有非终结符] = None
# 步骤1:初始化(处理单个词)
for i in range(1, n+1):
for 每个非终结符 X:
if 存在规则 (X -> words[i-1]) in R:
π[i][i][X] = q(X -> words[i-1])
# 步骤2:动态规划(处理更长的子串)
for length in range(2, n+1): # 子串长度
for i in range(1, n - length + 2): # 起始位置
j = i + length - 1 # 结束位置
for 每个非终结符 X:
max_prob = 0
best_split = None
best_Y = None
best_Z = None
# 遍历所有可能将[i,j]分为[i,s]和[s+1,j]的方式
for s in range(i, j):
# 遍历所有能生成Y和Z的规则 X -> Y Z
for 规则 (X -> Y Z) in R:
prob = q(X -> Y Z) * π[i][s][Y] * π[s+1][j][Z]
if prob > max_prob:
max_prob = prob
best_split = s
best_Y = Y
best_Z = Z
if max_prob > 0:
π[i][j][X] = max_prob
bp[i][j][X] = (best_split, best_Y, best_Z)
# 步骤3:读取结果
max_prob = π[1][n][S]
# 通过 bp[1][n][S] 递归回溯即可构建完整的解析树计算示例片段
让我们手动模拟一个极小片段的计算,以理解 π 和 bp 的填充过程。考虑句子片段 “saw the dog” (w3, w4, w5),我们关注计算 π[3, 5, VP](即“saw the dog”作为一个 VP 的最大概率)。
假设相关规则和概率如下(简化版):
VP → Vt NP(q=0.5)Vt → saw(q=1.0)NP → DT NN(q=0.8)DT → the(q=1.0)NN → dog(q=0.3)
并且我们已经计算出:
π[3, 3, Vt] = q(Vt → saw) = 1.0π[4, 4, DT] = q(DT → the) = 1.0π[5, 5, NN] = q(NN → dog) = 0.3π[4, 5, NP] = q(NP → DT NN) * π[4,4,DT] * π[5,5,NN] = 0.8 * 1.0 * 0.3 = 0.24
现在计算 π[3, 5, VP]:
- 只有一种规则分解:
VP → Vt NP - 分割点
s只能是 3(因为Vt只覆盖一个词)。 prob = q(VP → Vt NP) * π[3,3,Vt] * π[4,5,NP] = 0.5 * 1.0 * 0.24 = 0.12- 因此,
π[3, 5, VP] = 0.12,bp[3,5,VP] = (3, Vt, NP)。
这个简单的片段展示了 CKY 如何通过组合更小子串的最优解,来构建更大子串的最优解。
PCFG 的局限性与今天的方法
PCFG 是统计句法分析的重要基石,但它有明显的局限性:
- 独立性假设过强:PCFG 假设每条规则的应用是独立的,不考虑词汇信息(Lexicalization)和更远的上下文。例如,动词 “saw” 后接哪种 NP 结构,可能与 “saw” 本身有关,但基础 PCFG 无法建模。
- 缺乏词汇化:规则
NP → DT NN的概率是全局的,不会因为中心词NN是 “dog” 还是 “telescope” 而改变。
现代方法的发展:
- 词汇化 PCFG (Lexicalized PCFG):在规则中引入词汇信息(如中心词),显著提升了精度,但增加了模型复杂度。
- 基于判别式的句法分析器:使用机器学习模型(如感知机、条件随机场)直接学习从句子到句法树的映射,而非生成式模型。
- 神经句法分析:利用循环神经网络(RNN)、图神经网络(GNN)或 Transformer 来编码句子,并直接预测句法树结构,在许多基准测试上达到了 state-of-the-art 的性能。
尽管基础 PCFG 已不是工业界主流,但其核心思想——为结构化预测问题定义概率模型,并用动态规划进行高效解码——深刻影响了后续的序列标注、机器翻译等众多 NLP 任务。
📝 动手练一练
- 概念辨析:在 PCFG 中,为什么对于每个非终结符
α,其所有规则α → β的概率之和必须为 1?如果和不等于 1,在计算整棵解析树概率时会有什么问题?
👉 点击查看参考答案
答案: 概率之和为 1 是概率分布的基本要求。在 PCFG 中,当我们展开一个非终结符节点时,必须选择其众多规则中的一条。这些选择构成了一个互斥且完备的事件集合,因此它们的概率之和应为 1。
如果和不等于 1(比如小于 1),意味着有一部分概率“丢失”了,模型无法完整描述所有可能的展开方式。在计算整棵解析树概率时,我们假设每个节点的规则选择是独立的,并将所有节点的规则概率相乘。如果某个节点的规则概率和不等于1,会导致模型生成的所有可能解析树的概率总和不为1,这违背了概率模型的规范性,使得不同解析树之间的概率比较失去意义(因为它们不是在一个规范的概率空间下定义的)。
手算练习:假设有一个极简的 PCFG,规则和概率如下:
S → NP VP(1.0)NP → N(0.7) |NP → DT N(0.3)VP → V(0.4) |VP → V NP(0.6)N → dog(0.8) |N → cat(0.2)V → chases(1.0)DT → the(1.0)
对于句子 “the dog chases”,请列出所有可能的解析树,并计算每棵树的概率。哪一棵是最可能解析?
👉 点击查看参考答案
答案: 句子 “the dog chases” 分词为 [the, dog, chases]。
解析树1 (t1): [S [NP [DT the] [N dog]] [VP [V chases]]] 规则序列:S→NP VP, NP→DT N, DT→the, N→dog, VP→V, V→chases 概率 P(t1) = 1.0 * 0.3 * 1.0 * 0.8 * 0.4 * 1.0 = 0.096
解析树2 (t2): [S [NP [N dog]] [VP [V chases]]] (忽略 “the” 无法解析,因为 NP→N 规则不能生成 DT。实际上“the”必须被消耗。所以此树无效)
解析树3 (t3): [S [NP [N dog]] [VP [V chases] [NP ...]]] (VP→V NP 需要一个 NP,但句子只剩 “the”,而 “the” 单独不能构成 NP(NP→DT N 需要两个词),所以此结构也无法匹配整个句子)
实际上,在给定语法下,只有 解析树1 能成功覆盖整个句子 “the dog chases”。因此,最可能(也是唯一可能)的解析就是 t1,概率为 0.096。
这个练习也说明了语法设计的重要性:一个不完善的语法可能无法为某些句子生成合法的解析树。
本章小结
本节我们系统学习了概率上下文无关文法(PCFG),它是将概率思想融入句法分析的关键桥梁。
- PCFG 扩展了 CFG,为每条语法规则赋予概率,使得我们可以计算和比较不同句法解析树的似然度。
- 规则概率通过最大似然估计从树库中获得,体现了数据驱动的思想。
- 解析树的概率是其所有节点规则概率的乘积。
- CKY 算法 是一种基于动态规划的高效算法,在已转换为 CNF 形式的 PCFG 下为句子找到概率最大的解析树,其核心是自底向上填充概率表
π和回溯表bp。 - 尽管基础 PCFG 有独立性假设过强等局限,但其模型框架和解码算法为后续更复杂的句法分析模型奠定了基础。
📋 行动清单
- 理解 PCFG 中规则概率必须满足和为1的约束,并明白其必要性。
- 掌握从树库中用最大似然估计计算规则概率的方法。
- 能够手动计算给定 PCFG 和简单句子的解析树概率。
- 理解 CKY 算法的动态规划思想,特别是
π[i,j,X]和bp[i,j,X]的定义与递推公式。
—— 小象教研组