Ltp介绍及实践(20200925)

Ltp中源代码和模型包括:中文分词、词性标注、未登录词识别、依存句法、语义角色标注几个模块。

目录

1、标注集合

分词标注集

词性标注集

命名实体识别标注集

依存句法关系

语义角色类型

2、快速使用

载入模型

分句

用户自定义词典

分词

词性标注

命名实体识别

语义角色标注

依存句法分析

语义依存分析(树)

语义依存分析(图)


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')
#     ]
# ]

猜你喜欢

转载自blog.csdn.net/caicai0001000/article/details/108790347