想象你是一家家具公司的售后工程师。一位顾客打来电话:“我收到的书架怎么多出三块板?”你看不到实物,只能请顾客描述:“最上面是一块长板,左右各一块竖板,中间横着三层……”你一边听,一边在纸上画出这本书架的“爆炸图”——标出侧板、层板、横梁,以及它们如何环环相扣。在自然语言处理里,这个动作就叫成分句法分析:句子是一件已经组装好的家具,句法分析的终极目标,是找出它的零件清单和装配关系,画出一棵清清楚楚的树。 这棵树不是装饰品。机器翻译要调整语序、问答系统要定位答案、文本纠错要发现语病——全都离不开它。本文将带你从“售后工程师”的视角出发,学会如何拆解句子、识别词组、运用CKY算法填表解析,甚至给每种拼法算概率。读完你会发现,原来理解句子这件事,和看懂说明书一样有章可循。

岗位关联

句法分析是NLP从“词袋统计”走向“深度理解”的必经之路。掌握它,你就能构建真正读懂句子结构的智能系统,这是机器翻译、问答、信息抽取等上层应用的核心地基。

目录
  1. 可视化演示
  2. 句法树基础
  3. 句法成分分类
  4. 短语结构规则
  5. CKY算法思想
  6. CKY算法流程
  7. 句法歧义
  8. 概率句法分析
  9. 实际应用挑战
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示句子成分句法分析三步骤:词性标注、句法树自底向上构建与CKY算法图表填充过程,交互切换查看各阶段。

本节配有交互动效(进入视口后自动加载,约 3KB)。

词法标注:词性POS标签分配 Det/N/V/Adv标记每个词 扫描线模拟标注过程 POS(wi) = argmax P(t|w) 滑块控制解析速度

句法树基础

书架的“爆炸图”长什么样?最上面是整件书架的编号(比如“型号B-2000”),往下拆成左右侧板和层板组,再往下是每一块木板和螺丝。句法树完全复制了这种层级:最顶端的节点叫根节点,通常记为 S(Sentence 的缩写),它代表整个句子;S 之下分出若干中间节点,每个中间节点代表一个“模块”;最底层的叶子节点则是句子里的一个个单词。整棵树的“高”从根算起,每多一层就多一级,就像书架的层数决定了它的容量。

从这棵树上,我们能看到两个关键关系:支配和直接成分。如果某个节点在另一个节点的上方,我们就说它“支配”下方节点;如果两者之间没有其他节点隔开,就是“直接支配”。名词短语 NP 直接支配名词 N,就好比侧板模块直接包含那块侧板木板。另外,树有一个神奇的性质——递归性:书架的层板可以无限叠加,句法树的规则也能不断套用自己。正因如此,有限条规则才能生成无限个句子,就像同一套书架图纸能造出高低不同的型号。

树形结构还有一条铁律:每个节点只有一个父节点。这意味着句子成分的归属是唯一的——每一块木板只能装在一个模块里,不能同时属于侧板和层板。这个性质让句法树成为一种天然的层次化容器,为后续的算法解析提供了干净的数学骨架。

回到书架的例子:你画出的爆炸图最上方永远是“书架总成”,往下才是各模块。句法树结构也是同样的道理——机器拿到一句话,先找根,再逐层拆解,最终还原出完整的装配关系。

S→NP  VPS \rightarrow NP\;VP
这条规则是句法树的“总装图”:一个句子(S)由名词短语(NP)和动词短语(VP)两大模块直接拼装而成,如同书架先装左右侧板,再架横梁。
  1. 根节点 S代表整个句子,是树的出发点。
    SS
  2. 左分支 NP名词短语,相当于书架的侧板模块,是句子的“话题主角”。
    NPNP
  3. 右分支 VP动词短语,相当于书架的核心结构,描述“主角干了什么”。
    VPVP

句法成分分类

书架的零件不是随意堆放的,售后工程师会按功能把零件分成几大类:侧板、层板、背板、连接件。句法树里的“零件”也有类似的分类体系,每一类都有一个专业代号。最常见的是这四种:名词短语(NP)、动词短语(VP)、介词短语(PP)、形容词短语(AP)。

