当前位置:   article > 正文

NLP - pyltp / ltp4_ltp4 base

ltp4 base


相关资料

LTP 官网:http://ltp.aihttp://ltp.ai/docs/index.html
LTP附录:https://ltp.readthedocs.io/zh_CN/latest/appendix.html#id3
附录2:http://ltp.ai/docs/appendix.html


pyltp:https://github.com/HIT-SCIR/pyltp
使用 pyltp:https://pyltp.readthedocs.io/zh_CN/latest/api.html


基于Pytorch的LTP4 已经发布,而PyLTP将会只有非常有限的维护,请大家移步使用 LTP 4
ltp4:https://github.com/HIT-SCIR/ltp
快速上手:http://ltp.ai/docs/quickstart.html


安装

安装 ltp4

(base) $ sudo pip install ltp
  • 1

安装 pyltp

(base) $ sudo pip install pyltp
  • 1

功能

https://ltp.readthedocs.io/zh_CN/latest/appendix.html#id3

  • 词性标注。名词、动词
  • 命名实体识别 NER。人名、机构名、地名等
  • 语义角色标注。主谓宾,时间地点等。
  • 依存语法关系。词和词之间的关系,主谓、动宾等。
  • 语义依存关系

NLTK 比较适合英文数据,中文效果不够好。


使用 ltp4

参考:http://ltp.ai/docs/quickstart.html


载入模型

在这里插入图片描述
初次使用会 加载模型
也可以来这里下载:https://github.com/HIT-SCIR/ltp/blob/master/MODELS.md


分句

使用LTP分句只需要调用ltp.sent_split函数

from ltp import LTP
ltp = LTP()
sents = ltp.sent_split(["他叫汤姆去拿外衣。", "汤姆生病了。他去了医院。"])

# [
#   "他叫汤姆去拿外衣。",
#   "汤姆生病了。",
#   "他去了医院。"
# ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

用户自定义词典

# user_dict.txt

负重前行
长江大桥
  • 1
  • 2
  • 3
  • 4

from ltp import LTP
ltp = LTP()
# user_dict.txt 是词典文件, max_window是最大前向分词窗口
ltp.init_dict(path="user_dict.txt", max_window=4)
# 也可以在代码中添加自定义的词语
ltp.add_words(words=["负重前行", "长江大桥"], max_window=4)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

分词

使用LTP分词非常简单,下面是一个简短的例子:

from ltp import LTP

ltp = LTP()

segment, _ = ltp.seg(["他叫汤姆去拿外衣。"])
# [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]

# 对于已经分词的数据
segment, hidden = ltp.seg(["他/叫/汤姆/去/拿/外衣/。".split('/')], is_preseged=True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

词性标注

from ltp import LTP

ltp = LTP()

seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
pos = ltp.pos(hidden)
# [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]
# [['r', 'v', 'nh', 'v', 'v', 'n', 'wp']]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

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萄, 翱

命名实体识别

from ltp import LTP

ltp = LTP()

seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
ner = ltp.ner(hidden)
# [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]
# [[('Nh', 2, 2)]]

tag, start, end = ner[0][0]
print(tag,":", "".join(seg[0][start:end + 1]))]
# Nh : 汤姆
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

命名实体识别标注集

LTP中的NE 模块识别三种NE,分别如下:

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

语义角色标注

from ltp import LTP

ltp = LTP()

seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
srl = ltp.srl(hidden)
# [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]
# [
#     [
#         [],                                                # 他
#         [('ARG0', 0, 0), ('ARG1', 2, 2), ('ARG2', 3, 5)],  # 叫 -> [ARG0: 他, ARG1: 汤姆, ARG2: 拿外衣]
#         [],                                                # 汤姆
#         [],                                                # 去
#         [('ARG0', 2, 2), ('ARG1', 5, 5)],                  # 拿 -> [ARG0: 汤姆, ARG1: 外衣]
#         [],                                                # 外衣
#         []                                                 # 。
#     ]
# ]

srl = ltp.srl(hidden, keep_empty=False)
# [
#     [
#         (1, [('ARG0', 0, 0), ('ARG1', 2, 2), ('ARG2', 3, 5)]), # 叫 -> [ARG0: 他, ARG1: 汤姆, ARG2: 拿外衣]
#         (4, [('ARG0', 2, 2), ('ARG1', 5, 5)])                  # 拿 -> [ARG0: 汤姆, ARG1: 外衣]
#     ]
# ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

语义角色类型

关系类型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被持有

依存句法分析

需要注意的是,在依存句法当中,虚节点ROOT占据了0位置,因此节点的下标从1开始。

from ltp import LTP

ltp = LTP()

seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
seg # [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]
hidden 
'''
{'word_cls': tensor([[[-0.0672, -0.0493,  0.1183,  0.3838, -0.3820,  0.5235,  3.1999,
           ...
           -0.6485,  0.1697,  0.4605,  0.2197]]]),
 'word_input': tensor([[[-0.3917,  0.3768,  0.1465,  ..., -0.3472,  0.5388, -0.3908], 
          ...,
          [ 0.2546, -0.0828,  0.0694,  ...,  0.6388,  0.0963, -0.1677]]]),
 'word_length': [7],
 'word_cls_input': tensor([[[-0.0672, -0.0493,  0.1183,  ...,  0.1697,  0.4605,  0.2197],  ..., 
          [ 0.2546, -0.0828,  0.0694,  ...,  0.6388,  0.0963, -0.1677]]]), 
 'word_cls_mask': tensor([[False,  True,  True,  True,  True,  True,  True,  True]])}
'''

dep = ltp.dep(hidden)
# [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]
# [
#     [
#         (1, 2, 'SBV'),
#         (2, 0, 'HED'),    # 叫 --|HED|--> ROOT
#         (3, 2, 'DBL'),
#         (4, 2, 'VOB'),
#         (5, 4, 'COO'),
#         (6, 5, 'VOB'),
#         (7, 2, 'WP')
#     ]
# ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

有以下依存句法,主要考虑 主谓、动宾关系

关系类型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开始。

from ltp import LTP

ltp = LTP()

seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
sdp = ltp.sdp(hidden, graph=False)
# [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]
# [
#     [
#         (1, 2, 'Agt'),
#         (2, 0, 'Root'),   # 叫 --|Root|--> ROOT
#         (3, 2, 'Datv'),
#         (4, 2, 'eEfft'),
#         (5, 4, 'eEfft'),
#         (6, 5, 'Pat'),
#         (7, 2, 'mPunc')
#     ]
# ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

语义依存分析(图)

与依存句法类似的,这里的下标也是从1开始。

from ltp import LTP

ltp = LTP()

seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
sdp = ltp.sdp(hidden, graph=True)
# [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]
# [
#     [
#         (1, 2, 'Agt'),
#         (2, 0, 'Root'),   # 叫 --|Root|--> ROOT
#         (3, 2, 'Datv'),
#         (3, 4, 'Agt'),
#         (3, 5, 'Agt'),
#         (4, 2, 'eEfft'),
#         (5, 4, 'eEfft'),
#         (6, 5, 'Pat'),
#         (7, 2, 'mPunc')
#     ]
# ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在这里插入图片描述在这里插入图片描述


LTP Server

LTP Server 是对 LTP 的一个简单包装,依赖于 tornado,使用方式如下:

pip install ltp, tornado
python utils/server.py serve
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/637589
推荐阅读
相关标签
  

闽ICP备14008679号