语言描述(该语言是什么样的,句子是否属于该语言)的三种途径:
文法描述:给予语言中的句子以结构,各成分之间的结构关系清楚、明了。运用文法描述判断句子是否属于该语言较为困难。
自动机:机械刻画对输入字符串的识别过程,结构关系不清楚。判断句子是否属于该语言较为简单。
形式语言是用来精确地描述语言极其结构的手段。
形式语法的定义:
形式语法是一个4元组 G = ( N , Σ , P , S ) G=(N,\Sigma,P,S) G=(N,Σ,P,S),
其中,N是非终结符的有限集合(变量集/句法种类集);
Σ \Sigma Σ是终结符的有限集合( N ∩ Σ = ⊘ N\cap\Sigma=\oslash N∩Σ=⊘, V = N ∪ Σ V=N\cup\Sigma V=N∪Σ);
P是一组重写规则的有限集合( P = { α → β } P=\{\alpha\to\beta\} P={α→β},其中 α , β \alpha,\beta α,β都是V中元素构成的串,但 α \alpha α中至少应该含有一个非终结符号);
S ∈ N S\in N S∈N,成为句子符或初始符。
推导的定义:
设G是一个文法,在V上定义 ⇒ G \Rightarrow_G ⇒G(直接派生/推导)如下:如果(1) α β γ \alpha\beta\gamma αβγ是V中的符号串,且(2) β → δ \beta\to\delta β→δ是P的产生式,那么 α β γ ⇒ G α δ γ \alpha\beta\gamma\Rightarrow_G\alpha\delta\gamma αβγ⇒Gαδγ。
推导是一个变化的操作。
需要补充的是:
⇒ G + \Rightarrow_G^+ ⇒G+(非平凡方式派生):直接派生的传递闭包,V上的符号串 ϵ i \epsilon_i ϵi到 ϵ i + 1 \epsilon_{i+1} ϵi+1的 n ( n ≥ 1 ) n(n\ge1) n(n≥1)步派生。(推出来的结果还在V内,不包含本身)
⇒ G ∗ \Rightarrow_G^* ⇒G∗(派生):直接派生的自反或传递闭包,V上的符号串 ϵ i \epsilon_i ϵi到 ϵ i + 1 \epsilon_{i+1} ϵi+1的 n ( n ≥ 0 ) n(n\ge0) n(n≥0)步派生。(推出来的结果还在V内,包含本身)
如果明确某个推导是给定文法G产生的,那么可以省略G。
派生或非平凡方式派生中的每一个直接派生中只改写最左侧的非终结符号,称为“最左推导”,反之称为“最右推导”/“规范推导”。
举例:
句子的定义:
文法G的句子形式通过以下递归方式定义:
(1)S是一个句子形式;
(2)如果 γ β α \gamma\beta\alpha γβα是一个句子形式,且 β → δ \beta\to\delta β→δ是P中的产生式,那么 γ δ α \gamma\delta\alpha γδα也是一个句子形式。
G生成的句子:不含非终结符的句子形式;
G识别的语言:G生成的句子集合,记为 L ( G ) = { x ∣ x ∈ Σ , S ⇒ G ∗ x } L(G)=\{x|x\in\Sigma,S\Rightarrow_G^*x\} L(G)={x∣x∈Σ,S⇒G∗x}。
任何文法的推导都要遵循最左/最右中的一种,且不能跳步。
3型文法:正则文法;2型文法:上下文无关文法;1型文法:上下文相关文法;0型文法:无约束文法。
这些文法的区别在于规则集的定义。规则集的关注点又在于:推导左右两侧的变量形式和所属。
如果文法G的规则集P中所有则均满足如下形式: A → B x A\to Bx A→Bx或 A → x A\to x A→x,其中 A , B ∈ N , x ∈ Σ A,B\in N,x\in\Sigma A,B∈N,x∈Σ,则称该文法为正则文法。
如果非终结符号出现在最左边,称为左线性正则文法,反之,称为右线性正则文法。
如果文法G的规则集P中所有规则均满足如下形式: A → a A\to a A→a,其中, A ∈ N , α ∈ V ∗ A\in N,\alpha\in V^* A∈N,α∈V∗,则称文法G为上下文无关文法(CFG context- free gramma)。
2型文法比3型文法少了一层限制,可以看到其规则右端的格式没有约束,那么规则左端可以改写为任何形式。
如果文法G的规则集P中所有规则满足如下形式: α A β → α γ β \alpha A\beta\to \alpha\gamma\beta αAβ→αγβ,其中 A ∈ N A\in N A∈N, α , β , γ ∈ V ∗ \alpha,\beta,\gamma\in V^* α,β,γ∈V∗,且 γ \gamma γ至少包含一个字符,则称G为上下文有关文法(CSG context- sensitive grammar)。
字符串 α A β \alpha A\beta αAβ中的A被改写为 γ \gamma γ时需要有上下文语境 α , β \alpha,\beta α,β。
如果上下文语境为空字符串,则1型文法转变为了2型文法。在上下文无关文法中,规则左侧可以被改写为任意形式,属于V的字符可以不只有一个。
如果文法G的规则集P中所有规则满足如下形式: α → β \alpha\to\beta α→β,其中 α ∈ V + , β ∈ V ∗ \alpha\in V^+,\beta\in V^* α∈V+,β∈V∗,则称G为无约束文法。
从0型文法到3型文法,约束越来越多,所识别的语言集合 L ( G ) L(G) L(G)也越来越小。
如果一种语言由几种文法产生,则把这种语言称为在几种问法中受限制最多的那种文法产生的,
G所识别的句子的派生树的构造步骤(构成,描述每个节点的意义):
二义性文法:
如果文法G对于同一个句子存在两棵或两棵以上不同的分析树,那么句子是二义性的,文法G称为二义性文法。
DFA M是一个五元组: M = ( Σ , Q , δ , q 0 , F ) M=(\Sigma,Q,\delta,q_0,F) M=(Σ,Q,δ,q0,F),
Σ \Sigma Σ是输入符号的有穷集合,
Q是状态的有限集合,
q 0 ∈ Q q_0\in Q q0∈Q是初始状态,
F是终止状态集合, F ⊆ Q F\subseteq Q F⊆Q,
δ \delta δ是 Q Q Q与 Σ \Sigma Σ的直积 Q × Σ Q\times\Sigma Q×Σ到Q(下一个状态)的映射,它支配着有限状态控制的行为,有时也称为转移函数。
(直积: X × Y = { ( x , y ) ∣ x ∈ A ∧ y ∈ B } X\times Y=\{(x,y)|x\in A\land y\in B\} X×Y={(x,y)∣x∈A∧y∈B})
DFA是状态、映射、输入的结合体,文法描述是符号、规则的结合体。
DFA接受的语言:如果一个句子x对于有限自动机M有 δ ( q 0 , x ) = p , p ∈ F \delta(q_0,x)=p,p\in F δ(q0,x)=p,p∈F,那么称句子x被M接受。被M接受的句子的全集称为由M定义的语言,或称M所接受的语言,记为 T ( M ) = { x ∣ δ ( q 0 , x ) ∈ F } T(M)=\{x|\delta(q_0,x)\in F\} T(M)={x∣δ(q0,x)∈F}。
状态变换图:
q 0 q_0 q0用带“开始”的箭头标注; F F F中的元素用双层圈标注; Σ \Sigma Σ中的元素写在箭头上;箭头表示的是 δ \delta δ中的元素; Q Q Q中的元素用圆圈表示。
即,存在一系列映射,使得输入句子x能与 q 0 q_0 q0 在最后映射到F中。
需要注意的是,有限控制器是从左到右进行的,因此判断顺序也是1 1 0 1 0 1。
NFA M是一个五元组: M = ( Σ , Q , δ , q 0 , F ) M=(\Sigma,Q,\delta,q_0,F) M=(Σ,Q,δ,q0,F),
Σ \Sigma Σ是输入符号的有穷集合,
Q是状态的有限集合,
q 0 ∈ Q q_0\in Q q0∈Q是初始状态,
F是终止状态集合, F ⊆ Q F\subseteq Q F⊆Q,
δ \delta δ是 Q Q Q与 Σ \Sigma Σ的直积 Q × Σ Q\times\Sigma Q×Σ到Q的幂集 2 Q 2^Q 2Q映射。(幂集:原集合中所有的子集)
NFA与DFA的区别是:在NFA中 δ ( q , a ) \delta(q,a) δ(q,a)是一个状态集合,而在DFA中 δ ( q , a ) \delta(q,a) δ(q,a)是一个状态。
也就是说,NFA M在状态q时,接受输入符号a时,M可以选择状态集合的幂集中的任何一个状态作为下一个状态,并将输入头向右边移动一个字符的位置。
NFA接受的语言:
如果存在一个状态p,有 p ∈ δ ( q 0 , x ) p\in\delta(q_0,x) p∈δ(q0,x)且 p ∈ F p\in F p∈F,则称句子x被NFA M所接受。被NFA M接受的所有句子的集合称为NFA M定义的语言,记作 T ( M ) = { x ∣ p ∈ δ ( q 0 , x ) 且 p ∈ F } T(M)=\{x|p\in\delta(q_0,x)且p\in F\} T(M)={x∣p∈δ(q0,x)且p∈F}。
定理:设L是被NFA所接受的语言,则存在一个DFA,它能够接受L。
因为该定理,所以无需区分NFA和DFA,统称为有限自动机(FA)
定理:若 G = ( V N , V T , P , S ) G=(V_N,V_T,P,S) G=(VN,VT,P,S)是一个正则文法,则存在一个 F A M = ( Σ , Q , δ , q 0 , F ) FA~M=(\Sigma,Q,\delta,q_0,F) FA M=(Σ,Q,δ,q0,F)使得 T ( M ) = L ( G ) T(M)=L(G) T(M)=L(G)。
定理:若 M = ( Σ , Q , δ , q 0 , F M=(\Sigma,Q,\delta,q_0,F M=(Σ,Q,δ,q0,F是一个有限自动机,则存在正则文法 G = ( V N , V T , P , S ) G=(V_N,V_T,P,S) G=(VN,VT,P,S),使得 L ( G ) = T ( M ) L(G)=T(M) L(G)=T(M)。
图灵机:
线性带限自动机:
找到和输入最接近的词汇。
Edit distance:两个字符串之间的编辑距离等于使一个字符串变成另外一个字符串而进行的插入、删除、替换或相邻字符交换位置而进行操作的最少次数。
F A R = ( Q , A , δ , q 0 , F ) FA~~R=(Q,A,\delta,q_0,F) FA R=(Q,A,δ,q0,F),如果 L ⊆ A ∗ L\subseteq A^* L⊆A∗表示有限状态机R定义的语言, t > 0 t\gt0 t>0为编辑距离的阈值,那么一个字符串 X [ m ] ∉ L X[m]\notin L X[m]∈/L能够被R识别的条件为存在非空集合:
C = { Y [ n ] ∣ Y [ n ] ∈ L , e d ( X [ m ] , Y [ n ] ) ≤ t } C=\{Y[n]|Y[n]\in L,ed(X[m],Y[n])\le t\} C={Y[n]∣Y[n]∈L,ed(X[m],Y[n])≤t}
FA/FSM(有限状态机)可以视为有向图(键树/数字查找树):
对一个输入串进行拼写检查的过程是在给定阈值内,寻找所有与输入串编辑距离小于t的路径。
为了尽早找到target,使用剪除距离更好一些。
剪除距离:
c u t e d ( X [ m ] , Y [ n ] ) = min l ≤ i ≤ u { e d ( X [ i ] , Y [ n ] ) } cuted(X[m],Y[n])=\min_{l\le i\le u}\{ed(X[i],Y[n])\} cuted(X[m],Y[n])=l≤i≤umin{ed(X[i],Y[n])}
其中, l = max ( 1 , n − t ) , u = min ( m , n + t ) l=\max(1,n-t),u=\min(m,n+t) l=max(1,n−t),u=min(m,n+t)
函数 c u t e d ( ⋅ ) cuted(\cdot) cuted(⋅)从X字符串中截取长度范围在l~u之间的字符串,并计算这些字符串与Y的编辑距离,取最小距离。
局部候选字符串Y由自动机从初始状态出发的一些连续弧上所对应的标记符号构成。
深度优先搜索:
X是我们拼写的单词,Y是扩展的单词。
FST(有限状态转换机,finite state transducer):与FSM相比,FST完成状态转移的同时产生一个输出,FSM只是状态的转移,不产生任何输出。
该应用举例如下:形容词heavy在英文句子中可能以三种不同的形式出现:原型、比较级和最高级。对于变形后的heavy,为了正确分析出其原型,可以通过构造FST的方法实现。