名词短语 NP 是句子的“主角模块”,通常由限定词(Det)加名词(N)组成,比如"the cat““这本书”;它还可以夹带形容词,变成“三个可爱的孩子”。动词短语 VP 是“动作模块”,由动词加宾语组成,比如”ate the fish““跑步锻炼”。介词短语 PP 是“关系支架”,由介词加名词短语组成,起到连接作用,比如”on the table"“with a telescope“。形容词短语 AP 是”修饰模块“,用来给名词添加属性,比如”very beautiful”"quite tall"。

为什么要给这些模块分门别类?因为所有句子都是这些模块组装出来的。就像书架设计图只需标注零件类型,不用关心具体用什么木材,句法树也只标注抽象成分类型,不关心具体是哪个词。这种抽象化让机器能够泛化:只要识别出 “the cat“ 是 NP,”dog“ 前面加了 ”the” 也是 NP,模式就自动迁移了。

工程师在图纸上把零件归为四大类,句法分析器在句子中也做同样的事:每识别出一个词,先判断它属于哪个“零件库”,然后按模块组装。这就是句法分析的第一步——词性归类与短语识别。

NP→Det  N  ∣  Det  Adj  NNP \rightarrow Det\; N \;\mid\; Det\; Adj\; N
这条规则用竖线 "|“ 分隔,表示名词短语有两种拼法:要么”限定词+名词“,要么”限定词+形容词+名词"——就像侧板模块可以装一层面板,也可以装两层。
  1. Det 限定词起限定作用的词,如 the、a、this,相当于模块的“定位销”。
    DetDet
  2. N 名词核心名词,如 cat、book,相当于侧板木板本体。
    NN
  3. Adj 形容词起修饰作用的词,如 beautiful,相当于木板上贴的装饰条。
    AdjAdj
  4. 竖线分隔表示“或”,两种拼法都能得到合法的 NP。
    ∣\mid

短语结构规则

有了零件分类,还得有装配步骤。书架的说明书会写:“将侧板(左)与层板(右)对齐后,用连接件固定。”句法里的装配步骤就叫短语结构规则,也叫重写规则(Rewrite Rules)。它的形式是一条箭头:左边是一个成分符号,右边是它展开后的序列。

最核心的一条规则我们已经见过:S → NP VP,意思是“一个句子重写为名词短语+动词短语”。接下来是 NP 的展开规则:NP → Det N,即名词短语由限定词和名词组成;VP 的展开规则:VP → V NP,即动词短语由动词加宾语名词短语组成。这些规则可以互相嵌套:VP 里的 NP 又可以展开成 Det N,于是“ate the fish“就变成了 V+Det+N 的序列。这种嵌套就是递归的体现——一个大规则里面套着小规则,如同书架说明书的”层板组件“步骤里又引用了”连接件安装”子步骤。

规则还允许“或”的形式,比如 NP → Det N | Det Adj N,表示同一成分有多个合法的重写方案。这让语言生成变得灵活:同一套规则可以生成“the cat“,也可以生成”the beautiful cat“。对解析器而言,规则库就是”说明书的全部步骤”——只要规则库里有一条规则能从 A 推出 B,那么看到 B 时就知道它可能属于 A。

说明书上的每一步骤都是确定的:看到侧板+层板,就知道下一步装横梁。同样,解析器拿着规则库,看到 V 后面跟着 NP,就能推断它们共同构成 VP。规则就是句法分析的“装配手册”。

VP→V  NP  ∣  V  NP  PPVP \rightarrow V\; NP \;\mid\; V\; NP\; PP
动词短语可以只接宾语(V NP),也可以在宾语后接介词短语(V NP PP),对应“吃鱼”和“在桌上吃鱼”两种表达。
  1. 左侧 VP待展开的动词短语成分。
    VPVP
  2. 右侧 V NP先重写为动词加名词短语。
    V  NPV\; NP
  3. 右侧第二项 V NP PP可选的介词短语扩展。
    V  NP  PPV\; NP\; PP

CKY算法思想

现在你已经有了零件和规则,但真正的难题来了:给定一个句子,怎么自动找出它的装配图?手工画太慢,我们需要算法。这里登场的是古典而优雅的 CKY 算法(Cocke-Kasami-Younger),它的核心思想可以概括为“编号分治、查表合并”。

