从 Parser 到层次分析:自然语言语法分析与电脑科学的对照

自然语言分析与原始码分析都需要处理一个基本问题:如何从线性的单位序列中,确定各单位之间的结构与关系。

在电脑科学中,这一过程可以用 Lexer(词法分析器)、Token(词法单位)、Parser(语法分析器)、Semantic Analysis(语义分析)等概念描述。

在语言学中,相应的分析概念包括词法分析(lexical analysis)、词类(part of speech)、句法分析(syntactic analysis)、层次分析(hierarchical analysis)与语义分析(semantic analysis)。

两套系统并不等同。本文的对照只用于区分分析过程中的不同层次。

电脑科学 自然语言
Source Code 语言材料
↓ ↓
Lexical Analysis 词法分析
↓ ↓
Tokens 词 / 词类
↓ ↓
Parsing 句法分析
↓ ↓
Parse Tree / AST 层次结构
↓ ↓
Semantic Analysis 语义分析

两者之间的关系应理解为分析方法上的相似性,而不是概念上的完全等价。

1. 从线性序列到层次结构

原始码与自然语言在表层上都表现为线性序列。

原始码:

a + b * c
我 喜欢 学习 汉语
A → B → C → D
Linear Sequence
↓
Hierarchical Structure

这是电脑科学中的 Parsing 与语言分析中的层次分析之间最基本的共同点。

2. Lexer 与词法分析:辨识单位

在 Compiler(编译器)中,Lexical Analysis 将字元序列划分为 Token。

Characters
↓
Lexical Analysis
↓
Tokens

例如:

value + 10
IDENTIFIER("value")
PLUS("+")
INTEGER(10)

自然语言的词法分析同样需要辨识词法单位及其属性。

例如:

我喜欢学习汉语
我 / 喜欢 / 学习 / 汉语
我 代词
喜欢 动词
学习 动词
汉语 名词

在分析方法上,可以作如下对照:

Lexical Analysis ≈ 词法分析
Token ≈ 词法单位
Token Category ≈ 词类

符号 ≈ 表示分析方法上的相似性,不表示两个概念完全相同。

3. Token 与词类不能决定完整结构

知道每个 Token 的类型,不足以确定程式的完整结构。

同样,知道每个词的词类,也不足以确定句子的结构。

例如:

Noun + Verb + Noun
Noun
├── ?
Verb
├── ?
Noun

也不能确定三个单位之间的语义关系。

在自然语言中,同一个词还可能具有不同的词类或句法功能,具体判断可能依赖更大的结构与语境。

因此,单位分类是分析的基础,但不是分析的最终结果。

4. Parser 与句法分析:确定结构

在电脑科学中,Parser 根据 Grammar(形式文法)分析 Token,确定它们如何形成结构。

Tokens
↓
Parser
↓
Syntactic Structure

在语言学中,句法分析用于确定句中各单位之间的结构关系。

词
↓
句法分析
↓
句法结构

在方法上可以表示为:

Parser / Parsing ≈ 句法分析
Structure
/ \
Unit A Structure
/ \
Unit B Unit C

重要的不是树本身的形状,而是树所表示的结构资讯。

例如:

A + B + C
(A + B) + C
A + (B + C)
Parse Tree ≈ 层次结构的形式表示
Parsing ≈ 层次关系的辨识

但是,层次分析并不是自然语言的 AST。两者只是共享以层次方式表示结构的基本思想。

6. AST 与结构抽象化

Abstract Syntax Tree,AST(抽象语法树)保留重要的结构关系,同时省略部分不再需要的形式细节。

例如:

a + b * c
Add
├── a
└── Multiply
├── b
└── c

AST 的作用之一,是把线性序列转换成具有明确关系的结构模型。

自然语言分析也需要区分表层词序与内部结构。句子的分析不能只记录词语出现的先后顺序,还需要表示各成分之间的结构关系。

因此,AST 可以作为结构表示方法上的对照,但不能直接等同于自然语言的句法结构。

7. Grammar Rule 与语法规则

在电脑科学中,Grammar Rule(形式文法规则)规定 Parser 可以建立哪些结构。

例如:

Expression → Expression + Expression
Grammar Rule ≈ 语法规则
Specification
↓
Grammar
↓
Valid Structure

在 Natural Language(自然语言)的研究中:

Language Data
↓
Observation
↓
Generalization
↓
Grammatical Description

程式语言的 Grammar 通常是 Specification(规格)的一部分。自然语言的描述语法则主要是研究者根据语言资料建立的分析模型。

8. Pattern 不等于 Grammar Rule

Pattern 是在资料中可以观察到的形式模式。

例如:

A + B + C
A + [B + C]
Observed Pattern
↓
Structural Hypothesis

与:

Observed Pattern
≠
Proven Structure

在电脑科学中,Parser 通常可以依据已经确定的 Grammar 进行分析。

在自然语言研究中,Grammar 本身往往正是需要根据资料建立、描述或检验的模型。

这是两种分析方法之间的重要差异。

9. Candidate Structure:需要检验的结构

一个 Pattern 可以产生一个或多个 Candidate Structure(候选结构)。

例如:

A B C
[A B] C
A [B C]
Surface Pattern
↓
Candidate Structures
↓
Analysis

能够把某个 Candidate Structure 画成树,只表示分析者已经建立了一个可能的结构模型。

它本身不能证明该模型正确反映了语言材料中的实际关系。

10. Syntactic Ambiguity 与句法歧义

Syntactic Ambiguity(句法歧义)是指同一个表达形式可以具有多种句法分析。

一般模型为:

Input
├── Parse A
└── Parse B

不同分析可以具有完全相同的:

  • 词语;
  • 词序;
  • 词类;

