pyltp包学习

107 阅读13分钟

零、资料

官方文档:

github.com/HIT-SCIR/py…

文章:

zhuanlan.zhihu.com/p/201124690

blog.csdn.net/weixin_4479…

一、附录说明

1.1 词性标注集

TagDescriptionExampleTagDescriptionExample
aadjective美丽niorganization name保险公司
bother noun-modifier大型, 西式nllocation noun城郊
cconjunction和, 虽然nsgeographical name北京
dadverbnttemporal noun近日, 明代
eexclamationnzother proper noun诺贝尔奖
gmorpheme茨, 甥oonomatopoeia哗啦
hprefix阿, 伪ppreposition在, 把
iidiom百花齐放qquantity
jabbreviation公检法rpronoun我们
ksuffix界, 率uauxiliary的, 地
mnumber一, 第一vverb跑, 学习
ngeneral noun苹果wppunctuation,。!
nddirection noun右侧wsforeign wordsCPU
nhperson name杜甫, 汤姆xnon-lexeme萄, 翱
************zdescriptive words瑟瑟,匆匆

1.2 命名实体识别标注集

标记含义
Nh人名
Ni机构名
Ns地名

1.3 语义角色类型

关系类型TagDescriptionExample
ARG0causers or experiencers施事者、主体、触发者[政府 ARG0]鼓励个人投资服务业。
ARG1patient受事者政府鼓励[个人 ARG1]投资服务业。
ARG2range语义角色2政府鼓励个人[投资服务业 ARG2]。
ARG3starting point语义角色3巴基斯坦[对谈判前景 ARG3]表示悲观。
ARG4end point语义角色4产检部门将产检时间缩短到[一至三天 ARG4]。
ADVadverbial状语我们[即将 ADV]迎来新年。
BNFbeneficiary受益人义务[为学童及老师 BNF]做超音波检查 。
CNDcondition条件[如果早期发现 CND],便能提醒当事人注意血压的变化。
CRDcoordinated arguments并列跟南韩、[跟美国 CRD]谋求和平关系的举动也更加积极。
DGRdegree程度贫铀弹含有放射性比铀强[20万倍 DGR]。
DIRdirection方向[从此处 DIR] 我们可以发现寇克斯报告的精髓。
DISdiscourse marker会话标记警方上午针对目击者做笔录,[而 DIS]李士东仍然不见踪影。
EXTextent范围回归3年多[来 EXT] ,香港成为台商对大陆贸易的财务运作及资金调度中心。
FRQfrequency频率这类听证会在赖昌兴拘押期间每30天举行[一次 FRQ]。
LOClocative地点请听美国之音特邀记者康妮[在加拿大温哥华 LOC]发来的报道。
MNRmanner方式以便他能继续[作为俄罗斯官员 MNR]从事他在一个特殊机构中的工作。
PRPpurpose or reason目的执政党和在野党[为了应付这场攻守战 PRP]都发出了紧急动员令。
QTYquantity数量每年创汇[100万 QTY]美元。
TMPtemporal时间[下星期 TMP]布什将提出一项周密计划。
TPCtopic话题[这么大的事情 TPC],你怎么不和我说?
PRDpredicate谓语动词****
PSRpossessor持有者****
PSEpossessee被持有****

1.4 依存句法关系

关系类型TagDescriptionExample
主谓关系SBVsubject-verb我送她一束花 (我 <– 送)
动宾关系VOB直接宾语,verb-object我送她一束花 (送 –> 花)
间宾关系IOB间接宾语,indirect-object我送她一束花 (送 –> 她)
前置宾语FOB前置宾语,fronting-object他什么书都读 (书 <– 读)
兼语DBLdouble他请我吃饭 (请 –> 我)
定中关系ATTattribute红苹果 (红 <– 苹果)
状中结构ADVadverbial非常美丽 (非常 <– 美丽)
动补结构CMPcomplement做完了作业 (做 –> 完)
并列关系COOcoordinate大山和大海 (大山 –> 大海)
介宾关系POBpreposition-object在贸易区内 (在 –> 内)
左附加关系LADleft adjunct大山和大海 (和 <– 大海)
右附加关系RADright adjunct孩子们 (孩子 –> 们)
独立结构ISindependent structure两个单句在结构上彼此独立
核心关系HEDhead指整个句子的核心

1.5 语义依存关系