想象售后工程师面对一堆散落的木板,他并不尝试所有拼法,而是先给每块板编号,从最短的组合开始试:先两两配对(第 1 块和第 2 块能组成什么?),记在表格里;再用小组合去拼大组合(第 1 块到第 2 块的组合,拼接第 3 块到第 4 块的组合,能组成什么?)。这就是动态规划的精髓:把大问题拆成小问题,小问题的结果存下来复用,绝不重复计算。

CKY 算法要求文法必须是乔姆斯基范式(CNF),即所有规则形式要么是 A→BC(两个非终结符),要么是 A→词(终结符)。这个要求相当于说明书只保留两种步骤:“模块A由模块B和模块C组成”以及“模块A是某个零件”。任何上下文无关文法都能通过变换转化成 CNF,所以这个限制并不伤筋动骨。

算法使用的是一张三角形表格:行代表起始位置,列代表结束位置,格子 C[i][j] 存的是“从第 i 个词到第 j 个词这一段能推导出的所有成分”。当我们要判断 C[i][j] 里是否有 A,只需遍历一个分割点 k,检查 C[i][k] 和 C[k][j] 里是否有 B 和 C 满足 A→BC。这好比判断“第1块板到第4块板能否组成书架框架”,只需检查“第1到第2组成侧板”且“第3到第4组成横梁”这个组合。

这个公式完美体现了“编号分治”的思想:每一种合法的劈法都被检查,所有成功的推导结果都被存入表格,供上一层使用。CKY 不是一种试探法,而是一种保证不遗漏任何可能性的全量动态规划。

C[i][j]=⋃i<k<j{A∣A→BC,  B∈C[i][k],  C∈C[k][j]}C[i][j] = \bigcup_{i < k < j} \{A \mid A \rightarrow BC,\; B \in C[i][k],\; C \in C[k][j]\}
这是 CKY 算法的灵魂公式:若某段子串能从中间劈成两半,左半推得出 B,右半推得出 C,且规则库里恰好有 A→BC,那么这段子串就能推得 A。
  1. C[i][j] 目标格子表示从位置 i 到 j 之间词串可推导出的成分集合。
    C[i][j]C[i][j]
  2. 分割点 k遍历 i 和 j 之间的所有可能切分位置。
    i<k<ji < k < j
  3. 规则匹配左段推 B、右段推 C,且存在规则 A→BC。
    A→BC,  B∈C[i][k],  C∈C[k][j]A \rightarrow BC,\; B \in C[i][k],\; C \in C[k][j]
  4. 并集累积所有满足条件的 A 都加入集合。
    ⋃\bigcup

CKY算法流程

理论讲完,来走一遍实际流程。假设要解析句子 "the cat ate the fish",共 5 个词,我们先建一张 (n+1)×(n+1) 的三角表。第一步:初始化。 逐词查词典,把每个词的词性填入表中对应位置:the → Det,cat → N,ate → V,the → Det,fish → N。这一步相当于是从零件盒里挑出每块板,贴好标签。

第二步:按长度逐层合并。 先从长度为 2 的子串开始。检查 “the cat“(位置 0-2):查规则库发现 Det N 可以组成 NP,于是 C[0][2] 加入 NP。”ate the“(位置 2-4)能否组合?Det 和 V 没有匹配规则,格子留空,表上记一笔”此路不通“。接着处理长度为 3 的子串:”cat ate the“(位置 1-4)需要找分割点,先试 1+2 和 2+3,结果无匹配规则,标注为空。处理 ”the cat ate”(位置 0-3)时,在分割点 k=2 处,C[0][2] 有 NP,C[2][3] 有 V,查规则有 S→NP VP 吗?没有,因为 VP 尚未成型;但如果有 VP→V NP 之外的规则,这里就是空的。

第三步:继续扩大窗口。 处理长度为 4 和 5。当检查 C[2][5]("ate the fish")时,在分割点 k=3 处,C[2][3] = {V},C[3][5] = {NP},命中规则 VP→V NP,于是 C[2][5] 加入 VP。最后检查整句 C[0][5]:分割点 k=2,C[0][2] = {NP},C[2][5] = {VP},命中 S→NP VP,整句解析成功!

填表完成后,第四步:回溯构建树。我们从 C[0][5] 的 S 出发,按记录的分割点递归往下:S 由 C[0][2] 的 NP 和 C[2][5] 的 VP 组成;NP 由 the 和 cat 组成;VP 由 ate 和 C[3][5] 的 NP 组成……最终一棵完整的句法树就还原出来了。整个过程就像倒着看一遍说明书:从成品反推每一步用了哪些模块。

