形式语言与自动机及其在NLP中的应用
1. 基本概念
树的概念(省略)
字符串(string):
- 定义:假定
是字符的有限集合,由 中字符相连而成,不包括任何字符的字符串称为空串,记作 ε:Epsilon(艾普西龙) |ε|= 0 - 全体字符:
- 定义:假定
闭包:

正则式:必考

- XY:表示两个正规表达式
和 的连接(concatenation),即先匹配 再匹配 。例如,如果 , ,那么 。X·Y:同样表示连接,点号(·)是显式的连接符号,但一般可省略,因此 XY = X·Y。 - 直观来说,X | Y 代表的是由
或 生成的字符串集合中的任何一个。


U ∪ V:表示两个集合
和 的并集(union),即同时包含 和 的所有元素。U·V:表示两个集合的连接,即对于集合
中的每个字符串 和 中的每个字符串 ,形成 这样的新字符串,构成新集合。

例子

2. 形式语言
所有的语言都是:句子和符号[字符]串的有限或无限的集合
- 穷举法:只适合句子数目有限的语言
- 文法描述、语法描述:生成语言中合格的句子
- 自动机:对输入的句子进行检验,区别哪些是语言中的句子,哪些不是语言中的句子
2.1 定义 重点


2.2 推导,派生定义
- 直接派生/推导:


- 间接派生:


2.3 最左/右推导


2.4 句子和句型

2.5 正则文法

2.6 上下文无关文法 必考

*例子 必考

图中文法的讲解
图中的文法
- 非终结符集合:
- 终结符集合:
- 产生式规则:
该文法的推导过程:
- 从
开始:- 只能通过
产生一个 ,然后变成 。
- 只能通过
可能通过: 继续生成 ,这意味着 生成一个或多个 。 进入 的部分,且必须至少有两个 。
产生 一个或多个 直到终结。
该文法生成的语言为:
即:
说明 至少为 1(即至少一个 )。 说明 至少为 3(即至少三个 )。- 结构示例:
这个文法 不是正则语法,因为它包含了规则
2.7 上下文有关文法 必考
3. CFG
3.1 CFG 产生的语言句子的派生树表示
派生树是一种树形结构,用于可视化一个句子的推导过程。
根节点是起始符号
。内部节点是非终结符,每个非终结符根据产生式继续展开。
叶子节点是终结符,形成最终的字符串。
派生树的作用:
- 直观地展示句子的生成过程。
- 解析器(parser)可以利用它分析输入是否符合语法规则。
例子

3.2 CFG的二义性
如果一个上下文无关文法(CFG)**能用**两种不同的方式生成同一个字符串,那么这个文法就是二义性文法(Ambiguous Grammar)。
简单理解: 同一个句子,可以有两棵不同的派生树(Parse Tree)或者两种不同的推导方式。
4. 自动机
自动机(Automaton)是一种数学模型,用于模拟计算过程,它接受或拒绝输入字符串,决定某个字符串是否属于特定语言。自动机在计算理论和编译原理中有广泛应用。
4.1 定义
自动机的核心组成部分:
状态集合(States):表示系统的不同情况,通常用
表示。输入字母表(Alphabet):定义可接受的输入符号集合,通常用
表示。状态转移函数(Transition Function):决定了在某个状态接收到输入后如何转移到下一个状态,通常用
表示。初始状态(Start State):计算开始时的状态,通常用
表示。接受状态(Accept States):如果输入结束时,自动机处于这些状态之一,则接受该输入,通常用
表示。
想象你去坐地铁:
- 你在**起点站(初始状态)**上车。
- 你根据地铁线路图(规则),随着地铁运行到不同的站点(状态)。
- 如果你到达了目标站(接受状态),你可以下车,表示这个路线是正确的(接受)。
- 如果你中途走错了或者线路终点不对,那就说明这个路线是无效的(拒绝)。
4.2 语言与识别器的对应关系

自动机类型 | 通俗解释 |
---|---|
有限自动机(Finite Automaton, FA) | 只能记住有限个状态,比如红绿灯,只有“红灯、黄灯、绿灯”三个状态,不能存储过去的信息。 |
下推自动机(Pushdown Automaton, PDA) | 记忆能力更强,带有一个“备忘录”(栈),比如你在编程时匹配括号是否成对。 |
线性有界自动机(Linear Bounded Automaton, LBA) | 可以处理更复杂的情况,比如自然语言语法,它能理解更长的规则。 |
图灵机(Turing Machine) | 最强大的自动机,能模拟所有计算机程序,比如你的智能手机或电脑都可以被看作是一个图灵机。 |
4.3 有限自动机与正则文法
4.3.1 确定的有限自动机 DFA
DFA 由五个部分组成,数学表示为:
其中:
(输入符号集):DFA 接受的所有输入符号的有限集合(例如 {0,1} 表示二进制输入)。 (状态集合):自动机可能处于的所有有限状态的集合。 (初始状态):计算开始时的状态,只有一个。 (终止状态集合):如果自动机最终停留在这些状态之一,则输入被接受。 (状态转移函数):- 定义当前状态
在接收输入 后转移到哪个新状态 。 - 确定性:对于每个状态
和每个输入符号 ,只能有一个唯一的转移(不会有多个选择)。
- 定义当前状态
例子:

