> 文档中心 > 【2019斯坦福CS224N笔记】(4)Linguistic Structure Dependency Parsing

【2019斯坦福CS224N笔记】(4)Linguistic Structure Dependency Parsing


Dependency Parsing: 依存关系语法分析,简称 依存分析。

1、句法结构(syntactic structure)分析的主要有两种方式

与编译器中的解析树类似,NLP中的解析树用于分析句子的句法结构。使用的结构主要有两种类型——constituency和dependency。

Constituency Grammar:使用短语结构语法将单词放入嵌套的组件中。

Constituency = phrase structure grammar = context-free grammars (CFGs)

context-free grammars (CFGs) 上下文无关语法

句子是使用逐步嵌套的单元构建的

  • 短语结构将单词组织成嵌套的成分
  • 起步单元:单词被赋予一个类别 (part of speech=pos 词性)
  • 单词组合成不同类别的短语
  • 短语可以递归地组合成更大的短语

Dependency Parsing:句子的从属结构显示哪些词依赖于(修饰或是)哪些词。这些单词之间的二元非对称关系称为依赖关系,并被描述为从head到dependent。通常这些依赖关系形成一个树结构。经常用语法关系的名称进行分类(主语,介词宾语,同位语等)。有时会将假根节点作为head添加到树中,所以每个单词都依赖于一个节点。

  • \text{look} 是整个句子的根源, \text{look} 依赖于 \text{crate} (或者说 \text{crate} 是 \text{look} 的依赖)
    • \text{in, the, large} 都是 \text{crate} 的依赖
    • \text{in the kitchen} 是 \text{crate} 的修饰
    • \text{in, the} 都是 \text{kitchen} 的依赖
    • \text{by the door} 是 \text{crate} 的依赖

为什么我们需要句子结构?

  • 为了能够正确地解释语言,我们需要理解句子结构
  • 人类通过将单词组合成更大的单元来传达复杂的意思,从而交流复杂的思想
  • 我们需要知道什么与什么相关联
    • 除非我们知道哪些词是其他词的参数或修饰词,否则我们无法弄清楚句子是什么意思

2. Dependency Grammar and Dependency Structure(依赖语法和依赖结构) 

关联语法假设句法结构包括词汇项之间的关系,通常是二元不对称关系(“箭头”),称为依赖关系

Dependency Structure有两种表现形式:

  • 一种是直接在句子上标出依存关系箭头及语法关系

  • 另一种是将其做成树状机构(Dependency Tree Graph)

箭头通常标记(type)为语法关系的名称(主题、介词对象、apposition等)。

依赖关系标签的系统,例如 universal dependency 通用依赖

箭头连接头部(head)(调速器,上级,regent)和一个依赖(修饰词,下级,下属):A \to 依赖于 A 的事情

通常,依赖关系形成一棵树(单头 无环 连接图)

Dependency Parsing

  • 通过为每个单词选择它所依赖的其他单词(包括根)来解析一个句子
  • 通常有一些限制
    • 只有一个单词是依赖于根的
    • 不存在循环 A \to B, B \to A
  • 这使得依赖项成为树
  • 最后一个问题是箭头是否可以交叉(非投影的 non-projective)
    • 没有交叉的就是non-projectice

 Projectivity

  • 定义:当单词按线性顺序排列时,没有交叉的依赖弧,所有的弧都在单词的上方
  • 与CFG树并行的依赖关系必须是投影的
    • 通过将每个类别的一个子类别作为头来形成依赖关系
  • 但是依赖理论通常允许非投射结构来解释移位的成分
    • 如果没有这些非投射依赖关系,就不可能很容易获得某些结构的语义

3、基于贪婪的转换的解析【nivre 2003】

  • 贪婪判别依赖解析器 greedy discriminative dependency parser 的一种简单形式
  • 解析器执行一系列自底向上的操作
    • 大致类似于shift-reduce解析器中的“shift”或“reduce”,但“reduce”操作专门用于创建头在左或右的依赖项
  • 解析器如下:
    • 栈 \sigma 以 ROOT 符号开始,由若干 w_i 组成
    • 缓存 \beta 以输入序列开始,由若干 w_i 组成
    • 一个依存弧的集合 A ,一开始为空。每条边的形式是 (w_i,r,w_j) ,其中 r 描述了节点的依存关系
    • 一组操作
  • 最终目标是 \sigma = [\text{ROOT}], \beta = \phi ,A 包含了所有的依存弧

 Basic transition-based dependency parser

Transition-based Dependency Parsing可以看做是state machine,对于 S=w_{0}w_{1}...w_{n} ,state由三部分构成  (\sigma ,\beta ,A) 。

\sigma 是 S 中若干 w_{i} 构成的stack。

\beta 是 S 中若干 w_{i} 构成的buffer。

A 是dependency arc 构成的集合,每一条边的形式是 (w_{i},r,w_{j}) ,其中r描述了节点的依存关系如动宾关系等。

初始状态时, \sigma 仅包含ROOT  w_{0}\beta  包含了所有的单词  w_{1}...w_{n} ,而 A 是空集 \phi 。最终的目标是 \sigma包含ROOT w_{0}, \beta 清空,而 A 包含了所有的dependency arc, A就是我们想要的描述Dependency的结果。

state之间的transition有三类:

  • SHIFT:将buffer中的第一个词移出并放到stack上。
  • LEFT-ARC:将 (w_{i},r,w_{j})  加入边的集合 A,其中 w_{i} 是stack上的次顶层的词,w_{j}是stack上的最顶层的词。
  • RIGHT-ARC:将 (w_{j},r,w_{i}) 加入边的集合 A,其中 w_{i} 是stack上的次顶层的词,w_{j} 是stack上的最顶层的词。

我们不断的进行上述三类操作,直到从初始态达到最终态。在每个状态下如何选择哪种操作呢?当我们考虑到LEFT-ARC与RIGHT-ARC各有|R|(|R|为r的类的个数)种class,我们可以将其看做是class数为2|R|+1的分类问题,可以用SVM等传统机器学习方法解决。

Evaluation of Dependency Parsing: (labeled) dependency accuracy(依赖解析的评估)

我们有两个metric,一个是LAS(labeled attachment score)即只有arc的箭头方向以及语法关系均正确时才算正确,以及UAS(unlabeled attachment score)即只要arc的箭头方向正确即可

4. 为什么要训练神经依赖解析器?重新审视指标功能

Indicator Features的问题

  • 稀疏
  • 不完整
  • 计算复杂
    • 超过95%的解析时间都用于特征计算

4.1 A neural dependency parser [Chen and Manning 2014]

斯坦福依赖关系的英语解析

  • Unlabeled attachment score (UAS) = head
  • Labeled attachment score (LAS) = head and label

  • 效果好,速度快

4.2 Distributed Representations(

  • 我们将每个单词表示为一个d维稠密向量(如词向量)
    • 相似的单词应该有相近的向量
  • 同时,part-of-speech tags 词性标签(POS)和 dependency labels 依赖标签也表示为d维向量
    • 较小的离散集也表现出许多语义上的相似性。
  • NNS(复数名词)应该接近NN(单数名词)
  • num(数值修饰语)应该接近amod(形容词修饰语)。

对于Neural Dependency Parser,其输入特征通常包含三种

  • stack和buffer中的单词及其dependent word
  • 单词的part-of-speech tag
  • 描述语法关系的arc label

我们根据堆栈/缓冲区位置提取一组令牌:

 

我们将其转换为词向量并将它们联结起来作为输入层,再经过若干非线性的隐藏层,最后加入softmax layer得到shift-reduce解析器的动作 

Model Architecture 模型结构