O(n³) 对于短句完全够用,但遇上上百词的长难句就会吃力,这也正是后文要讲挑战的原因。回到流程本身:初始化、合并、回溯三步走完整,你就能从一句话得到一棵树——如同看完说明书,你终于能对着顾客说:“那块多出来的板,应该是第二层的背板。”

O(n3)O(n^3)
CKY 的时间复杂度是 O(n³),n 是句子长度。三重循环分别对应:子串长度、起始位置、分割点,就像书架安装需要三层嵌套检查:每层板、每个安装位、每个连接点。
  1. 外层 n 次遍历子串长度从 2 到 n。
    nn
  2. 中层 n 次遍历子串起始位置。
    nn
  3. 内层 n 次遍历分割点 k。
    nn
  4. 乘积三层循环嵌套,总操作量级为 n³。
    n×n×n=n3n \times n \times n = n^3

句法歧义

同一个书架零件箱,有人装成了书架,有人装成了电视柜——句子也有这种“一间两构”的困扰,这叫句法歧义。最经典的例子是 “I saw the man with a telescope“。这句话有两种合法结构:第一种,”with a telescope“ 挂在动词短语 VP 下,意思是”我用望远镜看那个男人“;第二种,”with a telescope“ 挂在名词短语 ”the man“ 下,意思是”我看见那个拿着望远镜的男人”。两种结构的树完全不同,但对应的词序列一模一样。

这种特定歧义叫PP 附着歧义,因为介词短语 PP 的“挂靠点”不明确。另一种常见歧义是并列结构歧义,比如 “old men and women“,到底是”(old men)and women“还是”old(men and women)“?前者指”老年男性和女性“,后者指”老年男女”。句法树的分叉方式直接改变语义解读。

歧义为什么如此普遍?因为自然语言天然是“扁平”的——一句话只是一串词,词与词之间的层级关系完全靠听者脑补。机器没有人类的常识,它只能枚举所有可能的树。这就是为什么 CKY 算法会填入所有符合规则的成分:一个格子里可能同时有 NP 和 PP,这不算错误,而是忠实记录了所有可能性。

售后工程师遇到“多块板两种装法”时,会看看哪种装法更符合产品惯例——句法分析也遵循同样的思路:不靠死规则硬杀,而靠概率和经验来选。歧义不是 bug,它只是提醒我们,语言天然富含多种解读空间。

P(T1∣s)≠P(T2∣s)P(T_1 \mid s) \neq P(T_2 \mid s)
对同一句子 s,两种句法树 T₁ 和 T₂ 的条件概率不同。歧义消解的本质,就是比较哪棵树更可能。
  1. 给定句子 s两种结构面对的是同一串词。
    ss
  2. 树 T₁ 的概率第一种结构在真实语料中出现的可能性。
    P(T1∣s)P(T_1 \mid s)
  3. 树 T₂ 的概率第二种结构的可能性。
    P(T2∣s)P(T_2 \mid s)
  4. 不等号两者往往不相等,选大的即可。
    ≠\neq

概率句法分析

既然歧义需要“选一个最合理的”,那让每棵树都带个分数就好了。概率上下文无关文法(PCFG)就是在普通短语结构规则上附加概率:每条规则 A→α 带一个概率 P(A→α),表示在所有以 A 为左部的重写中,选择 α 的比例。所有同左部规则的概率之和必须等于 1——好比说明书上所有装法的比例加起来恰好是 100%。

概率从哪里来?从语料库统计得来。给定一万个已经标注好句法树的句子,统计规则 S→NP VP 出现了 900 次,S 总共出现 1000 次,那么 P(S→NP VP) = 0.9。这就是规则概率估计,本质上是最大似然估计:频率就是概率的近似。

得到规则概率后,一棵句法树的总概率怎么算?把所有展开规则的对应概率相乘。比如树 T 包含三条规则,概率分别是 0.9、0.7、0.5,则 P(T) = 0.9×0.7×0.5 = 0.315。这个乘积反映了整棵树在语言中的“正常程度”:常见结构得分高,生僻结构得分低。于是,面对歧义句,我们计算出所有合法树的概率,选最大的一棵——这个过程叫 Viterbi 解码。它像老师傅挑装法一样:把所有可行方案排出来,选最顺眼的那一个。

