LTP(语言技术平台)是哈工大社会计算与信息检索研究中心研制的一整套开放中文自然语言处理系统。
pyltp 是 LTP 的 python 封装,提供了分词,词性标注,命名实体识别,依存句法分析,语义角色标注的功能(暂不提供语义依存分析功能)
(1) 分词—— cws. model
(2) 词性标注—— pos. model
(3) 命名实体识别—— ner. model
(4) 依存句法分析—— parser. model
(5) 语义角色标注——(pisrl. model),pisrl_win. model(使用的 LTP是3.4.0 版本的 ,其中的srl 模型 pisrl.model 在 windows 系统下不可用,因此需要另外下载支持 windows 的语义角色标注模型链接srl模型。此步骤非常重要,因为一般语义角色标注模型基本报错,通过替换 win 版本后才能调试成功。)
pyltp 分词支持用户使用外部自定义词典。外部分词词典是一个文本文件,每一行指定一个词,编码为 UTF-8,
加载模型:
# 分词
def segmentor(sentence):
segmentor = Segmentor() # 初始化实例
segmentor.load(cws_model_path) # 加载模型
# 使用分词外部词典
segmentor.load_with_lexicon(cws_model_path, 'path to /segment_lexicon_6_2') # 加载模型,第二个参数是外部词典文件路径
words = segmentor.segment(sentence) # 分词
segmentor.release() # 释放模型
pyltp 词性标注也支持用户自定义外部词典。词性标注词典也为一个文本文件,每行第一列指定一个词,第二列指定该词的候选词性(可以有多项词性,一项一列)
加载模型:
postagger.load(pos_model_path) # 加载模型
# 使用词性标注外部词典
postagger.load_with_lexicon(pos_model_path,'path to/postag_lexicon_6_2') # 加载模型
示例:
播放/v 周杰伦/nh 的/u 歌/n
我/r 想/v 听/v 一/m 首/v 小/a 虎队/n 的/u 爱/v
我/r 想/v 听/v 一/m 首/v 小虎队/nh 的/u 爱/n
LTP 使用的词性标注集:
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 noun | 杜甫,汤姆 | x | non-lexeme | 萄,翱 |
z | descriptive words | 瑟瑟,匆匆 |
对于语料中歌手歌曲名的识别,只用到分词﹑词性标注两步。在分词这一步,采用外部分词词典,将语料中出现的部分歌手名﹑歌曲名都作为外部词放入外部分词词典;在词性标注这一步,采用外部词性标注词典,人工将部分歌手名的词性标注为 nh ,将部分歌曲名的词性标注为 n ,同时将语料中一些干扰信息的词性标注为非 n 词性,比如:将“歌”的词性标注为 v 或者 a ,这样,“我想听歌”这一语料进行分词词性标注之后,就不会将名词“歌”输出到歌曲名列表中去。
LTP 采用 BIESO 标注体系。B 表示实体开始词,I 表示实体中间词,E 表示实体结束词,S 表示单独成实体,O 不构成命名实体。
LTP 提供的命名实体类型为:人名(Nh),地名(Ns),机构名(Ni)。
pyltp 命名实体识别标注:BIESO 位置标签和实体类型标签用一个横线相连,O 标签后面没有实体类型标签。
示例:
我/O 想/O 听/O 一/O 首/O 小虎队/S-Nh 的/O 爱/O
命名实体识别标注集:
五种标注:
标记 | 含义 |
---|---|
O | 这个词不是NE |
S | 这个词单独构成一个NE |
B | 这个词为一个NE的开始 |
I | 这个词为一个NE的中间 |
E | 这个词位一个NE的结尾 |
三种 NE :
标记 | 含义 |
---|---|
Nh | 人名 |
Ni | 机构名 |
Ns | 地名 |
代码:
# 依存句法分析
def parse(words , postags):
parser = Parser() # 初始化实例
parser.load(par_model_path) # 加载模型
arcs = parser.parse(words, postags) # 句法分析
print("\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs))
parser.release() # 释放模型
return arcs
arc. head 表示依存弧的父结点的索引。 ROOT 节点的索引是 0 ,第一个词开始的索引依次为1,2,3,···
arc. relation 表示依存弧的关系。
示例:
###############依存句法分析###############
2:SBV 0:HED 2:VOB 5:ATT 8:ATT 8:ATT 6:RAD 3:VOB
=====依存句法分析=====
SBV(我, 想)
HED(想, Root)
VOB(听, 想)
ATT(一, 首)
ATT(首, 爱)
ATT(小虎队, 爱)
RAD(的, 小虎队)
VOB(爱, 听)
依存句法关系:
关系类型 | 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 | 指整个句子的核心 |
代码:
# 语义角色标注
labeller.load(srl_model_path) # 加载模型
roles = labeller.label(words, postags, 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]))
for arg in role.arguments:
if arg.name == 'A1':
words_list=words[arg.range.start:arg.range.end+1]
a = ''
print(a.join(words_list))
第一个词开始的索引依次为 0,1,2,···
返回结果 roles 是关于多个谓词的语义角色分析的结果。由于一句话中可能不含有语义角色,所以结果可能为空。
role. index 代表谓词的索引,role. arguments 代表关于谓词的若干语义角色。
arg. name 表示语义角色关系,role. range. start 表示该语义角色起始词位置的索引,arg. range. end 表示该语义角色结束词位置的索引。
示例:
### “ 我 / 想 / 看 / 恐龙 / 来 / 了 ”
1 A0:(0,0)A1:(2,5)
2 A1:(3,3)
A1:(2,5) -->看恐龙来了
A1:(3,3) -->恐龙
对于儿童项动画片名的提取,用到分词﹑词性标注﹑依存句法分析﹑语义角色标注这几步。在词性标注这一步,将动画片名标注为 n ,对于片名中存在其他词性的部分片名,尤其是词性为v的片名(因为会在语义角色标注这一步被识别为谓词),不容易识别出来,因此需要对片名中的部分词语,标注其外部词性。比如:将动画片名“恐龙来了”标注为 n 词性。
(这一步骤主要针对那些动画片名称中含有其他词性(比如动词)且不易被识别的动画名)
在语义角色标注这一步中输出 A1 ,输出放入结果列表,即为提取出的动画片名。(对于有多个谓词对应的多个 A1 ,一般输出谓词索引较大时对应的那一个 A1 ,因为对于提取动画片名的语料,只用提取一次信息(即动画片名),所以不用担心 A1 中可能出现非动画片名的信息。
【 而对于歌手歌曲名的识别,歌手歌曲可能连着作为一个 A1 ,比如“周杰伦的告白气球”,无法分开这两项,比如“我想听周杰伦的告白气球”的结果“周杰伦的告白气球”会作为一个 A1 输出的。】
使用外部分词词典和外部词性标注词典(比如:把“恐龙来了”作为一个词,标注n词性),得到语义角色标注结果为:
###########词性标注##########
我/r 想/v 看/v 恐龙来了/n
##########语义角色标注##########
2 A1:(3,3)
恐龙来了
语义角色关系:
(1)核心的语义角色为A0~A5六种:
核心语义角色 | 说明 |
---|---|
A0 | 表示动作的施事 |
A1 | 表示动作的影响等 |
A2~A5 | 根据谓语动词不同会有不同的语义含义 |
(2)附加语义角色15个:
语义角色类型 | 说明 |
---|---|
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 ( 被持有 ) |
参考:使用 pyltp - pyltp 0.2.0 文档