文章目录
句法分析 (Parsing, Syntactic Analysis) 是自然语言处理(以下都简称 NLP)领域最核心的技术之一,旨在分析一个句子的语法结构、成分和词语之间的依存关系,是语法校验、语义解释、对话理解、机器翻译等应用的基础。
句法分析一般会分为成分句法分析 (Constituency Parsing) 与依存句法分析 (Dependency Parsing) ,借助下图可以清晰地看出两者区别:
图1 成分与依存句法分析产生的语法树的对比[1]
前者基于词语结构的文法,后者通过词语间的语法关系的文法。通俗理解就是,前者是从一个句子、分解为若干个词语组、最后到分解到一个单词,建立语法结构分析;后者是通过词语之间的语言学联系,建立语法结构分析。
下面将分别详述两种句法分析的经典算法(第一种内容较多)
一、成分句法分析
1. 上下文无关文法
Context-Free Grammar (以下简称 CFG),是描述计算机程序语言和自然语言非常有效的语法。本质上,CFG 是描述语言语法结构的一组形式规则。对于程序语言,这种语法很适用,但我们都知道,人类使用的自然语言,是上下文有关的。那么为什么要用这种不符合现实的语法呢?
以我的理解,因为 NLP 本质上还是用计算机语言去处理自然语言,必须基于机器能懂的语法去扩展。很多编程语言都是 CFG。当然用上下文有关文法去处理也可以,但这里面涉及到程序语言设计的复杂度、可扩展性、处理效率等因素,是一个综合权衡的结果。
那么,接下来就看看 CFG 在数学上的定义。通常可被定义为四个要素:
G={N, T, R, S}
- 非终结符 (Non-terminal) 集合 N。 在 NLP 中一般为词性 (Part-of-Speech) 的集合,如名词、动词、形容词等;
- 终结符 (Terminal) 集合 T。 在 NLP 中一般为一个词汇表;
- 推导规则 (Rules of Productions) 集合 R。 形式为 A → β,其中 A 必须为 单独一个非终结符 ,而 β 可以由非终结符或/与终结符自由组合而成,β ∈ (N ∪ T)*
- 起始符号 S,S 属于非终结符。
最终得出的语法结构分析的形式有多种,最常见的是语法树,下面举一个具体的例子:
图2 CFG 句子分析的简单例子
当然,在实际情况中,集合 T 会是一个非常庞大的词汇表。
运用 CFG 做句法分析,其实就是对每个输入的字符串(即句子),搜索并赋予合适的语法结构,如上图的语法树。那么,CFG 具体是怎么完成这个任务的呢?
最基础的 Parsing 搜索算法有两种,自顶向下和自底向上算法 (Top-down/Bottom-up Parsing)
图3 自顶向下搜索的核心流程
如上图3,自顶向下算法。
步骤1:从根节点开始,根据文法规则,优先扩展当前最左侧的非终结符;
步骤2:NP 有两种扩展模式,如果选择了 Det NP ,那么无法与第一个终结符(单词 ‘I’)匹配,回溯至上一层 NP;
步骤3:NP 扩展为 Pron,然后匹配到了终结符(单词 ‘I’),回溯,从左到右对下一个未进行扩展的终结符进行相似的处理。
直至最后,所有的终结符(单词)都被匹配到了,终止流程。
图4 自底向上搜索的核心流程
如上图4,自底向上算法。
步骤1:从第一个输入的终结符开始,根据文法规则,向上匹配非终结符;
步骤2:,因为有 N → Pron 的规则,所以 Pron 可以直接向上匹配。但再往上就没有规则匹配了,因此处理下一个输入符;
步骤3:,第2个输入符也向上匹配终结符,但 NP 和 V 没有可组合的文法规则,因此继续推进下一个输入符;
直到扫描到最后两个单词,对应的 adj 和 N 可以组成 NP,然后 Det 和 NP 组成 NP,以此类推,最后可以组成相同的语法树。
两者对比
Top-down 会浪费较多时间在探索不能匹配到输入句子的情况上,如图3步骤2;Bottom-up 可能会得出不符合真实语法的语法树(即错误判断句子的语法结构和部分词语的词性)。在这两点上,两者互相避免了对方的情况。
此外,Top-down 还有以下缺点:
-
当出现类似 NP → Det NP 这种文法规则,如果句子较长以及文法规则较多,那么很有可能会出现无限递归的情况;
-
无法处理不合语法规则的句子。
而这两种基础的算法,还有共同的缺陷:
-
由于不牵涉任何语义层面处理,因此无法处理 句子歧义 问题,即同一