中文句法分析及LTP使用

目录

一、中文句法分析内容概述

二、使用LTP实现句法分析

1、LTP基础

2、pyltp安装

3、代码实现

4、LTP标注集参考


今天是1024,首先,祝大家节日快乐!😊😊 ……                                                  中文句法分析,先分析下面的一句话再进入正题哈哈(🙂🙂):博客技术交流加QQ群:955817470

分析结果如下:

从分析结果我们可以看到每个词的词性以及句法结构,比如:交流和加这两个词构成了主谓关系(SBV),加和群这两个词构成了动宾关系(VOB),通过该结果可以分析句子的组成成分等。这个其实就是依存句法分析的一个例子,接下来看正文 ……

一、中文句法分析内容概述

主要任务:

  • 词法分析:分句、分词、词性标注、命名实体识别
  • 句法分析:依存句法分析
  • 语义分析:语义角色标注、语义依存分析

1、分句

 一般可以根据标点符号正则表达式进行分句。

2、分词

中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。

3、词性标注

词性(part-of-speech)是词汇基本的语法属性,通常也称为词性。

词性标注(part-of-speech tagging)又称为词类标注或者简称标注,是指为分词结果中的每个单词标注一个正确的词性的程序,也即确定每个词是名词、动词、形容词或者其他词性的过程。词性标注是很多NLP任务的预处理步骤,如句法分析,经过词性标注后的文本会带来很大的便利性,但也不是不可或缺的步骤。

词性标注主要可以分为基于规则和基于统计的方法,下面列举几种统计方法:基于最大熵的词性标注、基于统计最大概率输出词性、基于HMM的词性标注。

词性标注的应用:句法分析预处理、词汇获取预处理、信息抽取预处理。

4、命名实体识别

命名实体识别(Named Entity Recognition,NER)是将文本中的元素分成预先定义的类,如人名、地名、 机构名、时间、货币等等。作为自然语言的承载信息单位,命名实体识别 属于文本信息处理的基础的研究领域,是信息抽取、信息检索、机器翻译、 问答系统等多种自然语言处理技术中必不可少的组成部分。

5、依存句法分析

依存语法 (Dependency Parsing, DP) 通过分析语言单位内成分之间的依存关系揭示其句法结构。 直观来讲,依存句法分析识别句子中的“主谓宾”、“定状补”这些语法成分,并分析各成分之间的关系。

6、语义角色标注

语义角色标注(Semantic Role Labeling,SRL)是一种浅层的语义分析技术,标注句子中某些短语为给定谓词的论元 (语义角色) ,如施事、受事、时间和地点等。其能够对问答系统、信息抽取和机器翻译等应用产生推动作用。

7、语义依存分析

语义依存分析 (Semantic Dependency Parsing, SDP),分析句子各个语言单位之间的语义关联,并将语义关联以依存结构呈现。 使用语义依存刻画句子语义,好处在于不需要去抽象词汇本身,而是通过词汇所承受的语义框架来描述该词汇,而论元的数目相对词汇来说数量总是少了很多的。

语义依存分析目标是跨越句子表层句法结构的束缚,直接获取深层的语义信息。

二、使用LTP实现句法分析

1、LTP基础

LTP提供了一系列中文自然语言处理工具,用户可以使用这些工具对于中文文本进行分词、词性标注、句法分析等工作。

LTP官网  ;LTP GitHub ;pyltp使用教程

2、pyltp安装

环境:Linux

准备:LTP模型下载

安装pyltp:pip install pyltp

注:安装成功之后,尝试import pyltp,可能报错:undefined symbol: _ZTISt19__codecvt_utf8_baseIwE

解决方法如下(参看方法):

cd ~/anaconda2/lib
rm libstdc++.so.6.0.19
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 libstdc++.so.6.0.19

3、代码实现

pyltp实现分句、分词、词性标注、命名实体识别、依存句法分析、语义角色标注,代码如下(ltp_analyze.py):

#!/usr/bin/env python
# coding=utf-8
import importlib,sys
importlib.reload(sys)
import os
from pyltp import SentenceSplitter,Segmentor, Postagger, NamedEntityRecognizer, Parser,SementicRoleLabeller,CustomizedSegmentor
#分句
def sentence_split(text):
    sents = SentenceSplitter.split(text)  # 分句
    print('\n'.join(sents))

