零、资料
官方文档:
github.com/HIT-SCIR/py…
文章:
zhuanlan.zhihu.com/p/201124690
blog.csdn.net/weixin_4479…
1.1 词性标注集
| 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 | 萄, 翱 |
| **** | **** | **** | z | descriptive words | 瑟瑟,匆匆 |
1.2 命名实体识别标注集
1.3 语义角色类型
| 关系类型 | Tag | Description | Example |
|---|
| ARG0 | causers or experiencers | 施事者、主体、触发者 | [政府 ARG0]鼓励个人投资服务业。 |
| ARG1 | patient | 受事者 | 政府鼓励[个人 ARG1]投资服务业。 |
| ARG2 | range | 语义角色2 | 政府鼓励个人[投资服务业 ARG2]。 |
| ARG3 | starting point | 语义角色3 | 巴基斯坦[对谈判前景 ARG3]表示悲观。 |
| ARG4 | end point | 语义角色4 | 产检部门将产检时间缩短到[一至三天 ARG4]。 |
| ADV | adverbial | 状语 | 我们[即将 ADV]迎来新年。 |
| BNF | beneficiary | 受益人 | 义务[为学童及老师 BNF]做超音波检查 。 |
| CND | condition | 条件 | [如果早期发现 CND],便能提醒当事人注意血压的变化。 |
| CRD | coordinated arguments | 并列 | 跟南韩、[跟美国 CRD]谋求和平关系的举动也更加积极。 |
| DGR | degree | 程度 | 贫铀弹含有放射性比铀强[20万倍 DGR]。 |
| DIR | direction | 方向 | [从此处 DIR] 我们可以发现寇克斯报告的精髓。 |
| DIS | discourse marker | 会话标记 | 警方上午针对目击者做笔录,[而 DIS]李士东仍然不见踪影。 |
| EXT | extent | 范围 | 回归3年多[来 EXT] ,香港成为台商对大陆贸易的财务运作及资金调度中心。 |
| FRQ | frequency | 频率 | 这类听证会在赖昌兴拘押期间每30天举行[一次 FRQ]。 |
| LOC | locative | 地点 | 请听美国之音特邀记者康妮[在加拿大温哥华 LOC]发来的报道。 |
| MNR | manner | 方式 | 以便他能继续[作为俄罗斯官员 MNR]从事他在一个特殊机构中的工作。 |
| PRP | purpose or reason | 目的 | 执政党和在野党[为了应付这场攻守战 PRP]都发出了紧急动员令。 |
| QTY | quantity | 数量 | 每年创汇[100万 QTY]美元。 |
| TMP | temporal | 时间 | [下星期 TMP]布什将提出一项周密计划。 |
| TPC | topic | 话题 | [这么大的事情 TPC],你怎么不和我说? |
| PRD | predicate | 谓语动词 | **** |
| PSR | possessor | 持有者 | **** |
| PSE | possessee | 被持有 | **** |
1.4 依存句法关系
| 关系类型 | 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 | 指整个句子的核心 |
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')
segmentor = Segmentor(cws_model_path)
sent = '孙悟空的师傅是谁'
words = segmentor.segment(sent)
print(words)
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')
postagger = Postagger(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')
segmentor = Segmentor(cws_model_path)
sent = '孙悟空跟着唐僧去西天取经'
words = segmentor.segment(sent)
print(list(words))
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')
postagger = Postagger(pos_model_path)
postags = postagger.postag(words)
print(list(postags))
ner_model_path = os.path.join(LTP_DATA_DIR, 'ner.model')
recognizer = NamedEntityRecognizer(ner_model_path)
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')
segmentor = Segmentor(cws_model_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')
postagger = Postagger(pos_model_path)
postags = postagger.postag(words)
print(list(postags))
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')
parser = Parser(par_model_path)
arcs = parser.parse(words, postags)
print(arcs)
rely_id = [arc[0] for arc in arcs]
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/'
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')
segmentor = Segmentor(cws_model_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')
postagger = Postagger(pos_model_path)
postags = postagger.postag(words)
print(list(postags))
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')
parser = Parser(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)
roles = labeller.label(words, postags, arcs)
print(roles)
for role in roles:
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()
三、总结流程