角色系统标签表示概念说明&举例
语 义 周 边 角 色主体 角色施事 AGT指发出具体行为动作的主体或动作持续以及表现心理活动的有意识的主体,具有主观能动性。如:明天我将去看他。(看,我,施事AGT)
当事 EXP指非行为动作的发出者,不具有主观能动性。包括无意识运动的主体、非可控运动的主体以及各种关系的主体。如:宝塔很高。(高,宝塔,当事EXP)
客体 角色受事 PAT指受主体的行为动作所改变的直接客体。一般与施事相对应,是受施事影响而导致位置、性质、结果等发生改变的对象,最明显的语义特征是具有被动性。如:从桌子上把书拿走。(拿走,书,受事PAT)
客事 CONT指事件所涉及但是并未改变的客体以及动作行为产生的新事物或结果。如:我相信苏珊的话。(相信,话,客事CONT)
涉事 DATV也称与事,是动作行为的非主动参与者,也可以说,涉事角色是语义事件的第三方参与者。从语义上说,是事件接受者、伴随者、来源者以及比较的基准等等;从句法上说,经常出现在双宾语句中的间接宾语位置。如:班长给他一套工具。(给,他,涉事DATV)
系事 LINK是跟事件的参与者有关系的客体。一般由表示某种关联的动词连接主客体,表达主客体之间的某种具体的、或抽象的关系。如:弟弟是中学生。(是,中学生,系事LINK)
情境 角色工具 TOOL是事件中所使用的工具。典型的工具角色主要由介词“用”等引出,通常是由物体充当,但是一些有生命的、或者是抽象的事物也可以作为事件所凭借的工具。如:妈妈用砂锅熬稀饭。(熬,砂锅,工具TOOL)
材料 MATL是事件中所使用的材料。如:学生们用纸折飞机。(折,纸,材料MATL)
方式 MANN包括事件中出现的方式、方法以及事件所依照的根据、凭借。如:军士齐声高喊。(高喊,齐声,方式MANN)
范围 SCO指事件中所关涉的方面、限定的界限、被审视的角度、发生作用的范围,通常都为抽象名词。一般由不同的介词引出,可以出现在“在……方面”、“在……角度上”、“在……中”等的结构中。如:数学方面他是专家。(是,方面,范围SCO)
缘由 REAS包括引起事件发生或发展变化的原因以及事件所要达到的目的。如:他因为堵车迟到了。(迟到,堵车,缘由REAS)
时间 TIME指事件发生所涉及到的各种时间因素。如:周一早上升旗。(升旗,早上,时间TIME)
空间 LOC指事件所涉及到的各种空间因素。如:我明天去哈尔滨。(去,哈尔滨,空间LOC)
度量 MEAS指事件中的数量,名量或动量。如:一年有365天。(天,365,度量MEAS)
状态 STAT表示事件发生时的情形、状态等。如:人类是从类人猿进化来的吗?。(进化,类人猿,状态STAT)
修饰FEAT包括描写主体属性、特征的标签以及、时间修饰语和名词修饰语的标签。如:她是个漂亮的女孩。(女孩,漂亮,修饰FEAT)
语 义 结 构 关 系反关系反关系指,当述谓概念转位修饰指称概念时,其述谓性质消失,增添了修饰性质,与中心语的关系相当于句法上的定中关系。需要注意的是,虽反关系的句法结构有变化,但是待标成分所充当的语义角色却是一样的。举例来说:①选手受伤了。(受伤,选手,当事EXP)②受伤的选手。(选手,受伤,反当事rEXP)反关系标签统一表示为r+语义周边角色标签,如rEXP,rLOC等等,此处不一一列举。
嵌套 关系一个事件作为一个整体概念被嵌套进另一个主体事件内,被嵌套的事件称为“降级”事件。有两种情况:1. 被嵌套的事件相当于一个论元。爷爷看见小孙女在操作计算机。(看见,操作,嵌套客事dCONT)2. 被嵌套的事件相当于一个修饰成分。爷爷拍摄了小孙女在操作计算机的照片。(照片,操作,嵌套客事dCONT)嵌套关系标签统一表示为d+语义周边角色标签,如dCONT,dPAT等等,此处不一一列举。
事件 关系并列关系eCOO指两个或多个平行的语义事件,重在叙述和描写。如:兄弟俩边走边说。(走,说,并列eCOO)
先行关系ePREC指在时间、空间上发生有序的事件或在逻辑、语义上关联性较强的先行发生的事件。如:要想成功,就要努力。(成功,努力,先行ePREC)
后继关系eSUCC主要描述语义上更进一步的结果类事件,包括时间、空间或逻辑、语义上后续发生的事件。如:他穿好衣服,走出门去。(穿,走,后继eSUCC)
语 义 依 附 标 记标点 标记标点标记mPUNC是对语义事件中的出现的标点符号的标注。如:他喜欢音乐。(喜欢,句号。,mPUNC)
依附 标记否定标记mNEG是对事件中否定关系的标记。如:她不像她母亲。(像,不,mNEG)
关系标记mRELA是对句法事件中各种关系的标记,如一些连词、介词等。如:但是我没有放弃看书。(放弃,但是,mRELA)
依附标记mDEPD****

