资源链接: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 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最先提出。它将句子分析成一颗依存句法树,描述出各个词语之间的依存关系。也即指出了词语之间在句法上的搭配关系,这种搭配关系是和语义相关联的。
语法分析的主要方法:
句法结构分析方法可以分为基于规则的分析方法和基于统计的分析方法两大类。(还有深度学习方法~)
基于规则的句法结构分析方法的基本思路是,由人工组织语法规则,建立语法知识库,通过条件约束和检查来实现句法结构歧义的消除。基于规则的语法结构分析可以利用手工编写的规则分析出输入句子所有可能的句法结构。
根据句法分析树形成方向的区别,人们通常将这些方法划分为三种类型:自顶向下的分析方法,自底向上的分析方法和两者相结合的分析方法。自顶向下分析算法实现的是规则推导的过程,分析树从根结点开始不断生长,最后形成分析句子的叶结点。而自底向上分析算法的实现过程恰好相反,它是从句子符号串开始,执行不断规约的过程,最后形成根节点。
基于概率上下文无关文法的短语结构分析方法,可以说是目前最成功的语法驱动的统计句法分析方法,可以认为是规则方法与统计方法的结合。
通常使用的指标包括无标记依存正确率(unlabeled attachment score,UAS)、带标记依存正确率(labeled attachment score, LAS)、依存正确率(dependency accuracy,DA)、根正确率(root accuracy,RA)、完全匹配率(complete match,CM)等。这些指标的具体意思如下:
(了解这部分内容后听课就舒服多了...)
如何描述语法,有两种主流观点,其中一种是短语结构文法,英文术语是:Constituency = phrase structure grammar = context-free grammars (CFGs).
句子是使用逐步嵌套的单元构建的
其实就是这种短语语法用固定数量的rule分解句子为短语和单词、分解短语为更短的短语或单词
例如:(其实感觉和编译原理中的语法树很像)
另一种类似于下图所示:(用单词之间的依存关系来表达语法。如果一个单词修饰另一个单词,则称该单词依赖于另一个单词)
视频中的样例:
为了能够正确地解释语言,我们需要理解句子结构
人类通过将单词组合成更大的单元来传达复杂的意思,从而交流复杂的思想
我们需要知道什么与什么相关联
除非我们知道哪些词是其他词的参数或修饰词,否则我们无法弄清楚句子是什么意思
下面将介绍各种歧义现象
例如:
两种解释:
警察用刀杀了那个男子
警察杀了那个有刀的男子
再看一个例子:
from space到底修饰的是count还是whales?
这就是人类语言和编程语言中不同的地方,关键的解析决策是我们如何 “依存” 各种成分,介词短语、状语或分词短语、不定式、协调等。
很难确定如何把一个短语(介词短语、状语短语、分词短语、不定式)依附到其他成分上去,如下样例:
每个括号中都是一个短语,它们依附的对象各不相同。对于n个短语来讲,组成的树形结构有Cn=(2n)!/[(n+1)!n!]。这是Catalan数,指数级增长。
具体解释样例:共有四个短语
样例:
再例如:
样例:
Students get first hand job experience
两种情况:
样例:
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中的两种典型的树结构
短语结构树用来表达句子的句法结构,其只有叶子结点与输入句子中的词语相关联,其他中间结点都是标记短语成分。
依存树用来表达句子中词与词的依存关系,具体地,分析识别句子中的“主谓宾”、“定状补”等语法成分。其每个结点都是一个词语。
名词解释
依赖结构的概念可以追溯到很久以前
选区/上下文无关文法是一个新奇的发明
现代依赖工作经常源于 L. Tesnière(1959)
NLP中最早类型的解析器在美国
(翻译课件的内容,想详细了解的可以自己了解了解)
人们对箭头指向的方式不一致:有些人把箭头朝一个方向画;有人是反过来的
Tesnière 从头开始指向依赖,本课使用此种方式
通常添加一个伪根指向整个句子的头部,这样每个单词都精确地依赖于另一个节点
虽然上下文无关文法(编译原理中的上下文无关文法)中的语法集很容易写,无非是有限数量的规则的集合而已,但人工费时费力标注的树库却茁壮成长了起来。在1993年首次面世的Universal Dependencies treebanks如今在Google的赞助下发布了2.0,其授权大多是署名-相同方式共享,覆盖了全世界绝大多数语言(不包括简体中文)。
其官网是:http://universaldependencies.org/
树库的样例:
课件解释:
某大佬文章中感觉更容易理解的说法:人们偏好树库多于规则的原因是显而易见的,树库虽然标注难度高,但每一份劳动都可被复用(可以用于词性标注命名实体识别等等任务);而每个人编写的规则都不同,并且死板又丑陋。树库的多用性还是得其作为评测的标杆数据,得到了越来越多的引用。
双词汇亲和/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
一个句式是通过为每个单词选择另一个单词(包括词根)来解析的。通常有如下的限制:
样例:
是否可以将一个依存句法树还原成句子?答案:否定的。(课堂问答)
上述了解了一下箭头是否可以交叉,然后课程中具体说明了一下不可以交叉的情况。
定义:当单词按线性顺序排列时,没有交叉的依赖弧,所有的弧都在单词的上方
与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) 指导下的依存贪婪选择。已证明非常有效。
主流方法,基于贪心决策动作拼装句法树。
他是一种简单的贪婪判别依赖分析器
附上一个大佬的相关链接(不是很明白的可以去看一看)https://www.hankcs.com/nlp/parsing/neural-network-based-dependency-parser.html/2#h2-6
MaltParser模型
我们需要解释如何选择下一步行动
每个动作都由一个有区别分类器(例如softmax classifier)对每个合法的移动进行预测
在最简单的形式中是没有搜索的
该模型的精度略低于依赖解析的最高水平,但它提供了非常快的线性时间解析,性能非常好
传统的特征表示使用二元的稀疏向量,一个超长的稀疏01向量。
正确率平均应该包括标记的评价和依赖关系的评价~
其中,UAS (unlabeled attachment score) 指 无标记依存正确率 ,LAS (labeled attachment score) 指 有标记依存正确率
(上面讲述了投射性的,现在讲解非投射性的~)
我们提出的弧标准算法只构建投影依赖树
头部可能的方向
(这一章没怎么讲,大概意思就是:CFG转换得到的依存树一定是投射性的,但依存理论允许非投射性的依存句法树,因为一些语义需要通过非投射性表达;arc-standard算法只能拼装投射性的句法树,但换个体系,加上处理后再采用graph-based方法就能得到非投射的句法树。)
因为:传统特征表示稀疏、不完全、计算代价大,SVM之类的线性分类器本身是很快的,但传统parser的95%时间都花在拼装查询特征上了。
从理论到代码的分析参考:http://www.hankcs.com/nlp/parsing/neural-network-based-dependency-parser.html
(斯坦福大学很多东西确实很牛,这里就不过多介绍了,下图2014那个就是)
(分布式词向量其实往往咱们也将成就是认为是word2vec词向量,之前我也是...,分布式词向量其实就是上述说的,维度不是特别高,然后能表示语义相似的,word2vec词向量是一种分布式词向量,但是不等价)
对于Neural Dependency Parser,其输入特征通常包含三种:
传统方法拼接单词、词性、依存标签,新方法拼接它们的向量表示:
我们将其转换为词向量并将它们联结起来作为输入层,再经过若干非线性的隐藏层,最后加入softmax layer得到shift-reduce解析器的动作
神经网络可以准确地确定句子的结构,支持解释
Chen&Manning的工作被许多人继续往前推进,走在最前沿的是Google。趋势是:
这就引出了SyntaxNet和Parsey McParseFace模型
事实上,在深度学习调参数和更换结构中我们应该冷静一些,花费了大量的人力物力却仅有1%左右的提升~
一个可以实现词性标注和依赖分析的网站:https://hanlp.hankcs.com/?sentence=徐先生还具体帮助他确定了把画雄鹰、松鼠和麻雀作为主攻目标%E3%80%82