资源链接: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)等。这些指标的具体意思如下:
无标记依存正确率(UAS):测试集中找到其正确支配词的词(包括没有标注支配词的根结点)所占总词数的百分比。 带标记依存正确率(LAS):测试集中找到其正确支配词的词,并且依存关系类型也标注正确的词(包括没有标注支配词的根结点)占总词数的百分比。 依存正确率(DA):测试集中找到正确支配词非根结点词占所有非根结点词总数的百分比。 根正确率(RA):有二种定义,一种是测试集中正确根结点的个数与句子个数的百分比。另一种是指测试集中找到正确根结点的句子数所占句子总数的百分比。 完全匹配率(CM):测试集中无标记依存结构完全正确的句子占句子总数的百分比。(了解这部分内容后听课就舒服多了...)
如何描述语法,有两种主流观点,其中一种是短语结构文法,英文术语是:Constituency = phrase structure grammar = context-free grammars (CFGs).
句子是使用逐步嵌套的单元构建的
短语结构将单词组织成嵌套的成分起步单元:单词被赋予一个类别 (part of speech=pos 词性)单词组合成不同类别的短语短语可以递归地组合成更大的短语其实就是这种短语语法用固定数量的rule分解句子为短语和单词、分解短语为更短的短语或单词 例如:(其实感觉和编译原理中的语法树很像)
另一种类似于下图所示:(用单词之间的依存关系来表达语法。如果一个单词修饰另一个单词,则称该单词依赖于另一个单词)
视频中的样例:
look是整个句子的根源,look依赖于cratein,the,large都是是crate的依赖in the kitchen是crate的修饰in,the都是kitchen的依赖by the door是crate的依赖为了能够正确地解释语言,我们需要理解句子结构 人类通过将单词组合成更大的单元来传达复杂的意思,从而交流复杂的思想 我们需要知道什么与什么相关联 除非我们知道哪些词是其他词的参数或修饰词,否则我们无法弄清楚句子是什么意思
下面将介绍各种歧义现象
例如:
两种解释:
警察用刀杀了那个男子
cops是kill的主语/subjectman是kill的宾语/objectknife是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 修饰 acquisitionat 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样例:
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 从头开始指向依赖,本课使用此种方式 通常添加一个伪根指向整个句子的头部,这样每个单词都精确地依赖于另一个节点
虽然上下文无关文法(编译原理中的上下文无关文法)中的语法集很容易写,无非是有限数量的规则的集合而已,但人工费时费力标注的树库却茁壮成长了起来。在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样例:
是否可以将一个依存句法树还原成句子?答案:否定的。(课堂问答)
上述了解了一下箭头是否可以交叉,然后课程中具体说明了一下不可以交叉的情况。
定义:当单词按线性顺序排列时,没有交叉的依赖弧,所有的弧都在单词的上方 与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模型
我们需要解释如何选择下一步行动
Answer:机器学习每个动作都由一个有区别分类器(例如softmax classifier)对每个合法的移动进行预测
最多三种无类型的选择,当带有类型时,最多 [公式] 种Features:栈顶单词,POS;buffer中的第一个单词,POS;等等在最简单的形式中是没有搜索的
但是,如果你愿意,你可以有效地执行一个 Beam search 束搜索(虽然速度较慢,但效果更好):你可以在每个时间步骤中保留 k个好的解析前缀该模型的精度略低于依赖解析的最高水平,但它提供了非常快的线性时间解析,性能非常好
传统的特征表示使用二元的稀疏向量,一个超长的稀疏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那个就是)
(分布式词向量其实往往咱们也将成就是认为是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%左右的提升~
一个可以实现词性标注和依赖分析的网站:https://hanlp.hankcs.com/?sentence=徐先生还具体帮助他确定了把画雄鹰、松鼠和麻雀作为主攻目标%E3%80%82
