李宏毅老师2020新课深度学习与人类语言处理课程主页:
http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html
视频链接地址:
https://www.bilibili.com/video/BV1RE411g7rQ
图片均截自课程PPT、且已得到李宏毅老师的许可:)
考虑到部分英文术语的不易理解性,因此笔记尽可能在标题后加中文辅助理解,虽然这样看起来会乱一些,但更好读者理解,以及文章内部较少使用英文术语或者即使用英文也会加中文注释,望见谅
深度学习与人类语言处理 P27 系列文章目录
前言
在前一篇中我们学习到了 Constituency Parsing 成分句法分析将讲解任务的基本概念、训练目标以及常用的两种解法,和深度学习在这些解法中的使用。
而在本篇P27 和 上一篇P26,我们进入了 Parsing 句法分析,
在本篇P27中将讲解
Dependency Parsing 依存句法分析:找出句子中词的依赖关系
在上一篇P26中讲解了
Constituency Parsing 成分句法分析:把句子组织成短语的形式
本篇,我们将学习到Dependency Parsing 依存句法分析:找出句子中词的依赖关系。我们将学到依存句法分析的基本概念:关系、依存句法树和抽象化的训练任务,以及与成分句法分析类似的方法等。
I Dependency Parsing
1.1 Constituency Parsing & Dependency Parsing 两种句法分析
在上一篇我们已经讲过Constituency Parsing 成分句法分析:找出句中所有的constituents 组成成分和 每种组成成分的类别。
而本篇要讲的 Dependency Parsing 依存句法分析:找出句子中词的依赖关系,关注的是两个词汇之间的关系,而这两个词汇不一定要相邻,如上图中的book和flight。
在这其中,两个词汇间的关联又有各式各样的关系,我们会用一个箭头来表示这个关系,箭头起始的词叫做head,指向的词叫做dependent
1.2 Relations 关系
词汇和词汇间的关系有很多种,如上图
1.3 Dependency Parsing Tree 依存句法树
Dependency Parsing 依存句法分析,其实就是找出词汇和词汇间的关系。
具体而言,就是把一个句子变成一个Directed graph有向图,即node节点和节点间是有箭头连起来的,是有方向的连接。每个词汇就是节点,词汇和词汇间的关系就是箭头(有向边)。
举一个具体的例子,如上图,我们要对“I want to study a PhD”一句做依存句法分析,我们将每一个词汇用一个节点表示,如上图的黄框框。接下来,节点和节点间有关系的会被连在一起,比如说want的主语是I:want指向I、want想要做的是study:want指向study、study想学的是PhD:study指向PhD等等,而箭头上是有一个标记的,这个标记便是词汇和词汇的关系。
这个依存句法树,有向图就是我们要用机器学习方法找出来的东西。那我们该怎么找出这棵依存句法树呢?
1.4 Task abstraction 任务抽象化
Constituency Parsing 成分句法分析 和 Dependency Parsing 依存句法分析两者大同小异,训练目标几乎都是一样的,只不过是输入部分组成形式不同而已:
成分句法分析的输入是相邻的一段词汇段span,训练目标是判断这个词汇段span是否是一个组成成分,二分类任务。如果是一个组成成分,再判断这个组成成分的类别,多分类任务。
依存句法分析的输入是任意两个词汇,训练目标是判断这两个词汇间是否有关系,即左侧的词汇应不应该指到右侧的词汇,二分类任务。如果有关系,再判断是什么关系,多分类任务。
II Approach 解法
依存句法分析的解法和成分句法分析的解法可称一模一样,都是两种解法:基于图的方法和基于转变的方法
2.1 Graph-based 基于图的方法
2.1.1 Classifier 分类器
那我们该怎么训练出来一个分类器,并怎样通过这个分类器得到一个Dependency Parsing Tree依存句法树呢?
要做的事请,如上图,我们有N个词汇,当然还要多加一个token,表示ROOT代表根节点。接下来把这些N个词汇和ROOT两两丢到分类器里面,判断左边的输入应不应该指到右边的这个输入,举例来说,左边输入是ROOT和want,因为我们在训练的时候是知道正确答案的,故分类器应该判断为YES。每一个token要和其他所有token判断一次,N次,一共有N+1个token,故一共要跑N(N+1)次分类器即可训练完成。但其实也是可以做类似剪枝的操作的,如ROOT只能指向其他token,且只要判断出指向哪个token后,就不需要接着进行判断了。
如果我们单纯把依存句法分析看作分类问题,和成分句法分析一样,也可能会出现这样的问题。
2.1.2 Problem 问题
如果仅仅当作分类问题,我们最终可能会得到不是树的东西,如上图,我们可能将w1和w2判断为w1应该指向w2,之后,又将w2和w3判断为w3应该指向w2。这样显然是不合法的树状结构。
所以该怎么办呢?我们可以用这样的一种方法来解决。其实我们在讲成分句法分析也遇到了类似的上述问题,也就是上一篇,我们就用CKY的算法来解。
2.1.3 Maximum Spanning Tree 最大分数树
根据我们训练好的分类器,我们可以知道所有的节点两两连在一起的分数。接下来,穷举所有合乎规则的依存句法树,如上图,右上的树分数为0.2 * 0.3 = 0.06,右下的树分数为0.9 * 0.7 = 0.63 ,显然右下这棵树更有可能是一颗合理正确的依存句法树。
2.2 Transition-based 基于转变的解法
还记得上篇,我们在讲成分句法分析时,也是有这种方法,有三个部分组成:Stack 栈、Buffer 缓存区和Action 命令,命令又分为CREATE(X)、SHIFT和REDUCE。
2.2.1 Modules 模块
同样和成分句法分析的三个组成模块一样:
- Stack 栈;
- Buffer 缓存区;
- Actions 命令;
在操作开始,Stack 栈为空,Buffer 缓存区保存着输入的整个句子,然后我们只要不断地采取一连串的Action 命令最后得到一个依存句法树。具体过程请参见上一篇,不再阐述。
2.2.2 Literature 文献方法
在文献上有很多这样的方法,基本思想都是,用RNN把Stack S、Buffer B和已经完成的命令Action A读入,都表示成一个个的向量。再用一个网络来输入这三个向量,进行多分类决定下一步应该采取的Action 命令,并更新Stack 栈和 Buffer 缓存区的内容。
2.2.3 SyntaxNet 最知名的方法
在各种Transition-based 基于转变的方法中,SyntaxNet是最知名的方法,老师觉得它最知名的原因有两个,其一是它是Google发表的,其二它有个好的可视化,一个动画讲解这种方法:
动画链接:https://ai.googleblog.com/2016/05/announcing-syntaxnet-worlds-most.html
注意SyntaxNet的年份是2016年,一个AlphaGo的年代,那时和AI相关的东西都使人们觉得很神奇,当然后来也有很多比SyntaxNet更好的基于转变的方法,比如Stack Pointer如上图。
至此有关句法分析的相关内容到此结束,你可能会问为什么我们要单独讲两种句法分析:成分句法分析和依存性句法分析呢?因为在老师的NLP任务分类中,句法分析任务是属于其他类的,它看上去是一种很复杂不规则的任务,但在我们了解明晰句法分析的训练目标、模型方法后其实句法分析也不是特别的困难。