NLP教程(4) - 句法分析与依存解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
NLP自然语言处理_基础版,每接口每天50万次
简介: 本文介绍 Dependency Grammar、Dependency Structure、Neural Dependency Parsing、依存解析、依存句法 和 语法依赖等内容。

ShowMeAI研究中心

作者:韩信子@ShowMeAI
教程地址http://www.showmeai.tech/tutorials/36
本文地址http://www.showmeai.tech/article-detail/237
声明:版权所有,转载请联系平台与作者并注明出处

收藏ShowMeAI查看更多精彩内容


句法分析与依存解析
本系列为斯坦福CS224n《自然语言处理与深度学习(Natural Language Processing with Deep Learning)》的全套学习笔记,对应的课程视频可以在 这里 查看。

句法分析与依存解析
ShowMeAI为CS224n课程的全部课件,做了中文翻译和注释,并制作成了 GIF动图!点击 第5讲-句法分析与依存解析 查看的课件注释与带学解读。更多资料获取方式见文末。


概述

CS224n是顶级院校斯坦福出品的深度学习与自然语言处理方向专业课程,核心内容覆盖RNN、LSTM、CNN、transformer、bert、问答、摘要、文本生成、语言模型、阅读理解等前沿内容。

笔记核心词

  • Dependency Grammar
  • Dependency Structure
  • Neural Dependency Parsing
  • 依存解析
  • 依存句法
  • 语法依赖

1.依存语法与依存结构

与编译器中的解析树类似,NLP中的解析树是用于分析句子的句法结构。使用的结构主要有两种类型——短语结构依存结构。短语结构文法使用短语结构语法将词组织成嵌套成分。后面的内容会展开对它做更详细的说明。我们现在关注依存语法。

句子的依存结构展示了单词依赖于另外一个单词 (修饰或者是参数)。词与词之间的二元非对称关系称为依存关系,描述为从head (被修饰的主题) 用箭头指向dependent (修饰语)。一般这些依存关系形成树结构,他们通常用语法关系的名称 (主体,介词宾语,同位语等)。


Bills on ports and immigration were submitted by Senator Brownback, Republican of Kansas. 依存树的例子如下图所示:

依存树的示例

有时,在依存树的头部增加一个假的ROOT节点,这样每个单词都依存于唯一一个节点。

1.1 依存分析

依存语法是给定一个输入句子 equation?tex=S,分析句子的句法依存结构的任务。依存句法的输出是一棵依存语法树,其中输入句子的单词是通过依存关系的方式连接。

正式一点定义,依存语法问题就是创建一个输入句子的单词 equation?tex=S%3Dw_%7B0%7Dw_%7B1%7D%20%5Ccdots%20w_%7Bn%7D (其中 equation?tex=w_%7B0%7D 是 ROOT) 到它的依存语法树的映射图 equation?tex=G。最近几年提出了很多以依存句法为基础的的变体,包括基于神经网络的方法,我们将会在后面介绍。


确切地说,在依存语法中有两个子问题:

  • 学习:给定用依赖语法图标注的句子的训练集 equation?tex=D,创建一个可以用于解析新句子的解析模型 equation?tex=M
  • 解析:给定解析模型 equation?tex=M 和句子 equation?tex=S,根据 equation?tex=M 得到 equation?tex=S 的最优依存语法图

1.2 基于转移的依存分析

Transition-based 依存语法依赖于定义可能转换的状态机,以创建从输入句到依存句法树的映射。

  • 学习」问题是创建一个可以根据转移历史来预测状态机中的下一个转换的模型。
  • 解析」问题是使用在学习问题中得到的模型对输入句子构建一个最优的转移序列

大多数 Transition-based 系统不会使用正式的语法。

1.3 Greedy Deterministic Transition-Based Parsing

这个系统是由 Nivre 在 2003 年提出,与当时的常用方法截然不同。

