Ltp中源代码和模型包括:中文分词、词性标注、未登录词识别、依存句法、语义角色标注几个模块。
目录
1、标注集合
分词标注集
标记 |
含义 |
举例 |
---|---|---|
B |
词首 |
__中__国 |
I |
词中 |
哈__工__大 |
E |
词尾 |
科__学__ |
S |
单字成词 |
的 |
词性标注集
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 |
萄, 翱 |
命名实体识别标注集
NE识别模块的标注结果采用O-S-B-I-E标注形式,其含义为
标记 |
含义 |
---|---|
O |
这个词不是NE |
S |
这个词单独构成一个NE |
B |
这个词为一个NE的开始 |
I |
这个词为一个NE的中间 |
E |
这个词位一个NE的结尾 |
LTP中的NE 模块识别三种NE,分别如下:
标记 |
含义 |
---|---|
Nh |
人名 |
Ni |
机构名 |
Ns |
地名 |
依存句法关系
关系类型 |
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 |
指整个句子的核心 |
语义角色类型
语义角色类型 |
说明 |
---|---|
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 ( 被持有 ) |
2、快速使用
载入模型
from ltp import LTP ltp = LTP() # 默认加载 Small 模型 # ltp = LTP(path = "base|small|tiny") # ltp = LTP(path = "tiny.tgz|tiny-tgz-extracted") # 其中 tiny-tgz-extracted 是 tiny.tgz 解压出来的文件夹
分句
使用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('/')])
词性标注
from ltp import LTP ltp = LTP() seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"]) pos = ltp.pos(hidden) # [['他', '叫', '汤姆', '去', '拿', '外衣', '。']] # [['r', 'v', 'nh', 'v', 'v', 'n', 'wp']]
命名实体识别
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 : 汤姆
语义角色标注
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: 外衣] # ] # ]
依存句法分析
需要注意的是,在依存句法当中,虚节点ROOT占据了0位置,因此节点的下标从1开始。
from ltp import LTP ltp = LTP() seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"]) 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开始。
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') # ] # ]