本篇为课程CS224N Lecture5的笔记。课程主页见CS224N Winter2019,b站视频搬运见(2019)斯坦福CS224n深度学习自然语言处理课程 by Chris Manning 。之前的笔记可以参考专栏从零开始NLP学习 。
目录
- 句法结构
- 依存结构
- 依存句法分析
- 神经句法依存分析模型
1 句法结构
为什么我们需要了解句子的结构呢?人类通过将单词进行组合得到相对复杂的语言单元来进行表达。语言作为一种信息传递方式,只有理解了句子的结构才能正确地对语言进行解释,才有可能解读出语言真正想要表达的信息。
主流研究句法结构的视角分为两种:
- 成分结构(constituency structure)
- 依存结构(dependency structure)
1.1 成分结构
成分结构,也可以称之为词组结构语法(phrase structure grammar),其核心思想是将单词嵌套地组成词组成分,再不断地将小的词组成分合成为更大的语言成分。以下面的句子为例:
其中,
虽然这种结构非常流行,但是这种视角不是本节课的重点。
2 依存句法结构
不同于成分结构,依存结构着重于词法单元之间的依赖关系。以下面的句子为例:
它的依存结构如下:
2.1 歧义
有的时候同一个句子可能会拥有多个不同的依存结构,导致一个句子的意思可以有多种解释。常见歧义有如下几种:
- 介词词组连接歧义
- 连词词组范围歧义
- 形容修饰词歧义
- 动词词组连接歧义
关于介词词组连接歧义,可以观察如下例子:
类似的,对于连词词组范围歧义,可以通过下面的例子进行理解:
2.2 依存关系语法与依存关系结构
前面提到,依存结构着重于词法单元之间的依赖关系;依存结构句法假设句子结构是由词法单元之间的关系所构成的,这种词法单元之间的关系(dependencies)用单向箭头来进行表示。词与词之间的复杂关系往往能最终形成树形的结构,称为依存树。关系箭头上常常会标明关系的名称。例子如下图所示:
通常,箭头的起始单词被称为头(head),箭头指向的单词被称为尾(dependent)。
正式的说,依存句法分析问题希望得到一个从句子
- 学习问题:给定经过依存树标注的句子训练集
(例如一个树库,后面会提到),我们希望得到一个可以利用依存语法对新句子进行分析的模型
- 分析问题:给定模型
与句子,利用模型推导得到句子的最优依存树
此外,有两点需要注意:
- 不同流派可能会按照不同的规则来标注箭头;重点不在于如何标注,而是保持前后规则一致
- 通常可以给句子添加一个虚假的起始节点,使原句中每个单词都成为某个其他节点的尾;此时句子的输入表示从原来的
变为,为起始节点
2.3 有标注数据集:Treebank
依存树库是一个经过标注的句子数据集,该数据集为每个句子标注了一个对应的依存句法树。构建一个依存树库(Treebanks)似乎是费力不讨好的,但事实恰恰相反:
- 依存树库是可重复使用的,一旦构建完成,许多下游任务就可以基于现有的树库进行开发
- 给出了相对权威的标注,当一个句子有歧义时,可以以树库给出的标注为准
- 可以用于评估部分NLP系统
- 依存树本身内含了很多信息,包括频率信息,分布信息等等
已有的依存树库资源:Universal dependencies treebanks
3 依存句法分析
下面的部分将会介绍如何构建一个依存句法分析模型来对句子进行依存句法分析。
3.1 经验与规则
依存句法模型的构建需要依赖于一些人类直觉与经验,比如以下几条:
- 听起来合理(例如在词组
中,就是一个听起来很合理的依存关系,而关系则显得不合理)
- 依存距离短(大部分依存关系都存在于相邻或者附近的单词之间)
- 依存关系往往不会跨越动词或者标点符号
- 一个头节点对应合理数目的尾节点
依存句法分析进行的方式是为每个单词(将其视为头节点)找到其对应的尾节点(该分析过程包括了对
-
只能有一个单词作为其尾节点
- 依存树中不允许出现环,即不允许出现
的情况
此外,构建模型时还需要考虑是否应该允许依存关系相互交叉,例如下图的情况:
此处,关系
3.2 依存分析模型的评估标准
依存句法分析的准确率公式如下:
- 带标签的依存关系准确率(Labeled Attachment Score,LAS)
- 无标签的依存关系准确率(Unlabeled Attachment Score,UAS)
对于带标签的依存关系准确率,该标准既考虑依存关系的头尾以及方向是否正确,又考虑了依存关系相对应的关系种类标签是否正确;对于无标签的依存关系准确率,该标准只考虑依存关系本身是否有误。以句子
而由模型给出的标注如下:
那么
3.3 传统的基于状态转移的模型
基于状态转移的句法分析模型是基于状态机模型进行构造的。该模型包含了一系列中间状态、起始状态、终止状态以及状态之间的转换。给定句子
-
代表栈,其中包含来源于句子的单词
-
代表缓冲区,其中包含来源于句子的单词
-
是一个依存关系的集合,其中的关系形如,此处表示来源于句子的单词,表示依存关系的类型
分别定义起始状态与终止状态如下:
- 起始状态
形如,此时栈中只有起始节点,其他所有句子中的单词都在缓冲区中,集合中目前不存在任何依存关系,因此为空集
- 终止状态
形如,此时缓冲区中没有单词,表明句子中的所有单词都经过了模型的处理,栈中只有起始节点
此外,还需要定义模型的状态转移;该模型有如下三种状态转移方式:
-
:当缓冲区非空的时候,SHIFT操作将缓冲区的第一个单词取出并将其放置在栈的顶部
-
:设栈顶部的单词为,顶部之下的单词为;当栈内单词大于等于两个且不为时,操作将依存关系加入到关系集合中,并将单词从栈中移除
-
:设栈顶部的单词为,顶部之下的单词为;当栈内单词大于等于两个时,操作将依存关系加入到关系集合中,并将单词从栈中移除
以句子
- 设定起始状态
- 进行
操作,状态变为
- 进行
操作,状态变为
- 进行
操作,状态变为
- 进行
操作,状态变为
- 进行
操作,状态变为
- 进行
操作,状态变为
- 此时模型到达终止状态,解析结束
上述模型以及例子并没有告诉我们状态转移时模型是靠什么来进行决策的;假如我们的模型没有一个合理的决策器来确定每一步的状态转移,那么每个中间状态都有可能有多个可选的后续状态,则该模型是非确定的(nondeterministic)。为了得到一个确定的(deterministic)模型,Nivre以及Scholz提出使用memory-based学习方法得到对应的决策器。这一部分不是本节课的重点,详情可以参考他们于2003年发表的论文[1]。此外,Nivre和Hall[2]于2005年提出使用机器学习方法训练状态转移决策器,训练得到的决策器会对当前状态的下一步进行预测。此方法在当时并非效果最好的方法,但其优势在于相对较快的运行速度(解析耗时为
4 神经句法依存分析模型
前面提到的传统模型使用机器学习方法训练得到决策器来决定每一步该如何进行状态转移。尽管这类方法运行较快且效果较好,但是它们仍然存在不足:
- 稀疏性,即传统方法的决策器使用的特征是高度稀疏的(比如one-hot向量以及tf-idf向量)
- 不完整性,即无法完美的量化句子所包含的所有信息;相较之后提出的方法,传统方法在这方面做的更差
- 特征计算十分昂贵,即决策器计算特征向量的过程需要花费相对较多的计算资源以及时间;在Chen和Manning所做的实验中,模型95%的运行时间都花在了构建特征上,而非预测
Chen和Manning[3]提出地神经依存分析模型较好地解决或者缓解了上述问题。该模型与传统的基于状态转移的模型类似,仅是在状态转移决策器部分存在较大区别。对于稀疏性,神经依存分析模型利用低维稠密的分布式向量对特征进行表示;对于不完整性,神经依存分析模型将单词、词性标签以及依存类别标签的分布式向量表示进行拼接作为神经网络模型的输入,这种方式所包含的信息量更大,也更加准确;对于传统方法特征计算昂贵的问题,神经网络方法表现出了相对更好的效率:相比于传统的方法,神经依存模型的效果更好,同时计算速度更快(这是由于神经依存模型所使用的特征的向量维度一般只有50-300维,相较于机器学习方法动辄百万维的特征表示,计算起来迅速多了)。对比数据如下:
下面将描述神经依存模型的细节。首先是模型的输入。前面提到,神经依存模型利用低维稠密的分布式向量对特征进行表示;此处的特征不仅仅包含字典中单词所对应的向量,也包含了词性标签
对于该中间状态,神经依存模型所需的输入特征如下:
模型后续部分并不复杂,如下图所示:
拼接起来的输入经过一个隐藏层的变换之后通过
参考
- ^Deterministic Dependency Parsing of English Text https://www.aclweb.org/anthology/C04-1010.pdf
- ^abMaltParser: A Data-Driven Parser-Generator for Dependency Parsing http://lrec-conf.org/proceedings/lrec2006/pdf/162_pdf.pdf
- ^A Fast and Accurate Dependency Parser using Neural Networks https://www.aclweb.org/anthology/D14-1082.pdf