赞
踩
LTP 官网:http://ltp.ai, http://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
安装 pyltp
(base) $ sudo pip install pyltp
https://ltp.readthedocs.io/zh_CN/latest/appendix.html#id3
NLTK 比较适合英文数据,中文效果不够好。
参考: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(["他叫汤姆去拿外衣。", "汤姆生病了。他去了医院。"])
# [
# "他叫汤姆去拿外衣。",
# "汤姆生病了。",
# "他去了医院。"
# ]
# user_dict.txt
负重前行
长江大桥
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)
使用LTP分词非常简单,下面是一个简短的例子:
from ltp import LTP
ltp = LTP()
segment, _ = ltp.seg(["他叫汤姆去拿外衣。"])
# [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]
# 对于已经分词的数据
segment, hidden = ltp.seg(["他/叫/汤姆/去/拿/外衣/。".split('/')], is_preseged=True)
from ltp import LTP
ltp = LTP()
seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
pos = ltp.pos(hidden)
# [['他', '叫', '汤姆', '去', '拿', '外衣', '。']]
# [['r', 'v', 'nh', 'v', 'v', 'n', 'wp']]
词性标注集
LTP 使用的是863词性标注集,其各个词性含义如下表。
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 | 萄, 翱 |
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 : 汤姆
命名实体识别标注集
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: 外衣] # ] # ]
语义角色类型
关系类型 | 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 | 被持有 |
需要注意的是,在依存句法当中,虚节点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') # ] # ]
有以下依存句法,主要考虑 主谓、动宾关系
关系类型 | 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开始。
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开始。
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') # ] # ]
LTP Server 是对 LTP 的一个简单包装,依赖于 tornado,使用方式如下:
pip install ltp, tornado
python utils/server.py serve
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。