cs224n-Lecture-6 依存分析

文章目录
  1. 1. 依存分析法的作用
  2. 2. 树库
  3. 3. 依存句法的思想是一个句法模型
    1. 3.1. 特征选择
    2. 3.2. 特征选择样例
    3. 3.3. 前馈神经网络模型(Feedforward Neural Network Model)

好几天没有学习,罪恶感深重,接着学接着学。
关于这讲,后续我打算把Manning老师的论文读一遍写个论文笔记再自己试试做做依存分析什么的。

语言学上对于描述语法有两种主流观点,其中一种是短语结构文法(constituency structures),另外一种是依存结构(dependency structures)。

弄清楚如何将短语结构应用于一些人类语言的句子中。
基本思想:句子和句子的一部分有一种结构,可以被用来以特定的方式组合起来。
举例:
the cat
a dog
上面两个词组看起来有一点结构性,有一个冠词,通常称之为限定词,这类短语被称为名词短语,用来描述事物,有一些规则可以用来扩展它们:
(1)可以在冠词和名词之间加一个形容词:the large dog 或者 a barking dog;
(2)可以在名词后添加介词短语:a large dog in a crate;

依存分析法的作用

通过找到句子当中每一个词所依赖的部分来描述句子结构。如果一个词修饰另一个词,或者,是另外一些词的一个论证,那么它就是这个词的依赖。
所以,在 a barking dog 中,barking 就是 dog 的依赖,因为 barking 修饰 dog。同理,a large barking dog 中,large 也是 dog 的修饰。

我们可以在词之间添加依存关系,通常使用箭头来表示它们之间的依存关系。

句子的语义模糊性可以认为是(多数是)以依存结构来看是什么修饰什么的问题。
这就变成了一个自然语言中的普通问题了,因为这里什么修饰什么的问题主导了许多关于解释的问题。

[董事会在每月例会上证实了多伦多皇家信托以每股27美元的收购。]
这个句子具有完整的句子结构,它有主语,动词,宾语,也就是 The board approved its acquisition,随后的内容都是介词短语,[by Royal Trustco Ltd.] 修饰的是 acquisition,[of Toronto] 修饰的是公司 Royal Trstco Limited,[for $27 a share] 修饰的是 acquisition,[at its monthly meeting] 修饰的是 approved,如下所示:

树库

在英语当中,如果你要指向同一个被修饰成分或者再往前找一个,这样就找到了一个嵌套关系。

树库给出了一种真实语言,具有完整的句法,在此基础上就可以做各种量化语言学方面的分析,依存树库使用了真实的覆盖面广的数据,而人们写规则时只是依靠对英语语法的直觉判断。人们容易考虑不周,所以依存树更容易找到所有可能发生的情况.

依存句法的思想是一个句法模型

即有一个词法项之间的关系或词之间的关系,只有词法项之间是二元的不对称关系,也就是说,我们在词法项之间画箭头,这些箭头被称为依存,全部内容是there is a dependency analysis of bills on ports on immigration were submitted by Senator Brownback,Republican of Kansas.
得到的句法依存树如下:

注:这里箭头的尾部是 head(被修饰的主题),箭头指向的是 dependent(修饰 语)。


通常会根据一些语法关系来给这些依存关系分类命名。


## 如何做依存分析
把句子中每个词都提出来,然后判断这些词的独立项或者头部是什么。一般来说,只需要一个词作为ROOT的依赖项(dependent)[ROOT 只能被一个词依赖],并且不希望有环出现,二者同时满足的话,就能保证生成一个依存树。

箭头不可能存在两两不相交的情况,大部分语言,包括英语,这些语言中绝大部分依存关系都是嵌套结构,并且有着线性顺序,如果一个依存树是完全嵌套的,那它陈伟投影依存树。可以把它投射到一个平面上,然后得到一个嵌套关系。英语中也有少数结构是非嵌套的,并且存在交叉。

用来做依存分析的四种方法:
1.动态编程法(Dynamic Programming);
2.图算法(Graph Algorithm);
3.约束补偿(Contraint Satisfaction);
4.基于转换的解析(Transition-based parsing);


## 依存分析的主要方法

假如有一个需要进行依存分析的句子和一些分析用的规则:


下面给出对应的句子:


开始分析:
有两个东西,一个栈(stack)[灰色框],任意句子开始分析时都放到这个堆栈上,就是这个root标志,栈的顶端在右面,然后我们还有一个称作缓冲的东西[橙色框]。
缓冲就是需要处理的句子,将缓冲左端作为缓冲的顶部,因为要拿掉多余的词,所以它们的顶部就是它们的交界点,在这个基于转换的模式下做依存分析,有三种操作:
1.shift;
2.left-arc;
3.right-arc;
要做的第一个操作是shift:
shift要做的就是取缓冲区顶部词,然后把它放到栈(stack)顶部,如下所示:

然后再做一次shift处理,将缓冲顶部的词挪到堆顶部:


left-arc 和 right-arc做的事情是通过在左侧或右侧添加词作为依赖项(dependent)来附加判断。
对 left-arc 做的事情是:我们说栈中第二个顶部元素是栈的顶部元素的依赖项(dependent),即 I 是 ate 的依赖项(dependent), 然后把这个依赖项(dependent)从这个栈中拿走,这就是 left-arc 操作:

