從 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),討論這一術語的定義、判定條件、分析範圍以及不同語法分析之間的差異。