class LtpModelAnalysis(object):
    def __init__(self, model_dir="/mnt/f/model/ltp_model/ltp_data_v3.4.0/"):
        self.segmentor = Segmentor()
        self.segmentor.load(os.path.join(model_dir, "cws.model"))  #加载分词模型
        #使用自定义词典
        #self.segmentor.load_with_lexicon(os.path.join(model_dir, "cws.model"), 'lexicon')  # 加载分词模型,第二个参数是外部词典文件路径
        #使用个性化分词模型  #pyltp支持使用用户训练好的个性化模型
        #customized_segmentor = CustomizedSegmentor()  # 初始化实例
        #customized_segmentor.load(os.path.join(model_dir, "cws.model"), 'customized_model')  # 加载模型,第二个参数是增量模型的路径
        #个性化分词模型的同时也可以使用外部词典
        #customized_segmentor = CustomizedSegmentor()  # 初始化实例
        #customized_segmentor.load_with_lexicon(os.path.join(model_dir, "cws.model"), 'customized_model','lexicon')

        self.postagger = Postagger()
        self.postagger.load(os.path.join(model_dir, "pos.model"))  #加载词性标注模型

        self.recognizer=NamedEntityRecognizer()
        self.recognizer.load(os.path.join(model_dir, "ner.model")) #加载命名实体识别模型

        self.parser = Parser()
        self.parser.load(os.path.join(model_dir, "parser.model"))  #加载依存句法分析模型

        self.labeller=SementicRoleLabeller()
        self.labeller.load(os.path.join(model_dir, "pisrl.model")) #加载语义角色标注模型

    def analyze(self, text):
        #分词
        words = self.segmentor.segment(text)
        print( '\t'.join(words))

        #词性标注
        postags = self.postagger.postag(words)
        print( '\t'.join(postags))

        #命名实体识别
        netags = self.recognizer.recognize(words, postags)  # 命名实体识别
        print('\t'.join(netags))

        #句法分析
        arcs = self.parser.parse(words, postags)
        print("\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs)) #arc.head 表示依存弧的父节点词的索引,arc.relation 表示依存弧的关系。
        arcs_list=[]

        #语义角色标注
        roles = self.labeller.label(words, postags, arcs) #arcs 使用依存句法分析的结果
        for role in roles:
            print(role.index, "".join(["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments]))

    def release_model(self):
        # 释放模型
        self.segmentor.release()
        self.postagger.release()
        self.recognizer.release()
        self.parser.release()
        self.labeller.release()

if __name__ == '__main__':
    text="你觉得我的博客写的怎么样?进一步交流请加QQ群:955817470"
    ltp = LtpModelAnalysis()
    ltp.analyze(text)
    ltp.release_model()
    #sentence_split(text)

分词、词性标注、命名实体识别、依存句法分析、语义角色标注运行结果如下:

(1)依存句法结果分析

2:SBV   0:HED   5:ATT   3:RAD   6:SBV   8:ATT   6:RAD   2:VOB   2:WP    11:ADV  2:COO   11:COO  12:VOB  15:ATT  13:VOB 15:WP    13:COO
  • arc.head 表示依存弧的父节点词的索引。ROOT节点的索引是0,第一个词开始的索引依次为1、2、3…
  • arc.relation 表示依存弧的关系。

(2)语音角色标注结果分析

1 A0:(0,0)A1:(2,7)
5 A1:(2,4)
10 ADV:(9,9)A1:(13,15)
11 A2:(12,16)
12 A1:(13,15)
  • 第一个词开始的索引依次为0、1、2…
  • 返回结果 roles 是关于多个谓词的语义角色分析的结果。由于一句话中可能不含有语义角色,所以结果可能为空。
  • role.index 代表谓词的索引, role.arguments 代表关于该谓词的若干语义角色。
  • arg.name 表示语义角色类型,arg.range.start 表示该语义角色起始词位置的索引,arg.range.end 表示该语义角色结束词位置的索引。

4、LTP标注集参考

(1)词性标注集

LTP 使用的是863词性标注集,其各个词性含义如下表

Tag Description Example Tag Description Example
a adjective 美丽 ni organization name 保险公司
b other noun-modifier 大型, 西式 nl location noun 城郊
c conjunction 和, 虽然 ns geographical name 北京
d adverb nt temporal noun 近日, 明代
e exclamation nz other proper noun 诺贝尔奖
g morpheme 茨, 甥 o onomatopoeia 哗啦
h prefix 阿, 伪 p preposition 在, 把
i idiom 百花齐放 q quantity
j abbreviation 公检法 r pronoun 我们
k suffix 界, 率 u auxiliary 的, 地
m number 一, 第一 v verb 跑, 学习
n general noun 苹果 wp punctuation ,。!
nd direction noun 右侧 ws foreign words CPU
nh person name 杜甫, 汤姆 x non-lexeme 萄, 翱

(2)命名实体识别标注集

LTP 采用 BIESO 标注体系。B 表示实体开始词,I表示实体中间词,E表示实体结束词,S表示单独成实体,O表示不构成命名实体。

LTP 提供的命名实体类型为:人名(Nh)、地名(Ns)、机构名(Ni)

标记 含义
O 这个词不是NE
S 这个词单独构成一个NE
B 这个词为一个NE的开始
I 这个词为一个NE的中间
E 这个词位一个NE的结尾

 (3)依存句法关系

关系类型 Tag Description Example
主谓关系 SBV subject-verb 我送她一束花 (我 <– 送)
动宾关系 VOB 直接宾语,verb-object 我送她一束花 (送 –> 花)
间宾关系 IOB 间接宾语,indirect-object 我送她一束花 (送 –> 她)
前置宾语 FOB 前置宾语,fronting-object 他什么书都读 (书 <– 读)
兼语 DBL double 他请我吃饭 (请 –> 我)
定中关系 ATT attribute 红苹果 (红 <– 苹果)
状中结构 ADV adverbial 非常美丽 (非常 <– 美丽)
动补结构 CMP complement 做完了作业 (做 –> 完)
并列关系 COO coordinate 大山和大海 (大山 –> 大海)
介宾关系 POB preposition-object 在贸易区内 (在 –> 内)
左附加关系 LAD left adjunct 大山和大海 (和 <– 大海)
右附加关系 RAD right adjunct 孩子们 (孩子 –> 们)
独立结构 IS independent structure 两个单句在结构上彼此独立
核心关系 HED head 指整个句子的核心

(4)语义角色类型

语义角色类型 说明
ADV adverbial, default tag ( 附加的,默认标记 )
BNE beneficiary ( 受益人 )
CND condition ( 条件 )
DIR direction ( 方向 )
DGR degree ( 程度 )
EXT extent ( 扩展 )
FRQ frequency ( 频率 )
LOC locative ( 地点 )
MNR manner ( 方式 )
PRP purpose or reason ( 目的或原因 )
TMP temporal ( 时间 )
TPC topic ( 主题 )
CRD coordinated arguments ( 并列参数 )
PRD predicate ( 谓语动词 )
PSR possessor ( 持有者 )
PSE possessee ( 被持有 )

 

Asia-Lee的博客

句法分析可视化软件 

腾讯文智中文语义平台

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章