大家好,今天跟大家介绍依存句法分析的相关知识。
- 知识介绍
- 代码示例
一、知识介绍
句法分析是自然语言处理中的关键技术之一,其基本任务是确定句子的句法结构或者句子中词汇之间的依存关系。 主要包括两方面的内容:
一是确定语言的语法体系,即对语言中合法的句子的语法结构给与形式化的定义;
二是句法分析技术,即根据给定的语法体系,自动推导出句子的句法结构,分析句子所包含的句法单位和这些句法单位之间的关系。
根据句法结构的表示形式不同,最常见的句法分析任务可以分为以下三种:
1、句法结构分析(syntactic structure parsing),又称短语结构分析(phrase structure parsing),也叫成分句法分析(constituent syntactic parsing)。作用是识别出句子中的短语结构以及短语之间的层次句法关系。
**2、依存关系分析,**又称依存句法分析(dependency syntactic parsing),简称依存分析,作用是识别句子中词汇与词汇之间的相互依存关系。
3、深层文法句法分析,即利用深层文法,例如词汇化树邻接文法(Lexicalized Tree Adjoining Grammar, LTAG)、词汇功能文法(Lexical Functional Grammar, LFG)、组合范畴文法(Combinatory Categorial Grammar, CCG)等,对句子进行深层的句法以及语义分析。
依存分析器的性能评价:
通常使用的指标包括无标记依存正确率(unlabeled attachment score,UAS)、带标记依存正确率(labeled attachment score, LAS)、依存正确率(dependency accuracy,DA)、根正确率(root accuracy,RA)、完全匹配率(complete match,CM)等。这些指标的具体意思如下:
1、无标记依存正确率(UAS):测试集中找到其正确支配词的词(包括没有标注支配词的根结点)所占总词数的百分比。
2、带标记依存正确率(LAS):测试集中找到其正确支配词的词,并且依存关系类型也标注正确的词(包括没有标注支配词的根结点)占总词数的百分比。
3、依存正确率(DA):测试集中找到正确支配词非根结点词占所有非根结点词总数的百分比。
4、根正确率(RA):有二种定义,一种是测试集中正确根结点的个数与句子个数的百分比。另一种是指测试集中找到正确根结点的句子数所占句子总数的百分比。
5、完全匹配率(CM):测试集中无标记依存结构完全正确的句子占句子总数的百分比。
依存句法分析
1、概念
依存句法通过分析语言单位内成分之前的依存关系解释其句法结构,主张句子中核心动词是支配其他成分的中心成分。而它本身却不受其他任何成分的支配,所有受支配成分都以某种关系从属于支配者。
2、五个条件
(1)一个句子中只有一个成分是独立的
(2)句子的其他成分都从属于某一成分
(3)任何一个成分都不能依存于两个或两个以上的成分
(4)如果成分A直接从属成分B,而成分C在句子中位于A和B之间,那么,成分C或者从属于A,或者从属于B,或者从属于A和B之间的某一成分
(5)中心成分左右两边的其他成分相互不发生关系
3、句法分析表
二、示例代码
# -*- coding: utf-8 -*-
import os
## 加载模型文件
LTP_DATA_DIR = 'E:\Python\pyltp\ltp\ltp\ltp_data' # ltp模型目录的路径
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model') # 词性标注模型路径,模型名称为`pos.model`
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model') # 分词模型路径,模型名称为`cws.model`
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model') # 依存句法分析模型路径,模型名称为`parser.model`
## 分词
from pyltp import Segmentor
segmentor = Segmentor() # 初始化实例
segmentor.load_with_lexicon(cws_model_path,'dict1.txt') # 加载模型
words = list(segmentor.segment('今天天气很好,大家可以适当出去,但是要注意防护哦')) # 分词
segmentor.release() # 释放模型
print(words)
## 词性标注
from pyltp import Postagger
postagger = Postagger() # 初始化实例
postagger.load(pos_model_path) # 加载模型
postags = postagger.postag(words) # 词性标注
tags= list(''.join(postags))
#print (tags)
postagger.release() # 释放模型
## 依存句法分析
from pyltp import Parser
parser = Parser() # 初始化实例
parser.load(par_model_path) # 加载模型
arcs = parser.parse(words, postags) #句法分析
print ('arcs 的结果:','\t'.join("%d:%s" % (arc.head, arc.relation) for arc in arcs))