这个转换系统是一个状态机,它由状态和这些状态之间的转换组成。该模型导出了从初始状态到几种终端状态之一的一系列转换。

1) 状态

对任意句子 equation?tex=S%3Dw_%7B0%7Dw_%7B1%7D%20%5Ccdots%20w_%7Bn%7D,一个状态可以描述为一个三元组 equation?tex=c%3D%28%5Csigma%2C%20%5Cbeta%2CA%29

  1. 来自 equation?tex=S 的单词 equation?tex=w_%7Bi%7D 的堆 equation?tex=%5Csigma
  2. 来自 equation?tex=S 的单词 equation?tex=w_%7Bi%7D 的缓冲区 equation?tex=%5Cbeta
  3. 一组形式为 equation?tex=%28w_%7Bi%7D%2Cr%2Cw_%7Bj%7D%29 的依存弧,其中 equation?tex=w_%7Bi%7D%2Cw_%7Bj%7D 是来自 equation?tex=S,和 equation?tex=r 描述依存关系。


因此,对于任意句子 equation?tex=S%3Dw_%7B0%7Dw_%7B1%7D%20%5Ccdots%20w_%7Bn%7D

  1. 一个形式为 equation?tex=%28%5Bw_%7B0%7D%5D_%7B%5Csigma%7D%2C%5Bw_%7B1%7D%2C%20%5Ccdots%20%2Cw_%7Bn%7D%5D_%7B%5Cbeta%7D%2C%5Cvarnothing%29 的初始状态 equation?tex=c_%7B0%7D (现在只有 ROOT 在堆 equation?tex=%5Csigma 中,没有被选择的单词都在缓冲区 equation?tex=%5Cbeta 中。
  2. 一个形式为 equation?tex=%28%5Csigma%2C%5B%5D_%7B%5Cbeta%7D%2CA%29 的终点状态。

2) 转移

在状态之间有三种不同类型的转移:

  1. equation?tex=SHIFT:移除在缓冲区的第一个单词,然后将其放在堆的顶部 (前提条件:缓冲区不能为空)。
  2. equation?tex=Left%5Ctext%7B-%7DArc_%7Br%7D:向依存弧集合 equation?tex=A 中加入一个依存弧 equation?tex=%28w_%7Bj%7D%2Cr%2Cw_%7Bi%7D%29,其中 equation?tex=w_%7Bi%7D 是堆顶的第二个单词, equation?tex=w_%7Bj%7D 是堆顶部的单词。从栈中移除 equation?tex=w_%7Bi%7D (前提条件:堆必须包含两个单词以及 equation?tex=w_%7Bi%7D 不是 ROOT )
  3. equation?tex=Right%5Ctext%7B-%7DArc_%7Br%7D:向依存弧集合 equation?tex=A 中加入一个依存弧 equation?tex=%28w_%7Bi%7D%2Cr%2Cw_%7Bj%7D%29,其中 equation?tex=w_%7Bi%7D 是堆顶的第二个单词, equation?tex=w_%7Bj%7D 是堆顶部的单词。从栈中移除 equation?tex=w_%7Bj%7D (前提条件:堆必须包含两个单词)

下图给出了这三个转换的更正式的定义:

依赖解析的转换

1.4 神经网络依存解析器

虽然依赖项解析有很多深层模型,这部分特别侧重于贪心,基于转移的神经网络依存语法解析器。与传统的基于特征的判别依存语法解析器相比,神经网络依存语法解析器性能和效果更好。与以前模型的主要区别在于这类模型依赖稠密而不是稀疏的特征表示。

我们将要描述的模型采用上一部分中讲述的标准依存弧转换系统。最终,模型的目标是预测从一些初始状态 equation?tex=c 到一个终点状态的转换序列,对模型中的依存语法树进行编码的。


由于模型是贪心的,它基于从当前的状态 equation?tex=c%3D%28%5Csigma%2C%20%5Cbeta%2C%20A%29 提取特征,然后尝试一次正确地预测一次转移 equation?tex=T%5Cin%20%5C%7BSHIFT%2C%20Left%5Ctext%7B-%7DArc_%7Br%7D%2CRight%5Ctext%7B-%7DArc_%7Br%7D%5C%7D。回想一下, equation?tex=%5Csigma 是栈,equation?tex=%5Cbeta 是缓存, equation?tex=A 是对于一个给定的句子的依赖弧的集合。

1) 特征选择

根据该模型所需的复杂性,定义神经网络的输入是灵活的。对给定句子 equation?tex=S 的特征包含一些子集:

  1. equation?tex=S_%7Bword%7D:在堆 equation?tex=%5Csigma 的顶部和缓冲区 equation?tex=%5Cbetaequation?tex=S 中一些单词的词向量 (和它们的依存)。
  2. equation?tex=S_%7Btag%7D:在 equation?tex=S 中一些单词的词性标注 ( POS )。词性标注是由一个离散集合组成:equation?tex=%5Cmathcal%7BP%7D%3D%5C%7BNN%2CNNP%2CNNS%2CDT%2CJJ%2C%20%5Ccdots%20%5C%7D
  3. equation?tex=S_%7Blabel%7D:在 equation?tex=S 中一些单词的依存标签。依存标签是由一个依存关系的离散集合组成:equation?tex=%5Cmathcal%7BL%7D%3D%5C%7Bamod%2Ctmod%2Cnsubj%2Ccsubj%2Cdobj%2C%20%5Ccdots%20%5C%7D


对每种特征类型,我们都有一个对应的将特征的 one-hot 编码映射到一个 equation?tex=d 维的稠密的向量表示的嵌入矩阵。

  • equation?tex=S_%7Bword%7D 的完全嵌入矩阵是 equation?tex=E%5E%7Bw%7D%5Cin%20%5Cmathbb%7BR%7D%5E%7Bd%5Ctimes%20N_%7Bw%7D%7D,其中 equation?tex=N_%7Bw%7D 是字典/词汇表的大小。
  • POS 和依存标签的嵌入矩阵分别为 equation?tex=E%5E%7Bt%7D%5Cin%20%5Cmathbb%7BR%7D%5E%7Bd%5Ctimes%20N_%7Bt%7D%7Dequation?tex=E%5E%7Bl%7D%5Cin%20%5Cmathbb%7BR%7D%5E%7Bd%5Ctimes%20N_%7Bl%7D%7D,其中 equation?tex=N_%7Bt%7Dequation?tex=N_%7Bl%7D 分别为不同词性标注和依存标签的个数。

最后,定义从每组特征中选出的元素的数量分别为 equation?tex=n_%7Bword%7Dequation?tex=n_%7Btag%7Dequation?tex=n_%7Blabel%7D

2) 特征选择的例子

作为一个例子,考虑一下对 equation?tex=S_%7Bword%7Dequation?tex=S_%7Btag%7Dequation?tex=S_%7Blabel%7D 的选择:

  1. equation?tex=S_%7Bword%7D:在堆和缓冲区的前三个单词:equation?tex=s_%7B1%7D%2Cs_%7B2%7D%2Cs_%7B3%7D%2Cb_%7B1%7D%2Cb_%7B2%7D%2Cb_%7B3%7D。栈顶部两个单词的第一个和第二个的 leftmost / rightmost 的子单词:equation?tex=lc_%7B1%7D%28s_%7Bi%7D%29%2Crc_%7B1%7D%28s_%7Bi%7D%29%2Clc_%7B2%7D%28s_%7Bi%7D%29%2Crc_%7B2%7D%28s_%7Bi%7D%29%2Ci%3D1%2C2。栈顶部两个单词的第一个和第二个的 leftmost of leftmost / rightmost of rightmost 的子单词:equation?tex=lc_%7B1%7D%28lc_%7B1%7D%28s_%7Bi%7D%29%29%2Crc_%7B1%7D%28rc_%7B1%7D%28s_%7Bi%7D%29%29%2Ci%3D1%2C2equation?tex=S_%7Bword%7D 总共含有 equation?tex=n_%7Bword%7D%3D18 个元素。
  2. equation?tex=S_%7Btag%7D:相应的词性标注,则 equation?tex=S_%7Btag%7D 含有 equation?tex=n_%7Btag%7D%3D18 个元素。
  3. equation?tex=S_%7Blabel%7D:单词的对应的依存标签,不包括堆/缓冲区上的 equation?tex=6 个单词,因此 equation?tex=S_%7Blabel%7D 含有 equation?tex=n_%7Blabel%7D%3D12 个元素。