图示:

4.3.2 不确定的有限自动机 NFA
一个 NFA 由五个部分组成:
其中:
:输入符号的有限集合(字母表)。 :状态的有限集合。 :初始状态(唯一)。 :终止状态集合,若计算完成时停在这些状态之一,则输入被接受。 (状态转移函数):- 从 当前状态
和 输入符号 出发,NFA 可能有多个可选的下一步状态。 - 由于状态可能有多个选项,
的输出是状态集合(而不是单个状态)。
- 从 当前状态
4.3.3 DFA & NFA
想象你在一个迷宫里寻找出口:
- DFA(确定性):在每个十字路口,你只能选一个方向走(规则非常严格)。
- NFA(非确定性):在每个十字路口,你可以选择多个路径同时尝试(就像有多个分身同时探索迷宫)。
- 只要有一个分身找到了出口,整个 NFA 就算成功接受了输入.
对比项 | DFA(确定性有限自动机) | NFA(非确定性有限自动机) |
---|---|---|
状态转移 | 每个状态和输入符号只有一个可能的下一个状态 | 每个状态和输入符号可以有多个可能的下一个状态 |
计算方式 | 严格按照单一路径执行 | 可以“同时”沿多个路径执行(多线程感觉) |
是否有 | 不允许 | 允许 |
实现难度 | 相对简单,易于实现 | 结构更灵活,但实现复杂 |
等价性 | 可以直接转换为 NFA | NFA 可以转换成等价的 DFA(但可能状态数指数级增长) |
4.3.4 正则文法和有限自动机
该定理说明:
- 每个正则文法都可以转换为一个有限自动机(FA)。
- 每个有限自动机(FA)都能对应一个正则文法。
- 正则文法的语言
等价于有限自动机识别的语言 ,即:
换句话说,正则文法与有限自动机是等价的,它们描述了相同的一类语言(正则语言)。
4.3.5 正则文法到自动机步骤
(1)定义自动机的基本元素
设定自动机的符号系统
是输入字母表(终结符集合)。 是状态集合,它由所有的非终结符 加上一个额外的终止状态 组成。 设定初始状态为 。 是新增的终结状态,它用于表示字符串符合规则并被接受。
例子
给定正则文法:
( 代表终止)
那么:
- 状态集合:
- 输入符号:
- 初始状态:
- 终止状态:
(2)处理空串规则
- 如果文法中有规则
(意味着空字符串也应该被接受),那么我们让 本身就是终止状态,即: - 如果没有空串规则,则只有
作为终止状态:
例子
如果文法有:
(允许空字符串),那么 本身就是终止状态,所以 。- 如果没有
,那么 。
(3)处理单独的终结符产生式
如果文法有形如:
即 某个非终结符
- 从状态
读取字符 后,直接进入终止状态 :
例子
文法:
(意味着 直接变成 )
转换成自动机:
( 看到 直接进入终止状态)
(4)处理带非终结符的产生式
如果文法有形如:
即 某个非终结符
- 从状态
读取 后,进入状态 :
例子
文法:
(意味着 直接变成 )
转换成自动机:
这样,状态转换图可以表示为:
S --(a)--> A --(b)--> B --(c)--> T
如果输入是 "abc"
,那么这个字符串会被自动机接受。
(5)终止状态的规则
对于终止状态
即 终止状态
例子
如果你在终止状态
必考

答
状态集合
:初始状态 :中间状态 :终止状态(接受状态)
输入符号
状态转移函数(NFA 规则)
当前状态 | 读入字符 | 转移状态 |
---|---|---|
终止状态
4.3.6 状态变换图

4.4 CFG与下推自动机
4.4.1 PDA
基本概念
PDA 可以看作是一个带有栈(Stack)存储器的有限自动机,其特点包括:
输入带(Input Tape):像 DFA/NFA 一样,它从左到右读取输入字符。
有限控制器(Finite Control):它决定状态如何变化。
下推存储器(Stack Storage):一个额外的
栈(stack),可以存取无限长的信息。
- PDA 可以读取栈顶元素。
- PDA 可以向栈顶写入新元素(Push)。
- PDA **可以从栈顶弹出元素(Pop)**。
栈的作用:PDA 之所以比 DFA 更强大,是因为它能够记住历史信息,这对于处理嵌套结构(如括号匹配)至关重要。

数学定义
一个 PDA 由 7 元组表示:
其中:
:输入符号的有限集合(即输入字母表)。 :有限个状态的集合。 :栈符号的有限集合(即可以存入栈的符号)。 :初始状态。 :栈的初始符号(默认栈底符号)。 :终止状态集合(如果 PDA 进入终止状态,输入被接受)。(状态转移函数):描述状态如何变化:
在某个状态
,读取输入带上的符号 (或 ),同时查看栈顶符号 ,然后决定:- 进入哪个新状态
。 - 是否弹出(Pop) 栈顶符号。
- 是否压入(Push) 一个或多个符号到栈中。
- 进入哪个新状态