PCFG 让句法分析从“找出所有树”进化到“找出最好的树”,从“可能”进化到“可能且合理”。当然,它并非万能——后面会看到它的局限。但对大多数工程场景,“选概率最高的那棵树”已经足够实用。

P(T)=∏r∈TP(r)P(T) = \prod_{r \in T} P(r)
整棵句法树的概率等于树中每条重写规则概率的连乘积。乘法和"and"对应:要整棵树成立,必须每条规则都成立。
  1. P(T)整棵句法树的总概率。
    P(T)P(T)
  2. 连乘符号对所有规则取乘积。
    ∏r∈T\prod_{r \in T}
  3. P(r)单条规则 r 的概率。
    P(r)P(r)

实际应用挑战

句法分析不是学术象牙塔里的玩具,它已经走进真实系统。机器翻译是最典型的应用:英译中时,英语的 “The cat ate the fish“ 需要调整成中文语序”猫吃了鱼”,词序翻转的依据正是句法树——NP 和 VP 的交换规则直接映射为语序变换。Google 翻译的早期统计模型就用句法调序提升流畅度。

问答系统也用句法树定位答案。“谁吃了鱼?”这个问题落到文档句 “The cat ate the fish.“ 的树上,答案就藏在 NP 这个成分里。文本纠错同样受益:句法树无法完整生成时,说明句子可能缺少成分——”The cat ate” 虽有 S 结构但 VP 缺宾语,能被树形校验自动标记出来。

但工程落地没那么轻松。第一大挑战是长难句:O(n³) 的复杂度让超过 40 个词的句子解析慢得令人抓狂,而新闻、法律文本里长难句比比皆是。第二大挑战是领域适应性:从新闻语料学到的规则概率,用在医疗病历上往往水土不服——“患者主诉”和“记者报道”的句式差异巨大。第三是口语不完整:真实对话里到处都是“嗯”“那个”等填充词和残缺结构,把规范语法规则撕得支离破碎。

从书架售后部走向千家万户,句法分析还有很长的路要走。但它的核心思想——模块化拆分、递归组合、概率优选——已经深刻影响了整个 NLP 领域。记住那棵倒立的树,它值得你反复品味。

arg⁡max⁡TP(T∣s)\arg\max_{T} P(T \mid s)
工程系统的终极目标:给定句子 s,在所有可能的树中寻找条件概率最高的那棵——这也是现代句法分析器的统一目标函数。
  1. argmax 下标 T遍历所有可能的句法树。
    arg⁡max⁡T\arg\max_{T}
  2. P(T | s)在给定句子的条件下该树的概率。
    P(T∣s)P(T \mid s)

AI 应用场景

机器翻译的句法调序

阶段:特征工程与解码优化

解决的问题:传统机器翻译逐词对译,遇到语序差异大的语言对(如英-日、英-中)会产生“翻译腔”。利用源语言句法树,可以明确哪些短语需要整体移动,从根本上改善语序问题。

具体案例:翻译 “The cat ate the fish on the table“ 时,句法树显示 ”on the table“ 是修饰 ”the fish“ 的 PP 附着结构,翻译系统据此生成”猫吃了桌上的鱼“而不是”猫在桌上吃了鱼”。

问答系统的答案定位

阶段:信息抽取与语义理解

解决的问题:用户提问“谁发明了电话?”,传统关键词匹配返回一堆含“电话”的句子,无法抽出精确答案。对候选句做句法分析后,问题中的疑问词 “who“ 对应答案类型”人”,而句中主语 NP 正是提问的焦点。

具体案例:在文档 “Alexander Graham Bell invented the telephone in 1876.“ 的句法树中,”Alexander Graham Bell“ 是句子主语 NP,与 ”who” 问题的答案槽位匹配,系统精准抽取该片段返回用户。

Python 演示