二、实践

2.1 分句

from pyltp import SentenceSplitter
 
# 分句
doc = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。' \
      '盖茨原计划从明年1月9日至14日陆续访问中国和日本,目前,他决定在行程中增加对韩国的访问。莫莱尔表示,' \
      '盖茨在访韩期间将会晤韩国国防部长官金宽镇,就朝鲜近日的行动交换意见,同时商讨加强韩美两军同盟关系等问题,' \
      '拟定共同应对朝鲜挑衅和核计划的方案。'
 
# 分句
sents = SentenceSplitter.split(doc)
print(sents)
for i, sent in enumerate(sents):
    print(i, sent)

2.2 分词

import os
from pyltp import Segmentor
LTP_DATA_DIR = 'Z:/knowledge-graph/model/ltp_data_v3.4.0/'
 
cws_model_path = os.path.join(os.path.dirname(LTP_DATA_DIR), 'cws.model')  # 分词模型路径,模型名称为`cws.model`
# lexicon_path = os.path.join(os.path.dirname(LTP_DATA_DIR), 'lexicon.txt')  # 参数lexicon是自定义词典的文件路径
 
segmentor = Segmentor(cws_model_path)
# segmentor.load_with_lexicon(cws_model_path, lexicon_path)
 
sent = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。'
words = segmentor.segment(sent)  # 分词
print(type(words))  # type:是对象
print(words)  # type:是对象
print('/'.join(words))
 
segmentor.release()

2.3 词性标注

import os
from pyltp import Segmentor, Postagger
LTP_DATA_DIR = 'Z:/knowledge-graph/model/ltp_data_v3.4.0/'

# 分词
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')  # 分词模型路径,模型名称为`cws.model`
# lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt')  # 参数lexicon是自定义词典的文件路径
 
segmentor = Segmentor(cws_model_path)
 
# sent = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。'
# sent = '安妮可以走的位置有哪些?属于哪种类型的角色?'
sent = '孙悟空的师傅是谁'
words = segmentor.segment(sent)  # 分词
print(words)  # type: object
 
# 词性标注
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')  # 词性标注模型路径,模型名称为`pos.model`
 
postagger = Postagger(pos_model_path)  # 初始化实例
# postagger.load(pos_model_path)  # 加载模型
postags = postagger.postag(words)  # 词性标注
 
for word, postag in zip(words, postags):
    print(word, postag)
 
# 释放模型
segmentor.release()
postagger.release()
 
'''
词性标注结果说明
https://ltp.readthedocs.io/zh_CN/latest/appendix.html#id3
'''

2.4 命名实体识别

import os
from pyltp import Segmentor, Postagger
from pyltp import NamedEntityRecognizer
LTP_DATA_DIR = 'Z:/knowledge-graph/model/ltp_data_v3.4.0/'

# 分词
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')  # 分词模型路径,模型名称为`cws.model`
# lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt')  # 参数lexicon是自定义词典的文件路径
 
segmentor = Segmentor(cws_model_path)
# segmentor.load_with_lexicon(cws_model_path, lexicon_path)
 
# sent = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。'
sent = '孙悟空跟着唐僧去西天取经'
words = segmentor.segment(sent)  # 分词
print(list(words))
 
# 词性标注
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')  # 词性标注模型路径,模型名称为`pos.model`
 
postagger = Postagger(pos_model_path)  # 初始化实例
# postagger.load(pos_model_path)  # 加载模型
postags = postagger.postag(words)  # 词性标注
print(list(postags))
 
#  命名实体识别
ner_model_path = os.path.join(LTP_DATA_DIR, 'ner.model')  # 命名实体识别模型路径,模型名称为`pos.model`
 
recognizer = NamedEntityRecognizer(ner_model_path)  # 初始化实例
# recognizer.load(ner_model_path)  # 加载模型
# netags = recognizer.recognize(words, postags)  # 命名实体识别
# print(type(netags))  # type: object
 
# 提取识别结果中的人名,地名,组织机构名
persons, places, orgs = set(), set(), set()
 
netags = list(recognizer.recognize(words, postags))  # 命名实体识别
print(netags)

