天天看点

李宏毅自然语言处理——依存句法分析

引言

我们前面介绍了成分句法分析,本文介绍另外一种方法——依存句法分析。

依存句法分析

李宏毅自然语言处理——依存句法分析

依存句法分析关注的是两个词汇之间的关系,这两个词汇不一定要相邻。上面这个例子里面, book和flight有紧密的关系,我们会用一个箭头来表示这种关系。箭头的起始词汇,我们叫head,指向的词汇叫dependent,那词汇之间有什么样的关系呢

具体有这么多关系,我们希望通过机器学习模型能帮我们找出来。

李宏毅自然语言处理——依存句法分析

依存句法分析具体来说,找到句子中词汇之间的关系,就是要把一个句子变成一个有向图结构。其中每个节点都是一个词汇,词汇之间的关系就代表节点之间的连线。

比如,“I want to study a PhD”,这个句子的句法分析结果是上面的样子。

“want”的主语是“I”,想要干啥呢,想要“study”,“study”什么,”PhD”。

这些词汇之间有关系的,就用箭头连起来。而箭头是有不同的形态的,代表词汇之间有什么样的关系。

你会发现,上面其实好像一个树结构,每个词汇都有一个父节点,而对于没有父节点的词汇,一般会加上ROOT。

在这个树中,每个词汇只会有一个箭头指向它,除了ROOT没有箭头指向它。而一个词汇可以指向很多不同的词汇,并且在这个树里面,每个词汇都有唯一一条路径,可以回溯到根节点。

那如何找出一个依存句法树呢

李宏毅自然语言处理——依存句法分析

其实方法很简单,回忆下我们之前学习的成分分析,输入一个span,判断是否为一个成分,如果是,则判断属于哪个标签。

而依存分析也是类似的,也是一个分类器,用于判断两个词汇之间有没有关系,如果有,是什么关系。

假设你真的训出来这样一个分类器,那要如何得到依存句法分析树呢

李宏毅自然语言处理——依存句法分析

要做的事情是,首先插入一个代表根节点的词汇“ROOT”,接下来把这些词汇两两丢到分类器里面去判断是否有关系。

比如输入“ROOT”和“want”,那么就要输出YES;

如果输入“to”和“a”,那么就要输出NO;

总共最多要跑次,就可以计算出所有的可能。

那在文献里面真的是这么做的吗

李宏毅自然语言处理——依存句法分析

真的是这么做的。上面贴出了两篇文献的做法,我们看其中18年的做法,用了双向LSTM对词汇进行编码,然后进行线性变换,变成一个新的词汇编码,然后右边的词汇编码,再进行线性变换,得到一个编码向量,左边得到的向量进行点乘,得到一个数值,根据这个数值来决定是否有关系。

李宏毅自然语言处理——依存句法分析

但是和成分分析一样,也可能会碰到矛盾的关系。比如,可能分类器告诉你可以指向;然后又告诉你也可以指向,这不是违背了每个节点只有一个父节点的约束吗

李宏毅自然语言处理——依存句法分析

所以可以用类似Maximum Spanning Tree(最大生成树)的方法来解,根据我们的分类器,我们可以知道所有节点,两两指向的分数,

然后此时,有两种可能,一个是ROOT指向,然后指向;

另一种是ROOT指向,然后指向。

李宏毅自然语言处理——依存句法分析

然后选择边上分数最高的情况。

李宏毅自然语言处理——依存句法分析

如果句子很长,和成分分析一样,我们也可以用Transition-based的方法来做依存句法分析。