赞
踩
1、句法分析的基本概念
句法分析不是一个自然语言处理任务的最终目标,但它往往是实现最终目标的关键环节。目的:
句法分析分为句法结构分析和依存关系分析两种。以获取整个句子的句法结构为目的的称为完全句法分析,而以获得局部成分为目的的语法分析称为局部分析,依存关系分析简称依存分析。
主要任务有三种:判断输出的字符串是否属于某种语言
消除输入句子中词法和结构等方面的歧义
分析输入句子的内部结构,如成分构成、上下文关系等
句法分析有两个要素:
语法形式化属于句法理论研究的范畴,主要包括:上下文无关文法(CFG) | 基于约束的文法(合一文法)
2、句法结构分析方法
主要分为:基于规则的分析方法 | 基于统计的分析方法 两大类
基于规则的分析方法:人工组织语法规则,建立语法知识库
通过条件约束和检查来实现句法结构歧义的消除
泛化能力差、但针对特定领域能够实现有效消歧 和 超语法现象、在程序语言中还可以在自然语言中受限。
句法分析树形成:自上而下 | 自下而上 | 两者结合 三类。基于规则的分析方法,对于特定领域和目的有针对性的设计规则,能够更好克服句子的歧义和超语法现象。
完全语法分析:介绍 Probabilistic Context Free Grammar ,即PCFG算法,基于概率的句法分析,融合了规则和统计两种
浅层语法分析(局部语法分析):完全语法分析由于句子成分复杂难以达到让人满意的程度,为了降低难度同时又能提取一部分句子结构信息,只识别某些结构简单的句子成分,如非递归的名词短语、动词短语等,称为语块(chunk),主要任务有:
3、PCFG算法
概率上下文无关文法(PCFG)是一个五元组(N,∑,S,R,P):
PCFG是CFG的扩展,PCFG的规则表示形式为:A→α p,其中A为非终结符,p为A推导出α的概率,即p=P(A→α),该概率分布必须满足如下条件:
PCFG规则统计概率集实例:
三个假设条件:
PCFG三个问题:
PCFG模型不完全合理,比如初始非终结符的选取实际和上下文有关,基于此又提出了 PCFG_LA算法,即带隐含标记的PCFG算法,x就是隐含标记,xi的取值范围一般是人为设定的,一般取1~16之间的整数,而且PCFG-LA也类似于HMM模型,原始非终结符对应HMM模型中的观察输出,而隐含标记对应HMM模型中的隐含状态。
4、浅层语法分析(局部语法分析)
为避免完全语法分析中句子成分过于复杂的问题,同时又希望能够提取到句子成分的关系
基本名词短语(base NP)是语块中的一个重要类别,它指的是简单的、非嵌套的名词短语,不含有其他子项短语,并且base NP之间结构上是独立的。base NP识别就是一个二分类问题,将句子中成份简单分为baseNP和非base NP两类,方法有两种:
基本名词短语识别有几种方法:
5、依存语法分析
分析除句子的短语结构树之外,用词与词之间依存关系描述
一切结构语法现象可以概括为关联、组合和转位这三大核心。句法关联建立起词与词之间的从属关系,这种从属关系由支配词和从属词联结而成,谓语中的动词是句子的中心并支配别的成分,它本身不受其他任何成分支配。
依存语法的本质是一种结构语法,它主要研究以谓词为中心而构句时由深层语义结构映现为表层语法结构的状况及条件,谓词与体词之间的同现关系,并据此划分谓词的词类。
常用的依存于法结构图示有三种:
依存句法的四条公理:
四条公理相当于对依存图和依存树的形式约束:单一父节点、连通、无环和可投射,由此来保证句子的依存分析结果是一棵有根的树结构。(可投射:如果单词之间的依存弧画出来没有任何的交叉,就是可投射的)
为了便于理解,使用以下总结:
基于数据驱动的统计依存分析中具有代表性的三种方法:生成式依存分析方法、判别式依存分析方法和确定性依存分析方法
生成式依存分析方法采用联合概率模型生成一系列依存语法树并赋予其概率分值,然后采用相关算法找到概率打分最高的分析结果作为最后输出。
生成式依存分析模型使用起来比较方便,它的参数训练时只在训练集中寻找相关成分的计数,计算出先验概率。但是,生成式方法采用联合概率模型,再进行概率乘积分解时做了近似性假设和估计,而且,由于采用全局搜索,算法的复杂度较高,因此效率较低,但此类算法在准确率上有一定优势。但是类似于CYK算法的推理方法使得此类模型不易处理非投射性问题。
判别式依存分析方法采用条件概率模型,避开了联合概率模型所要求的独立性假设(考虑判别模型CRF舍弃了生成模型HMM的独立性假设),训练过程即寻找使目标函数(训练样本生成概率)最大的参数θ(类似Logistic回归和CRF)。
判别式方法不仅在推理时进行穷尽搜索,而且在训练算法上也具有全局最优性,需要在训练实例上重复句法分析过程来迭代参数,训练过程也是推理过程,训练和分析的时间复杂度一致。
确定性依存分析方法以特定的方向逐次取一个待分析的词,为每次输入的词产生一个单一的分析结果,直至序列的最后一个词。
这类算法在每一步的分析中都要根据当前分析状态做出决策(如判断其是否与前一个词发生依存关系),因此,这种方法又称决策式分析方法。
通过一个确定的分析动作序列来得到一个唯一的句法表达,即依存图(有时可能会有回溯和修补),这是确定性句法分析方法的基本思想。
短语结构树可以被一一对应地转换成依存关系树,反之则不然。因为一棵依存关系树可能会对应多棵短语结构树。
6、14种依存关系标注
7、句法分析代码实现
- from pyhanlp import *
-
-
- def demo_dependency_parser():
- # 这个在hanlp中就是
- """
- public static CoNLLSentence parseDependency(String sentence)
- {
- return NeuralNetworkDependencyParser.compute(sentence);
- }
- """
- sentence = HanLP.parseDependency("虽然提取出来的结果也算合理,但是还是不够准确,我希望的结果是{‘马克思的思想‘,‘恩格斯的理论‘}")
- for word in sentence.iterator(): # 通过dir()可以查看sentence的方法
- print("%s --(%s)--> %s" % (word.LEMMA, word.DEPREL, word.HEAD.LEMMA))
- print()
-
- # 也可以直接拿到数组,任意顺序或逆序遍历
- word_array = sentence.getWordArray()
- for word in word_array:
- print("%s --(%s)--> %s" % (word.LEMMA, word.DEPREL, word.HEAD.LEMMA))
- print()
-
- # 还可以直接遍历子树,从某棵子树的某个节点一路遍历到虚根
- CoNLLWord = JClass("com.hankcs.hanlp.corpus.dependency.CoNll.CoNLLWord")
- head = word_array[12]
- while head.HEAD:
- head = head.HEAD
- if (head == CoNLLWord.ROOT):
- print(head.LEMMA)
- else:
- print("%s --(%s)--> " % (head.LEMMA, head.DEPREL))
-
- if __name__ == "__main__":
- demo_dependency_parser()
-
-
- """ 只打印第一个结果
- 虽然 --(状中结构)--> 算
- 提取 --(定中关系)--> 结果
- 出来 --(动补结构)--> 提取
- 的 --(右附加关系)--> 提取
- 结果 --(主谓关系)--> 算
- 也 --(状中结构)--> 算
- 算 --(核心关系)--> ##核心##
- 合理 --(动宾关系)--> 算
- , --(标点符号)--> 算
- 但是 --(状中结构)--> 还是
- 还是 --(并列关系)--> 算
- 不够 --(状中结构)--> 准确
- 准确 --(动宾关系)--> 还是
- , --(标点符号)--> 还是
- 我 --(主谓关系)--> 希望
- 希望 --(定中关系)--> 结果
- 的 --(右附加关系)--> 希望
- 结果 --(主谓关系)--> 是
- 是 --(并列关系)--> 还是
- { --(标点符号)--> 是
- ‘ --(标点符号)--> 思想
- 马克思 --(定中关系)--> 思想
- 的 --(右附加关系)--> 马克思
- 思想 --(动宾关系)--> 是
- ‘ --(标点符号)--> 思想
- , --(标点符号)--> 思想
- ‘ --(标点符号)--> 理论
- 恩格斯 --(定中关系)--> 理论
- 的 --(右附加关系)--> 恩格斯
- 理论 --(并列关系)--> 思想
- ‘ --(标点符号)--> 理论
- } --(标点符号)--> 思想
- """
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。