i = 0
for tag, word in zip(netags, words):
    j = i
    # 人名
    if 'Nh' in tag:
        if str(tag).startswith('S'):
            persons.add(word)
        elif str(tag).startswith('B'):
            union_person = word
            while netags[j] != 'E-Nh':
                j += 1
                if j < len(words):
                    union_person += words[j]
            persons.add(union_person)
    # 地名
    if 'Ns' in tag:
        if str(tag).startswith('S'):
            places.add(word)
        elif str(tag).startswith('B'):
            union_place = word
            while netags[j] != 'E-Ns':
                j += 1
                if j < len(words):
                    union_place += words[j]
            places.add(union_place)
    # 机构名
    if 'Ni' in tag:
        if str(tag).startswith('S'):
            orgs.add(word)
        elif str(tag).startswith('B'):
            union_org = word
            while netags[j] != 'E-Ni':
                j += 1
                if j < len(words):
                    union_org += words[j]
            orgs.add(union_org)
 
    i += 1
 
print('人名:', ','.join(persons))
print('地名:', ','.join(places))
print('组织机构:', ','.join(orgs))
 
# 释放模型
segmentor.release()
postagger.release()
recognizer.release()

2.5 依存句法分析

import os
from pyltp import Segmentor, Postagger, Parser
LTP_DATA_DIR = 'Z:/knowledge-graph/model/ltp_data_v3.4.0/'

# 分词
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')  # 分词模型路径,模型名称为`cws.model`
# lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt')  # 参数lexicon是自定义词典的文件路径
 
segmentor = Segmentor(cws_model_path)
# segmentor.load_with_lexicon(cws_model_path, lexicon_path)
 
sent = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。'
words = segmentor.segment(sent)  # 分词
print(list(words))
 
# 词性标注
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')  # 词性标注模型路径,模型名称为`pos.model`
 
postagger = Postagger(pos_model_path)  # 初始化实例
# postagger.load(pos_model_path)  # 加载模型
postags = postagger.postag(words)  # 词性标注
print(list(postags))
 
# 依存句法分析
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')  # 模型路径,模型名称为`parser.model`
 
parser = Parser(par_model_path)  # 初始化实例
# parser.load(par_model_path)  # 加载模型
arcs = parser.parse(words, postags)  # 句法分析
print(arcs)  # type: object
 
rely_id = [arc[0] for arc in arcs]  # 提取依存父节点id
print(rely_id)
relation = [arc[1] for arc in arcs]  # 提取依存关系
print(relation)
heads = ['Root' if id == 0 else words[id - 1] for id in rely_id]  # 匹配依存父节点词语
print(heads)
 
for i in range(len(words)):
    print(relation[i] + '(' + words[i] + ', ' + heads[i] + ')')
 
# 释放模型
segmentor.release()
postagger.release()
parser.release()

2.6 语义角色标注

import os
from pyltp import Segmentor, Postagger, Parser, SementicRoleLabeller
LTP_DATA_DIR = 'Z:/knowledge-graph/model/ltp_data_v3.4.0/'  # ltp模型目录的路径

# 分词
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')  # 分词模型路径,模型名称为`cws.model`
# lexicon_path = os.path.join(LTP_DATA_DIR, 'lexicon.txt')  # 参数lexicon是自定义词典的文件路径
 
segmentor = Segmentor(cws_model_path)
# segmentor.load_with_lexicon(cws_model_path, lexicon_path)
 
sent = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。'
words = segmentor.segment(sent)  # 分词
print(list(words))
 
# 词性标注
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')  # 词性标注模型路径,模型名称为`pos.model`
 
postagger = Postagger(pos_model_path)  # 初始化实例
# postagger.load(pos_model_path)  # 加载模型
postags = postagger.postag(words)  # 词性标注
print(list(postags))
 
# 依存句法分析
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')  # 模型路径,模型名称为`parser.model`
 
parser = Parser(par_model_path)  # 初始化实例
# parser.load(par_model_path)  # 加载模型
arcs = parser.parse(words, postags)  # 句法分析
print(arcs)
 
# 语义角色标注
srl_model_path = os.path.join(LTP_DATA_DIR, 'pisrl_win.model')  # 语义角色标注模型目录路径
 
labeller = SementicRoleLabeller(srl_model_path)  # 初始化实例
# labeller.load(srl_model_path)  # 加载模型
roles = labeller.label(words, postags, arcs)  # 语义角色标注
print(roles)  # type: object
 
# 打印结果
for role in roles:
    # print("role")
    # print(role)
    print(words[role[0]], end=' ')
    print(role[0], "".join(["%s:(%d,%d) " % (arg[0], arg[1][0], arg[1][1]) for arg in role[1]]))
 
# 释放模型
segmentor.release()
postagger.release()
parser.release()
labeller.release()

三、总结流程