python47 行
class CKYParser:    def __init__(self, grammar, lexicon):        self.grammar = grammar        self.lexicon = lexicon     def parse(self, tokens):        n = len(tokens)        table = [[set() for _ in range(n + 1)] for _ in range(n + 1)]        for i in range(n):            if tokens[i] in self.lexicon:                table[i][i + 1].update(self.lexicon[tokens[i]])            else:                return [], "词典未收录单词: " + tokens[i]        for length in range(2, n + 1):            for i in range(n - length + 1):                j = i + length                for k in range(i + 1, j):                    for lhs, rhs_list in self.grammar.items():                        for rhs in rhs_list:                            if len(rhs) == 2 and rhs[0] in table[i][k] and rhs[1] in table[k][j]:                                table[i][j].add(lhs)        return table, ""     def parse_sentence(self, tokens):        table, msg = self.parse(tokens)        if msg:            return msg        n = len(tokens)        if "S" in table[0][n]:            return "解析成功: S ∈ table[0][" + str(n) + "],句子合法"        return "解析失败: 找不到 S" if __name__ == "__main__":    grammar = {        "S": [("NP", "VP")],        "NP": [("Det", "N")],        "VP": [("V", "NP")],    }    lexicon = {        "the": {"Det"},        "cat": {"N"},        "fish": {"N"},        "ate": {"V"},    }    parser = CKYParser(grammar, lexicon)    result = parser.parse_sentence("the cat ate the fish".split())    print(result)
目的:用 Python 实现最简版 CKY 句法解析器,演示乔姆斯基范式文法的动态规划填表过程。
  1. table = [[set() for _ in range(n + 1)] for _ in range(n + 1)]创建三角表,每个格子存一个“成分集合”
  2. table[i][i + 1].update(self.lexicon[tokens[i]])初始化步骤:把词典里的词性填入对角线格子
  3. for length in range(2, n + 1)按子串长度从小到大推进,保证子问题先于父问题解决
  4. if len(rhs) == 2 and rhs[0] in table[i][k] and rhs[1] in table[k][j]核心合并判断:左右两半是否恰好能拼出规则右部
  5. table[i][j].add(lhs)命中规则则把左部非终结符加入当前格子

常见误区

误区以为句法树的结构就直接代表句子的意思,看到 “The cat ate the fish“ 的树就认为”施事“和”受事”已经标注好了。

正解句法树只描述语法成分的层级关系,不直接描述语义角色。“猫”是施事还是主题、动作是主动还是被动,这些属于语义层,需要另外的标注体系(如语义角色标注)。好比书架装配图只说明板件位置,不说明木头来自哪棵树。

为何常见:初学时句法树和语义常常一致(主语=施事、宾语=受事),让人误以为两者等价,遇到被动句"Fish was eaten by the cat"就懵了——鱼在主语位置,但它不是施事。

误区认为 CKY 算法是英文 NLP 专属工具,中文没有空格分词,无法使用 CKY。

正解CKY 的核心是“词序列→成分集”,与具体语言无关。中文只要先做分词,把词序列喂给 CKY 即可。中文文法规则同样写成 CNF 形式,如 S→NP VP、NP→Det N。区别只在于分词和规则库的构建方式,算法本身完全通用。

为何常见:网上 CKY 教程几乎都用英文例句(词之间有空格),让初学者误以为空格是算法的前提。

误区认为句法歧义是解析失败的标志,好的解析器应该永远只输出一棵树。

正解歧义是自然语言的内禀属性,再好的解析器也无法“消除”它,只能“选择”更可能的一棵。PCFG 的 Viterbi 解码就是做概率选择。有时候两棵树概率接近,保留多棵反而更有利——下游语义模块可以联合决策,就像老师傅看到两种装法都合理时,会问顾客“你想要书架还是电视柜”。

为何常见:教科书常以“这棵树是正确的”呈现结果,忽略了歧义树的普遍存在。

误区觉得概率最高的那棵句法树,一定是语义上最合理的解读。

正解PCFG 的概率只反映“语法结构在语料中的频率”,不直接代表“语义合理”。比如 “colorless green ideas sleep furiously“ 这句语法完全合法、概率不低,但语义荒谬。概率高只能说明”像人说的话“,不能说”说的是对的”。

为何常见:人们天然信任数字——既然系统给出了 0.95 的概率,就默认它是正确答案,忽略了概率来自结构统计而非语义验证。

面试题

Q1. 在句法树中,代表整个句子的根节点通常记为?

单选题 · easy

  • A.N
  • B.S← 正确答案
  • C.NP
  • D.VP

答案:B。S 是 Sentence 的缩写,代表整个句子的根节点。N 只代表名词,NP 是名词短语,VP 是动词短语,它们都是 S 之下的成分节点。就像书架装配图最顶端的“总成”编号。

