1.    简介

LTP(语言技术平台)是哈工大社会计算与信息检索研究中心研制的一整套开放中文自然语言处理系统。
pyltp 是 LTP 的 python 封装,提供了分词,词性标注,命名实体识别,依存句法分析,语义角色标注的功能(暂不提供语义依存分析功能)

2.    各个模型功能

(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 版本后才能调试成功。)

3.模型的应用

3.1.分词

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()  # 释放模型

举例:

播放/v	周杰伦/nh	的/u	歌/n
我/r	想/v	听/v	一/m	首/v	小/a	虎队/n	的/u	爱/v
我/r	想/v	听/v	一/m	首/v	小虎队/nh	的/u	爱/n

LTP 使用的词性标注集:

对于语料中歌手歌曲名的识别,只用到分词﹑词性标注两步。在分词这一步,采用外部分词词典,将语料中出现的部分歌手名﹑歌曲名都作为外部词放入外部分词词典;在词性标注这一步,采用外部词性标注词典,人工将部分歌手名的词性标注为 nh ,将部分歌曲名的词性标注为 n ,同时将语料中一些干扰信息的词性标注为非 n 词性,比如:将“歌”的词性标注为 v 或者 a ,这样,“我想听歌”这一语料进行分词词性标注之后,就不会将名词“歌”输出到歌曲名列表中去。

3. 命名实体识别

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

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

pyltp 命名实体识别标注:BIESO 位置标签和实体类型标签用一个横线相连,O 标签后面没有实体类型标签。

示例:
 

我/O	想/O	听/O	一/O	首/O	小虎队/S-Nh	的/O	爱/O

命名实体识别标注集:

五种标注:

三种 NE :

4. 依存句法分析

代码:

# 依存句法分析
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(爱, 听)

图:

 

依存句法关系:

5. 语义角色标注

代码:

# 语义角色标注
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六种:

(2)附加语义角色15个:

 

转载:https://blog.csdn.net/qq_42851418/article/details/83114328