但建立不同的结构关系。

因此:

Same Tokens
≠
Same Structure

以及:

Same Surface Pattern
≠
Unique Analysis

层次分析可以用来确定这些不同的结构可能性。但是,句法结构仍然不是分析的最后一个层次。

11. Semantic Analysis 与语义分析

在 Compiler 中,Semantic Analysis 用于检查 Parser 仅依靠句法结构不能确定的限制。

例如:

"hello" - 5
Subtract
├── String
└── Integer

但如果 - 没有被定义为可以作用于 String,这个表达式仍然会被拒绝。

在语言学中,语义分析同样处理形式结构本身不能完整回答的问题,例如:

  • 哪个成分描述哪个成分;
  • 动作与哪些参与者发生关系;
  • 属性被赋予哪个对象;
  • 各成分在意义上是否相容;
  • 某种层次分析是否保存了整个表达式的解读。

在方法上,可以作如下对照:

Semantic Analysis ≈ 语义关系与语义限制的分析
A 与 B 组合
A 与 B 具有什么关系?
Words
↓
Tree

而是:

Words
↓
Structure
↓
Relations

树是表示结构的工具,不是证明某一结构分析正确的独立证据。

13. Semantic Constraints 与语义限制

在电脑科学中,一个 Node(节点)可以出现在句法允许的位置,却不符合 Semantic Constraint(语义限制)。

例如:

Subtract
├── String
└── Integer

可以具有合法的句法形状,但可能违反 Type(型别)要求。

自然语言中,各成分之间的组合也受到语义限制。

某个 Predicate(谓词)可能要求它所描述的对象具有特定的语义性质。某个 Verb(动词)也可能对参与其语义关系的成分提出一定条件。

可以抽象表示为:

Syntactic Position
↓
Semantic Requirement
↓
Compatible / Incompatible

这并不表示 Compiler 的 Semantic Constraint 与自然语言中的语义限制具有完全相同的机制。

共同原则是:

能够出现在某个形式结构中,不等于在语义上必然相容。

14. 为什么 Pattern 不足以确认一种分析?

Pattern 只提供形式上的资讯。

假设观察到:

A + B + C
A + [B + C]
1. B 与 C 是否构成一个成分?
2. 什么规则允许这个结构?
3. B 与 C 具有什么句法关系?
4. B 与 C 具有什么语义关系?
5. 这个结构是否保存了整个表达式的解读?

因此:

Pattern Match
↓
Candidate Structure
↓
Syntactic Analysis
↓
Semantic Analysis

不能简化为:

Pattern Match
↓
Conclusion

语法名称本身也不能证明该名称所预设的结构。结构必须由成分之间实际存在的关系来支持。

15. Pattern + Structure + Semantics

较完整的分析模型可以表示为:

Form
↓
Pattern
↓
Candidate Structure
↓
Syntactic Relations
↓
Semantic Relations
↓
Interpretation

每一层处理不同的问题。

Form(形式)

出现了哪些单位?

Pattern(模式)

这些单位具有什么形式分布?

Structure(结构)

这些单位具有什么层次组织?

Syntactic Relations(句法关系)

各成分具有什么句法功能与关系?

Semantic Relations

各成分在意义上如何互相关联?

Interpretation(解读)

整个结构在具体语境中如何被理解?

后一层不能仅依靠前一层的名称自动推导出来。

16. 概念对照

电脑科学 自然语言分析 对照重点
Source Code(原始码) 语言材料 输入资料
Lexical Analysis(词法分析) 词法分析 辨识单位
Token(词法单位) 词 / 词法单位 分析单位
Token Category(Token 类型) 词类 单位分类
Parser(语法分析器) 句法分析 确定结构
Parse Tree(语法分析树) 层次结构 表示层次关系
AST(抽象语法树) 抽象结构模型 省略非必要形式细节
Grammar Rule(形式文法规则) 语法规则 描述组合可能性
Syntactic Ambiguity(句法歧义) 句法歧义 同一形式存在多种结构
Semantic Analysis(语义分析) 语义分析 分析意义关系
Semantic Constraint(语义限制) 语义限制 对组合施加条件

表中的各组概念都是方法上的对照,不是完全等价的定义。

17. 对照模型的限制

Programming Language 是人为设计的形式系统。Natural Language 则是在语言共同体的使用与历史演变中形成的系统。

Compiler 通常可以提出:

这个结构是否符合 Specification?
这些语言资料反映了什么样的系统?
Grammar
↓
Parser
↓
Accepted / Rejected

而在自然语言研究中,关系通常更加复杂:

Data
↓
Possible Analysis
↓
Comparison
↓
Generalization
↓
Grammatical Model

描述语法不是自然语言的「原始码」。它是研究者为解释语言资料而建立的模型。

Compiler 的对照价值主要在于区分分析层次与分析步骤,而不是把两种系统视为相同。

18. 总结:Form → Pattern → Structure → Semantics

分析一个语言表达式,不能停留在辨识 Pattern。

完整的分析过程可以抽象为:

Form
↓
Pattern
↓
Candidate Structure
↓
Syntactic Relations
↓
Semantic Relations
↓
Interpretation

可以由此得到三个基本原则:

Pattern ≠ Structure
Structure ≠ Semantic Validity
Possible Analysis ≠ Established Analysis

Pattern 可以提供提出结构假设的依据。结构需要由句法关系支持,句法关系还需要与语义关系及语义限制相互验证。

这是 Compiler 分析方法与自然语言语法分析之间最重要的方法论交集。

下一篇将把这一分析框架应用于现代汉语中的具体语法问题:主谓谓语句(subject-predicate predicate sentence),讨论这一术语的定义、判定条件、分析范围以及不同语法分析之间的差异。