Q2. 名词短语 NP 最典型的组成方式是?

单选题 · easy

  • A.动词加名词
  • B.限定词加名词← 正确答案
  • C.介词加名词
  • D.副词加形容词

答案:B。NP 的典型规则是 NP→Det N,如 "the cat"。动词加名词构成 VP,介词加名词构成 PP,副词加形容词构成 AP,各有各的归属。

Q3. CKY 算法要求文法满足哪种范式?

单选题 · mid

  • A.正则文法
  • B.乔姆斯基范式← 正确答案
  • C.无约束文法
  • D.概率文法天然满足

答案:B。CKY 要求所有规则形如 A→BC 或 A→词,这正是乔姆斯基范式(CNF)的定义。任何上下文无关文法都能转化为 CNF,正则文法和无约束文法不满足要求。概率文法只是附加概率,不改变形式需求。

Q4. 以下哪些属于句法成分类型?

多选题 · mid

  • A.名词短语 NP← 正确答案
  • B.动词短语 VP← 正确答案
  • C.介词短语 PP← 正确答案
  • D.递归短语 RP

答案:ABC。NP、VP、PP 是标准句法成分类型,分别对应名词短语、动词短语和介词短语。不存在“递归短语”这种成分类型——递归是树的性质,不是成分类别,就像书架里没有一种零件叫“循环”。

Q5. “I saw the man with a telescope“ 中 ”with a telescope” 的挂靠位置不明确,属于哪种歧义?

单选题 · mid

  • A.词性歧义
  • B.PP 附着歧义← 正确答案
  • C.并列结构歧义
  • D.指代歧义

答案:B。PP 附着歧义指介词短语既可以修饰前面的动词短语,也可以修饰前面的名词短语。“with a telescope“ 可修饰 ”saw“(用望远镜看),也可修饰 ”the man”(带望远镜的男人)。词性和并列结构歧义是另外的类型。

Q6. PCFG 中,整棵句法树的总概率如何计算?

单选题 · mid

  • A.规则概率求和
  • B.规则概率连乘← 正确答案
  • C.取最大规则概率
  • D.取规则概率平均值

答案:B。整棵树的总概率等于所有规则概率的乘积 P(T)=ΠP(r),因为每条规则都要成立,树才成立,这是“且”关系。求和对应“或”关系,取最大和平均都没有概率论依据。

Q7. CKY 算法的时间复杂度是多少?

单选题 · mid

  • A.O(n)
  • B.O(n log n)
  • C.O(n²)
  • D.O(n³)← 正确答案

答案:D。CKY 有三层循环:子串长度、起始位置、分割点,每层最多 n 次,所以总复杂度为 O(n³)。O(n) 是线性扫描复杂度,O(n²) 是两重循环复杂度,都不符合实际。

Q8. 下列关于 CKY 填表过程说法正确的有?

多选题 · hard

  • A.从最短子串开始填充← 正确答案
  • B.子问题结果被多次复用← 正确答案
  • C.每个格子的内容随机生成
  • D.自底向上逐步扩大窗口← 正确答案

答案:ABD。CKY 按子串长度从短到长填充,是典型的自底向上动态规划;小格子的结果会被大格子反复查询复用。格子内容由语法规则的确定性推导生成,绝非随机。

Q9. Viterbi 算法在 PCFG 解析中的作用是?

单选题 · extreme

  • A.计算所有树的总概率
  • B.找出概率最大的解析树← 正确答案
  • C.生成符合语法的随机句子
  • D.直接消除句子的歧义

答案:B。Viterbi 是动态规划解码算法,在给定句子和文法条件下,高效找出概率最大的那一棵句法树。它并不遍历所有树,也不负责“消除”歧义——歧义依然存在,只是我们选择了概率最高的一种解读。

Q10. 句法树结构在工业界的实际应用包括?

多选题 · hard

  • A.机器翻译的语序调整← 正确答案
  • B.问答系统的答案定位← 正确答案
  • C.文本纠错的成分校验← 正确答案
  • D.图像识别目标检测

答案:ABC。句法树的三大经典应用是机器翻译调序、问答答案定位和文本纠错成分校验。图像识别处理的是像素数据,与语言结构无关,除非是图文结合的视觉问答任务,但那也不是直接应用句法树。