下面再做一次shift,把fish放到栈里:

对 right-arc ,规定栈的顶部元素是栈的第二顶部元素的一个依赖项(dependent),把顶部项移走之后增加一个弧,比如:fish 是 ate 的依赖项(dependent)具体操作如下:

再做一次right-arc,即 ate 是 root 的依赖项。


将 ate 从堆中弹出,然后就只剩下 root 在堆中,我们就得到了一个新的依存关系,就是 ate 是 root 的依赖项(dependent)。
最后,栈(stack)里只有一个 root 缓冲为空,这就是正确分析句子后想要达到的一个状态。

在实际情况中,无论任何时候使用基于转换的依存分析方法,都会有一定的内容存在于栈中。
Nivre提出需要做一个机器学习的分类器,鉴于已经有树库来做句子的分析,那就可以用这些句子的分析来看哪种操作序列给出正确的句子分析。
简而言之,假如你有一个经过树库标注的句子,就可以完成上述 shift,left-arc,right-arc的操作,因为这个操作序列是唯一的,对于每个树库来说都有一个操作序列给出一个正确的句子结构。[Nivre等人使用卷积机器学习分类器]

## 使用什么来做特征

在传统模型中,会把所有的词都考虑进去,然后看栈顶端的词是什么,那个词的词性是什么,缓冲的第一个词是什么,它的词性是什么,再看一下栈顶的词之后的词是一件好事,是什么词,词性是什么,并且在缓冲区做同样的事,所以你在看一堆词,看这些词的归属,比如词性,这就给了你一堆特征,这就是传统机器学习中经典的稀疏特征。人们通过这些特征来构建分类器。

最简单的模型是Nivre发明的,NO search 模型。
仅仅拿到下一个词,然后测试分类器,比如:这个是动词的宾语,下个词是名词性修饰语,然后继续做出这些判断。

## 依存分析的评估

假如给定如下的句子:

依存分析的评估方法就是,对每个词我们都说它的依赖项是什么,实际做的是选择每个词的依赖项是什么,从树库中得到的答案如下:

通常有两种方式来进行评估:
1.仅看箭头,忽略标签(UAS),未标记准确率;
2.使用标签,并且规定只有当标签正确时结果才是正确的(LAS)。

## 神经依存分析(Neural Dependency Parsing)

这个部分的主要内容来自Manning的论文,此处的笔记过多的写详细内容,后续会进行相应的补充。

课程主要讨论的是基于转换的贪心神经依存分析器(greedy, transition-based neural dependency parsers),这种方法已经证实比传统的特征判别依存分析器( traditional
feature-based discriminative dependency parsers)更好且更高效。课程中讨论的模型和先前的各类模型相比是依赖于密集特征表示,而不是稀疏特征表示。

转换主要使用arc-standard,即上述栈表示的依存转换方法。最终,该模型的目的是预测从某个初始配置c到终端配置的转换序列,其中对依赖解析树进行编码。由于该模型是贪婪的,它试图根据从当前配置c=(δ,β,A)中提取的特征,一次正确地预测一个转换T∈{Shift、Left-Arc、Rid-Arc}。定义,δ是栈,β是缓冲,A是给定句子的依赖弧(dependency arcs)。

特征选择

由于期望模型的复杂性,定义神经网络的输入时具有灵活性。一个给定的句子S通常包含某些子集(some subset):

对于每一个特征累心难过,我们都有一个对应的嵌入矩阵,通过特征的one-hot编码的映射到一个d维的密集向量表示。嵌入矩阵Sword是E^w∈R^dxNw,其中Nw是词典的大小。相应地,POS和标签嵌入矩阵是 E^t∈R^dxNt 以及 E^l∈R^dxNl,其中 Nt 和 Nl 是 POS标签(tags)和arc labels。
放一段原文(来自cs224n 2017年版讲义)来对应一下符号问题:

最后,将每组特征中选择的元素数分别表示为 nword 、 ntag 和 nLabel 。

特征选择样例

1.Sword:栈顶和缓冲区顶部的三个词汇:s1,s2,s3,b1,b2,b3。堆栈中前两个单词的第一个和第二个最左/最右边的子单词:lc1(si),rc1(si),lc2(si),rc2(si),i=1,2。最左边/最右边的两个单词最左边/最右边的两个单词在堆栈上:lc1(lc1(si)),rc1(rc1(si)),i=1,2。所以,Sword总的包含nw有18个元素。
2.Stag:对应POS tags的Stag,所以nt=18。
3.Slabel:对应单词的弧标签,不包括堆栈/缓冲区中的这6个单词(nl=12)。
老规矩,放原图:

请注意,对于不存在的元素,我们使用了一个特殊的Null令牌:当堆栈和缓冲区为空或尚未被赋值时。对于一个给定的句子样例,我们选择这个词,提供上面定义的示意图的pos标签(POS tags)和弧标签(arc labels),通过嵌入矩阵E^w,E^t和E^l生成对应的密集特征表示,然后将这些向量放入输入中 [x^w,x^t,x^l]。在训练时,反向传播到密集向量表示,以及在后面的层参数。

前馈神经网络模型(Feedforward Neural Network Model)

这个神经网络包含了一个输入层 [x^w,x^t,x^l],一个隐藏层,还有一个softmax层附带一个交叉损失函数。具体结构如下: