资源链接:https://www.bilibili.com/video/BV1r4411,部分内容参考来自于码农场 » CS224n笔记6 句法分析和https://zhuanlan.zhihu.com/p/110532288
补充内容
说实话,之前接触过一点nlp,在第五课直接膝盖都跪了,感觉这一章听天书一样,然后发现这一部分知识是我没了解过的,所以看了各种博客和其他视频先去了解了一下~(以下内容算是了解内容的一些搬运和整理吧,资源链接如下:https://zhuanlan.zhihu.com/p/51186364、https://blog.csdn.net/wwx123521/article/details/89636003)
句法分析/syntactic parsing
首先了解一下什么是句法分析,也是我们经常容易忽略的一部分内容,句法分析是自然语言处理中的关键技术之一,它是对输入的文本句子进行分析以得到句子的句法结构的处理过程。对句法结构进行分析,一方面是语言理解的自身需求,句法分析是语言理解的重要一环,另一方面也为其它自然语言处理任务提供支持。例如句法驱动的统计机器翻译需要对源语言或目标语言(或者同时两种语言)进行句法分析;语义分析通常以句法分析的输出结果作为输入以便获得更多的指示信息。
根据句法结构的表示形式不同,最常见的句法分析任务可以分为以下三种:句法结构分析/syntactic structure parsing(又称短语结构分析/phrase structure parsing,也叫成分句法分析/constituent syntactic parsing。作用是识别出句子中的短语结构以及短语之间的层次句法关系)、依存关系分析(又称依存句法分析/dependency syntactic parsing,简称依存分析,作用是识别句子中词汇与词汇之间的相互依存关系)和深层文法句法分析(即利用深层文法,例如词汇化树邻接文法/Lexicalized Tree Adjoining Grammar, LTAG、词汇功能文法/Lexical Functional Grammar, LFG、组合范畴文法/Combinatory Categorial Grammar, CCG等,对句子进行深层的句法以及语义分析)。
百度百科定义:依存句法是由法国语言学家L.Tesniere最先提出。它将句子分析成一颗依存句法树,描述出各个词语之间的依存关系。也即指出了词语之间在句法上的搭配关系,这种搭配关系是和语义相关联的。
语法分析的主要方法:
句法结构分析方法可以分为基于规则的分析方法和基于统计的分析方法两大类。(还有深度学习方法~)
基于规则的句法结构分析方法的基本思路是,由人工组织语法规则,建立语法知识库,通过条件约束和检查来实现句法结构歧义的消除。基于规则的语法结构分析可以利用手工编写的规则分析出输入句子所有可能的句法结构。
根据句法分析树形成方向的区别,人们通常将这些方法划分为三种类型:自顶向下的分析方法,自底向上的分析方法和两者相结合的分析方法。自顶向下分析算法实现的是规则推导的过程,分析树从根结点开始不断生长,最后形成分析句子的叶结点。而自底向上分析算法的实现过程恰好相反,它是从句子符号串开始,执行不断规约的过程,最后形成根节点。
基于概率上下文无关文法的短语结构分析方法,可以说是目前最成功的语法驱动的统计句法分析方法,可以认为是规则方法与统计方法的结合。
依存分析的一些重要概念
- 依存句法认为“谓语”中的动词是一个句子的中心,其他成分与动词直接或间接地产生联系。
- 依存句法理论中,“依存”指词与词之间支配与被支配的关系,这种关系不是对等的,这种关系具有方向。确切的说,处于支配地位的成分称之为支配者(governor,regent,head),而处于被支配地位的成分称之为从属者(modifier,subordinate,dependency)。
- 依存语法本身没有规定要对依存关系进行分类,但为了丰富依存结构传达的句法信息,在实际应用中,一般会给依存树的边加上不同的标记。
- 依存语法存在一个共同的基本假设:句法结构本质上包含词和词之间的依存(修饰)关系。一个依存关系连接两个词,分别是核心词(head)和依存词(dependent)。依存关系可以细分为不同的类型,表示两个词之间的具体句法关系。
依存分析方法的简介
- 基于规则的方法: 早期的基于依存语法的句法分析方法主要包括类似CYK的动态规划算法、基于约束满足的方法和确定性分析策略等。
- 基于统计的方法:统计自然语言处理领域也涌现出了一大批优秀的研究工作,包括生成式依存分析方法、判别式依存分析方法和确定性依存分析方法,这几类方法是数据驱动的统计依存分析中最为代表性的方法。
- 基于深度学习的方法:近年来,深度学习在句法分析课题上逐渐成为研究热点,主要研究工作集中在特征表示方面。传统方法的特征表示主要采用人工定义原子特征和特征组合,而深度学习则把原子特征(词、词性、类别标签)进行向量化,在利用多层神经元网络提取特征。
依存分析器的性能评价
通常使用的指标包括无标记依存正确率(unlabeled attachment score,UAS)、带标记依存正确率(labeled attachment score, LAS)、依存正确率(dependency accuracy,DA)、根正确率(root accuracy,RA)、完全匹配率(complete match,CM)等。这些指标的具体意思如下:
- 无标记依存正确率(UAS):测试集中找到其正确支配词的词(包括没有标注支配词的根结点)所占总词数的百分比。
- 带标记依存正确率(LAS):测试集中找到其正确支配词的词,并且依存关系类型也标注正确的词(包括没有标注支配词的根结点)占总词数的百分比。
- 依存正确率(DA):测试集中找到正确支配词非根结点词占所有非根结点词总数的百分比。
- 根正确率(RA):有二种定义,一种是测试集中正确根结点的个数与句子个数的百分比。另一种是指测试集中找到正确根结点的句子数所占句子总数的百分比。
- 完全匹配率(CM):测试集中无标记依存结构完全正确的句子占句子总数的百分比。
(了解这部分内容后听课就舒服多了...)
正课内容
语言学的两种观点
如何描述语法,有两种主流观点,其中一种是短语结构文法,英文术语是:Constituency = phrase structure grammar = context-free grammars (CFGs).
句子是使用逐步嵌套的单元构建的
- 短语结构将单词组织成嵌套的成分
- 起步单元:单词被赋予一个类别 (part of speech=pos 词性)
- 单词组合成不同类别的短语
- 短语可以递归地组合成更大的短语
其实就是这种短语语法用固定数量的rule分解句子为短语和单词、分解短语为更短的短语或单词
例如:(其实感觉和编译原理中的语法树很像)
另一种类似于下图所示:(用单词之间的依存关系来表达语法。如果一个单词修饰另一个单词,则称该单词依赖于另一个单词)
视频中的样例:
- look是整个句子的根源,look依赖于crate
- in,the,large都是是crate的依赖
- in the kitchen是crate的修饰
- in,the都是kitchen的依赖
- by the door是crate的依赖
为什么我们需语法结构?
为了能够正确地解释语言,我们需要理解句子结构
人类通过将单词组合成更大的单元来传达复杂的意思,从而交流复杂的思想
我们需要知道什么与什么相关联
除非我们知道哪些词是其他词的参数或修饰词,否则我们无法弄清楚句子是什么意思
语法是有歧义的
下面将介绍各种歧义现象
介词短语依附歧义
例如:
两种解释:
警察用刀杀了那个男子
- cops是kill的主语/subject
- man是kill的宾语/object
- knife是kill的修饰词/modifier
警察杀了那个有刀的男子
- knife是man的修饰词/modifier
再看一个例子:
from space到底修饰的是count还是whales?
这就是人类语言和编程语言中不同的地方,关键的解析决策是我们如何 “依存” 各种成分,介词短语、状语或分词短语、不定式、协调等。
依附歧义
很难确定如何把一个短语(介词短语、状语短语、分词短语、不定式)依附到其他成分上去,如下样例:
每个括号中都是一个短语,它们依附的对象各不相同。对于n个短语来讲,组成的树形结构有Cn=(2n)!/[(n+1)!n!]。这是Catalan数,指数级增长。
具体解释样例:共有四个短语
- board 是 approved 的 主语,acquisition 是 approved 的谓语
- by Royal Trustco Ltd. 是修饰 acquisition 的,即董事会批准了这家公司的收购
- of Toronto 可以修饰 approved, acquisition, Royal Trustco Ltd. 之一,经过分析可以得知是修饰 Royal Trustco Ltd. 即表示这家公司的位置
- for $27 a share 修饰 acquisition
- at its monthly meeting 修饰 approved ,即表示批准的时间地点
协调范围模糊
样例:
- 一个人:[[Shuttle veteran and longtime NASA executive] Fred Gregory] appointed to board(长期担任美国宇航局局长的航天飞机老兵弗雷德·格雷戈里被任命为航天飞机的成员)
- 两个人:[Shuttle veteran] and [longtime NASA executive Fred Gregory] appointed to board(航天飞机老兵和长期担任美国宇航局局长的弗雷德·格雷戈里被任命为航天飞机的成员)
再例如:
形容词修饰语歧义
样例:
Students get first hand job experience
两种情况:
- first hand 表示 第一手的,直接的,即学生获得了直接的工作经验,first 是 hand 的形容词修饰语(amod)
- first 修饰 experience, hand 修饰 job
动词短语(VP)依存歧义
样例:
Mutilated body washes up on Rio beach to be used for Olympic beach volleyball.
to be used for Olympic beach volleyball 是 动词短语 (VP),修饰的是 body 还是 beach?
依赖路径识别语义关系
依存语法与依存结构
关联语法假设句法结构包括词汇项之间的关系,通常是二元不对称关系(“箭头”),称为依赖关系
依存结构有两种表现形式,如下图所示:
(一种就是直接在句子上标出依存关系箭头及语法关系,第二种则是做成树/Dependency Tree Graph)
这节课以及练习用的都是依存句法树,而不是短语结构树。这并不是随机选择,而是由于前者的优势。90年代的句法分析论文99%都是短语结构树,但后来人们发现依存句法树标注简单,parser准确率高,所以后来(特别是最近十年)基本上就是依存句法树的天下了(至少80%)。
不标注依存弧label的依存句法树就是短语结构树的一种:(关系(“箭头”)称为依赖关系)
(感觉上述例子不是很明白)
下面来个例子(源自:https://www.jianshu.com/p/ea8a2ae1cc25,作者:柴柴总,大家也可以自己看看学习)
短语结构树(constituent tree)与依存树(dependency tree)是NLP中的两种典型的树结构
-
短语结构树用来表达句子的句法结构,其只有叶子结点与输入句子中的词语相关联,其他中间结点都是标记短语成分。
-
依存树用来表达句子中词与词的依存关系,具体地,分析识别句子中的“主谓宾”、“定状补”等语法成分。其每个结点都是一个词语。
名词解释
- ROOT:要处理文本的语句
- IP:简单从句
- NP:名词短语
- VP:动词短语
- PU:断句符,通常是句号、问号、感叹号等标点符号
- LCP:方位词短语
- PP:介词短语
- CP:由‘的’构成的表示修饰性关系的短语
- DNP:由‘的’构成的表示所属关系的短语
- ADVP:副词短语
- ADJP:形容词短语
- DP:限定词短语
- QP:量词短语
- NN:常用名词
- NR:固有名词
- NT:时间名词
- PN:代词
- VV:动词
- VC:是
- CC:表示连词
- VE:有
- VA:表语形容词
- AS:内容标记(如:了)
- VRD:动补复合词
- CD: 表示基数词
- DT: determiner 表示限定词
- EX: existential there 存在句
- FW: foreign word 外来词
- IN: preposition or conjunction, subordinating 介词或从属连词
- JJ: adjective or numeral, ordinal 形容词或序数词
- JJR: adjective, comparative 形容词比较级
- JJS: adjective, superlative 形容词最高级
- LS: list item marker 列表标识
- MD: modal auxiliary 情态助动词
- PDT: pre-determiner 前位限定词
- POS: genitive marker 所有格标记
- PRP: pronoun, personal 人称代词
- RB: adverb 副词
- RBR: adverb, comparative 副词比较级
- RBS: adverb, superlative 副词最高级
- RP: particle 小品词
- SYM: symbol 符号
- TO:”to” as preposition or infinitive marker 作为介词或不定式标记
- WDT: WH-determiner WH限定词
- WP: WH-pronoun WH代词
- WP$: WH-pronoun, possessive WH所有格代词
- WRB:Wh-adverb WH副词
依赖语法/分析的历史
依赖结构的概念可以追溯到很久以前
- Pāṇini的语法(公元前5世纪)
- 一千年 阿拉伯语的语法的基本方法
选区/上下文无关文法是一个新奇的发明
- 20世纪发明(R.S.Wells,1947; then Chomsky)
现代依赖工作经常源于 L. Tesnière(1959)
- 是20世纪“东方”的主导方法(俄罗斯,中国,…)
- 有利于更自由的语序语言
NLP中最早类型的解析器在美国
- David Hays 是美国计算语言学的创始人之一,他很早就(第一个吗?)构建了依赖解析器(Hays 1962)。
(翻译课件的内容,想详细了解的可以自己了解了解)
依赖语法和依赖结构
人们对箭头指向的方式不一致:有些人把箭头朝一个方向画;有人是反过来的
Tesnière 从头开始指向依赖,本课使用此种方式
通常添加一个伪根指向整个句子的头部,这样每个单词都精确地依赖于另一个节点
标注数据集的崛起:Universal Dependencies treebanks/通用依赖树库
虽然上下文无关文法(编译原理中的上下文无关文法)中的语法集很容易写,无非是有限数量的规则的集合而已,但人工费时费力标注的树库却茁壮成长了起来。在1993年首次面世的Universal Dependencies treebanks如今在Google的赞助下发布了2.0,其授权大多是署名-相同方式共享,覆盖了全世界绝大多数语言(不包括简体中文)。
其官网是:http://universaldependencies.org/
树库的样例:
课件解释:
- 我们想要拥有一个统一的、并行的依赖描述,可用于任何人类语言
- 从前手工编写语法然后训练得到可以解析句子的解析器
- 用一条规则捕捉很多东西真的很有效率,但是事实证明这在实践中不是一个好主意
- 语法规则符号越来越复杂,并且没有共享和重用人类所做的工作
- 句子结构上的treebanks 支持结构更有效
某大佬文章中感觉更容易理解的说法:人们偏好树库多于规则的原因是显而易见的,树库虽然标注难度高,但每一份劳动都可被复用(可以用于词性标注命名实体识别等等任务);而每个人编写的规则都不同,并且死板又丑陋。树库的多用性还是得其作为评测的标杆数据,得到了越来越多的引用。
依赖项解析的信息来源是什么?
-
双词汇亲和/Bilexical affinities,比如discussion与issues。
-
词语间距/Dependency distance ,因为一般相邻的词语才具有依存关系
-
中间词语/Intervening material ,如果中间词语是动词或标点,则两边的词语不太可能有依存
-
词语配价/Valency of heads,一个词语最多有几个依赖者。
放一个可以做nlp相关任务的平台,挺好玩的哟http://ictclas.nlpir.org/nlpir/和一个哈工大的api(其中很多内容适合学习的时候看哟)http://www.ltp-cloud.com/intro#dp_how
依赖关系分析
一个句式是通过为每个单词选择另一个单词(包括词根)来解析的。通常有如下的限制:
- 只有一个单词是依赖于根的
- 不存在循环 [公式]
- 要使得依赖项能画成为树
- 最后一个问题是箭头是否可以交叉(可以交叉的就是 non-projective),没有交叉的就是projectice
样例:
是否可以将一个依存句法树还原成句子?答案:否定的。(课堂问答)
投影性/projectice
上述了解了一下箭头是否可以交叉,然后课程中具体说明了一下不可以交叉的情况。
定义:当单词按线性顺序排列时,没有交叉的依赖弧,所有的弧都在单词的上方
与CFG树并行的依赖关系必须是投影的
- 通过将每个类别的一个子类别作为头来形成依赖关系
但是依赖理论通常允许非投射结构来解释移位的成分
- 如果没有这些非投射依赖关系,就不可能很容易获得某些结构的语
依赖分析的方法
文献中的依存句法分析方法有:
Dynamic programming/动态规划
- Eisner(1996)提出了一种复杂度为 O(n^3) 的聪明算法,它生成头部位于末尾而不是中间的解析项
估计是找出以某head结尾的字串对应的最可能的句法树。
Graph algorithms/图算法
为一个句子创建一个最小生成树。其实就是生成最小生成树。
- McDonald et al.’s (2005) MSTParser 使用ML分类器独立地对依赖项进行评分(他使用MIRA进行在线学习,但它也可以是其他东西)
Constraint Satisfaction/约束满足
- 去掉不满足硬约束的边 Karlsson(1990), etc.
估计是在某个图上逐步删除不符合要求的边,直到成为一棵树。
“Transition-based parsing/基于转换的分析” or “deterministic dependency parsing/确定性依赖解析”
- 良好的机器学习分类器 MaltParser(Nivreet al. 2008) 指导下的依存贪婪选择。已证明非常有效。
主流方法,基于贪心决策动作拼装句法树。
Greedy transition-based parsing/基于贪婪转换的句法分析
他是一种简单的贪婪判别依赖分析器
基于Arc标准转换的解析器/Arc-standard transition-based parser
附上一个大佬的相关链接(不是很明白的可以去看一看)https://www.hankcs.com/nlp/parsing/neural-network-based-dependency-parser.html/2#h2-6
MaltParser模型
我们需要解释如何选择下一步行动
- Answer:机器学习
每个动作都由一个有区别分类器(例如softmax classifier)对每个合法的移动进行预测
- 最多三种无类型的选择,当带有类型时,最多 [公式] 种
- Features:栈顶单词,POS;buffer中的第一个单词,POS;等等
在最简单的形式中是没有搜索的
- 但是,如果你愿意,你可以有效地执行一个 Beam search 束搜索(虽然速度较慢,但效果更好):你可以在每个时间步骤中保留 k个好的解析前缀
该模型的精度略低于依赖解析的最高水平,但它提供了非常快的线性时间解析,性能非常好
传统特征表示/Conventional Feature Representation
传统的特征表示使用二元的稀疏向量,一个超长的稀疏01向量。
- 特征模板:通常由配置中的1 ~ 3个元素组成
- Indicator features
依赖解析的评估:(标记)依赖精度/准确率评价
正确率平均应该包括标记的评价和依赖关系的评价~
其中,UAS (unlabeled attachment score) 指 无标记依存正确率 ,LAS (labeled attachment score) 指 有标记依存正确率
处理非投射性
(上面讲述了投射性的,现在讲解非投射性的~)
我们提出的弧标准算法只构建投影依赖树
头部可能的方向
- 在非投影弧上宣布失败
- 只具有投影表示时使用依赖形式
- CFG只允许投影结构
- 使用投影依赖项解析算法的后处理器来识别和解析非投影链接
- 添加额外的转换,至少可以对大多数非投影结构建模(添加一个额外的交换转换,冒泡排序)
- 转移到不使用或不需要对投射性进行任何约束的解析机制(例如,基于图的MSTParser)
(这一章没怎么讲,大概意思就是:CFG转换得到的依存树一定是投射性的,但依存理论允许非投射性的依存句法树,因为一些语义需要通过非投射性表达;arc-standard算法只能拼装投射性的句法树,但换个体系,加上处理后再采用graph-based方法就能得到非投射的句法树。)
为什么需要神经网络句法分析器?
因为:传统特征表示稀疏、不完全、计算代价大,SVM之类的线性分类器本身是很快的,但传统parser的95%时间都花在拼装查询特征上了。
从理论到代码的分析参考:http://www.hankcs.com/nlp/parsing/neural-network-based-dependency-parser.html
斯坦福依赖关系的英语解析
(斯坦福大学很多东西确实很牛,这里就不过多介绍了,下图2014那个就是)
分布式表示
- 我们将每个单词表示为一个d维稠密向量(如word2vec词向量)
- 相似的单词应该有相近的向量
- 同时,part-of-speech tags 词性标签(POS)和 dependency labels 依赖标签也表示为d维向量
- 较小的离散集也表现出许多语义上的相似性。
- NNS(复数名词)应该接近NN(单数名词)
- num(数值修饰语)应该接近amod(形容词修饰语)。
(分布式词向量其实往往咱们也将成就是认为是word2vec词向量,之前我也是...,分布式词向量其实就是上述说的,维度不是特别高,然后能表示语义相似的,word2vec词向量是一种分布式词向量,但是不等价)
对于Neural Dependency Parser,其输入特征通常包含三种:
- stack和buffer中的单词及其dependent word
- 单词的part-of-speech tag
- 描述语法关系的arc label
传统方法拼接单词、词性、依存标签,新方法拼接它们的向量表示:
我们将其转换为词向量并将它们联结起来作为输入层,再经过若干非线性的隐藏层,最后加入softmax layer得到shift-reduce解析器的动作
模型体系结构
句子结构的依存分析
神经网络可以准确地确定句子的结构,支持解释
Chen&Manning的工作被许多人继续往前推进,走在最前沿的是Google。趋势是:
- 更大、更深的且调参调得更好的神经网络
- Beam Search 更多的探索动作序列的可能性,而不是只考虑当前的最优
- 全局、条件随机场(CRF)的推理出决策序列
这就引出了SyntaxNet和Parsey McParseFace模型
事实上,在深度学习调参数和更换结构中我们应该冷静一些,花费了大量的人力物力却仅有1%左右的提升~
基于图的依赖关系分析器
- 为每条边的每一个可能的依赖关系计算一个分数
- 然后将每个单词的边缘添加到其得分最高的候选头部
- 并对每个单词重复相同的操作
- 在神经模型中为基于图的依赖分析注入活力
- 为神经依赖分析设计一个双仿射评分模型
- 也使用神经序列模型,我们将在下周讨论
- 取得了非常棒的结果
- 但是比简单的基于神经传递的解析器要慢
- 在一个长度为 n 的句子中可能有n^2个依赖项
一个可以实现词性标注和依赖分析的网站:https://hanlp.hankcs.com/?sentence=徐先生还具体帮助他确定了把画雄鹰、松鼠和麻雀作为主攻目标%E3%80%82