文章目录
- 1 什么是Constituency Parsing
- 2 解决方案
- 2.1 Chart-based Approach
- 2.2 Transition-based Approach
- 2.3 Grammer as Foreign Language
本文为李弘毅老师【Deep Learning for Constituency Parsing】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。
下文中用到的图片均来自于李宏毅老师的PPT,若有侵权,必定删除。
文章索引:
上篇 - 7-7 Deep Learning for Coreference Resolution
下篇 - 7-9 Deep Learning for Dependency Parsing
总目录
1 什么是Constituency Parsing
Constituency parsing要做的事情就是解析出句子中所有的constituents。constituent在英文字典中的意思是“成分”,而在我们这次的这个场景中可以理解为句子中的一个“单元”。比如下面这句话中,“deep learning"就是一个constituent,“very powerful"也是一个constituent,甚至每一个单词都是一个"constituent”。但是"learning is very"这样狗屁不通的句子就不是"constituent”。一种感性的理解,只要读的通的,就是"constituent"。
每个constituent在语言学中都有对应的专有名词(POS tags),比如"deep learning"就是NP(Noun phrase),"very power"就是ADJP(Adjective phrase)等等。多个constituents可以组成一个更大的constituent。这也就构成了一棵树的结构,每个节点都是我们要找的constituent。为了简化,本文只考虑二叉树的情况。
那么,到底有哪些constituents呢?可见下表。
2 解决方案
用deep learning的方法来解决Constituency Parsing的问题有两个方案,一个是Chart-based Approach,另一个是Transition-based Approach。
2.1 Chart-based Approach
chart-based方法很直接,就是遍历句子里的所有spans,然后对每个span做两次分类,先推测这个span是不是一个constituent,如果是的话,再推测这个constituent的词性是什么。
模型的结构和上一篇中的Coreference Resolution很像。就是把整个句子过一个预训练的模型,然后对模型的输出取一个感兴趣的span,抽取这个span的特征,再送入刚才说的两个分类器当中。
如果要遍历所有的span的话,就要遍历N(N-1)/2次,这样做会有一个大问题,就是当模型认为"deep learning is"和"is very powerful"都是constiuent的时候,模型就自相矛盾了。
所以,实际情况下,并不是去遍历所有的spans,而是去遍历所有的树结构。然后取总置信度最高的那棵树来作为最终的那棵树。而去遍历所有的树的时候,会有许多需要重复计算的子节点,这就是一个典型的动态规划问题了。有个叫做CKY的算法就是来解决遍历树这个问题的。
2.2 Transition-based Approach
Transition-based方法有三个状态,一个叫做stack,用来存储已经操作过的元素;一个叫做buffer,用来存储还未操作的句子;还有一个叫做actions,表示着可以采取的动作。动作有"create",“shift"和"reduce"三种。“create"表示一个词性的开始,将移入stack当中,比如NP从这个位置开始。“shift"表示将buffer中的一个单词移入stack当中。“reduce"表示一个词性的结束,结束符也将移入stack当中。
比如下图当中,每一步采取的action在下半图,每一个action的结果将保存在上半图的stack当中。首先create了一个”(s"表示"s"从这里开始,然后create了一个”(NP"表示"NP"从这里开始,接着两个shift,把"deep"和"learning"放入stack当中,接着一个"reduce”,表示"NP"的结束,即"deep learning"是一个"NP”,以此类推,直到全部结束。
这个方法的网络结构如下,就是将"stack","previous actions"和"buffer"分别过一个RNN,然后将这三个结果再一起过一个分类网络,输出要采取什么action,接着根据action更新状态,如此循环,直到结束。
看到有action,很多人可能会联想到强化学习,难道训练的时候要用强化学习的方法吗?不用!这就是一个简单的分类任务。因为我们的ground truth明确地告诉了我们这一步要输出什么action,所以只要每一步做分类就可以了。
2.3 Grammer as Foreign Language
还有一种直接用seq2seq的方法去做的,这种方法的关键就在于构造输出的结果是什么。一种构造方法如下图所示,自顶向下,由左向右,构造出来的和刚才Transition-based Approach的简直一模一样。只不过这里是直接用seq2seq去做的。