注意我们使用一个特殊的 equation?tex=NULL 表示不存在的元素:当堆和缓冲区为空或者还没有指定依存关系时。

对一个给定句子例子,我们按照上述的方法选择单词,词性标注和依存标签,从嵌入矩阵 equation?tex=E%5E%7Bw%7D%2CE%5E%7Bt%7D%2CE%5E%7Bl%7D 中提取它们对应的稠密的特征的表示,然后将这些向量连接起来作为输入 equation?tex=%5Bx%5E%7Bw%7D%2Cx%5E%7Bt%7D%2Cx%5E%7Bl%7D%5D

在训练阶段,我们反向传播到稠密的向量表示,以及后面各层的参数。

3) 前馈神经网络模型

(关于前馈神经网络的内容也可以参考ShowMeAI的对吴恩达老师课程的总结文章深度学习教程 | 神经网络基础深度学习教程 | 浅层神经网络深度学习教程 | 深层神经网络

这个神经网络包含一个输入层 equation?tex=%5Bx%5E%7Bw%7D%2Cx%5E%7Bt%7D%2Cx%5E%7Bl%7D%5D,一个隐藏层,以及具有交叉熵损失函数的最终 softmax 层。

我们可以在隐藏层中定义单个权值矩阵,与 equation?tex=%5Bx%5E%7Bw%7D%2Cx%5E%7Bt%7D%2Cx%5E%7Bl%7D%5D 进行运算,我们可以使用三个权值矩阵 equation?tex=%5BW%5E%7Bw%7D_%7B1%7D%2CW%5E%7Bt%7D_%7B1%7D%2CW%5E%7Bl%7D_%7B1%7D%5D,每个矩阵对应着相应的输入类型,如下图所示。

前馈神经网络模型

  • Softmax layer: equation?tex=p%3D%5Coperatorname%7Bsoftmax%7D%5Cleft%28W_%7B2%7D%20h%5Cright%29
  • Hidden layer: equation?tex=h%3D%5Cleft%28W_%7B1%7D%5E%7Bw%7D%20x%5E%7Bw%7D%2BW_%7B1%7D%5E%7Bt%7D%20x%5E%7Bt%7D%2BW_%7B1%7D%5E%7Bl%7D%20x%5E%7Bl%7D%2Bb_%7B1%7D%5Cright%29%5E%7B3%7D
  • Input layer:equation?tex=%5Cleft%5Bx%5E%7Bw%7D%2C%20x%5E%7Bt%7D%2C%20x%5E%7Bl%7D%5Cright%5D

然后我们应用一个非线性函数并使用一个额外的仿射层 equation?tex=%5BW_%7B2%7D%5D,使得对于可能的转移次数 (输出维度) ,有相同数量的 softmax 概率。

  • 注意在上图中,使用的非线性函数是 equation?tex=f%28x%29%3Dx%5E%7B3%7D

有关 greedy transition-based 神经网络依存语法解析器的更完整的解释

2.参考资料

ShowMeAI 系列教程推荐

自然语言处理(NLP)系列教程

斯坦福 CS224n 课程带学详解

ShowMeAI用知识加速每一次技术成长

目录
相关文章
|
4天前
|
API 数据安全/隐私保护
抖音视频,图集无水印直链解析免费API接口教程
该接口用于解析抖音视频和图集的无水印直链地址。请求地址为 `https://cn.apihz.cn/api/fun/douyin.php`,支持POST或GET请求。请求参数包括用户ID、用户KEY和视频或图集地址。返回参数包括状态码、信息提示、作者昵称、标题、视频地址、封面、图集和类型。示例请求和返回数据详见文档。
|
30天前
|
域名解析 网络协议
邮箱域名解析后收不到短信?三步修复教程
邮箱域名解析后收不到短信?三步修复教程
|
1月前
|
弹性计算 负载均衡 网络协议
内部名称解析设置阿里云私有 DNS 区域,针对于阿里云国际版经验教程
内部名称解析设置阿里云私有 DNS 区域,针对于阿里云国际版经验教程
|
1月前
|
弹性计算 网络协议 数据库
在阿里云国际站上解析域名到服务器详细教程
在阿里云国际站上解析域名到服务器详细教程
|
3月前
|
图形学 数据可视化 开发者
超实用Unity Shader Graph教程:从零开始打造令人惊叹的游戏视觉特效,让你的作品瞬间高大上,附带示例代码与详细步骤解析!
【8月更文挑战第31天】Unity Shader Graph 是 Unity 引擎中的强大工具,通过可视化编程帮助开发者轻松创建复杂且炫酷的视觉效果。本文将指导你使用 Shader Graph 实现三种效果:彩虹色渐变着色器、动态光效和水波纹效果。首先确保安装最新版 Unity 并启用 Shader Graph。创建新材质和着色器图谱后,利用节点库中的预定义节点,在编辑区连接节点定义着色器行为。
244 0
|
3月前
|
机器学习/深度学习 存储 自然语言处理
自然语言处理中的情感分析技术:深入解析与应用前景
【8月更文挑战第4天】情感分析技术作为自然语言处理领域的重要分支,具有广泛的应用前景和重要的研究价值。通过不断的技术创新和应用实践,我们可以期待情感分析在未来发挥更大的作用,为我们的生活和工作带来更多便利和效益。
159 10
|
3月前
|
Java Spring
🔥JSF 与 Spring 强强联手:打造高效、灵活的 Web 应用新标杆!💪 你还不知道吗?
【8月更文挑战第31天】JavaServer Faces(JSF)与 Spring 框架是常用的 Java Web 技术。本文介绍如何整合两者,发挥各自优势,构建高效灵活的 Web 应用。首先通过 `web.xml` 和 `ContextLoaderListener` 配置 Spring 上下文,在 `applicationContext.xml` 定义 Bean。接着使用 `@Autowired` 将 Spring 管理的 Bean 注入到 JSF 管理的 Bean 中。
64 0
|
3月前
|
JavaScript 前端开发 开发者
深入解析Angular装饰器:揭秘框架核心机制与应用——从基础用法到内部原理的全面教程
【8月更文挑战第31天】本文深入解析了Angular框架中的装饰器特性,包括其基本概念、使用方法及内部机制。装饰器作为TypeScript的关键特性,在Angular中用于定义组件、服务等。通过具体示例介绍了`@Component`和`@Injectable`装饰器的应用,展示了如何利用装饰器优化代码结构与依赖注入,帮助开发者构建高效、可维护的应用。
34 0
|
3月前
|
存储
Cmake官方教程解析
Cmake官方教程解析
55 0
|
3月前
|
自然语言处理 计算机视觉 Python
VisProg解析:根据自然语言指令解决复杂视觉任务
VisProg是一个神经符号系统,能够根据自然语言指令生成并执行Python程序来解决复杂的视觉任务,提供可解释的解决方案。
46 0

推荐镜像

更多