语言技术平台(LTP) 提供包括中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等丰富、 高效、精准的自然语言处理技术。
官方文档:
- 分词。和大部分西方语言不同,汉语书面语词语之间没有明显的空格标记,文本中的句子以字串的形式出现。因此汉语自然语言处理的首要工作就是要将输入的字串切分为单独的词语,然后在此基础上进行其他更高级的分析。
- 词性标注的目的是为每一个词性赋予一个类别,这个类别称为词性标记(Part-of-speech tag),比如,名词(Noun)、动词(Verb)、形容词(Adjective)等。一般来说,属于相同词性的词,在句法中承担类似的角色。
- 命名实体识别的任务是识别句子中的人名、地名、机构名等命名实体。每一个命名实体由一个或多个词语构成。根据标注规范的不同,命名实体可能存在嵌套的情况,但是目前大部分研究工作不考虑嵌套的情况。比如,“王义和老师”是人名,“哈尔滨南岗区”是地名,“哈尔滨工业大学”是机构名或地名。
——引用自:李正华. 汉语依存句法分析关键技术研究[D].哈尔滨工业大学,2013.
环境:python3.6 win10
官方文档:
pip安装在win10下可能会报错,提示需要安装C++
解决方法:使用该文中的whl文件安装
下面两个文件针对不同的python版本下载一个即可, 这是我在自己的电脑(win10)上编译的,不知道你的系统是否能用,64bit的windows应该都可以,有问题在下面留言。注意: 这两个文件的区别是python版本号
python3.5:pyltp-0.2.1-cp35-cp35m-win_amd64.whl
python3.6:pyltp-0.2.1-cp36-cp36m-win_amd64.whl
下载地址:百度云
百度云下载慢的话点这里,选择对应的模型文件,我下载的是v3.4
注意:
请确保下载的模型版本与当前版本的 pyltp 对应,否则会导致程序无法正确加载模型。
windows下需要另外下载SRL模型
模型文件名 | 说明 |
---|---|
cws.model | 分句模型 |
ner.model | 命名实体识别模型 |
parser.model | 依存句法分析模型 |
pisrl.model | 语义角色标注模型 |
pos.model | 词性标注模型 |
注意:记住模型存放位置,后续python文件中需要调用。
分词、词性标注、句法分析一系列任务之间存在依赖关系。举例来讲,对于词性标注,必须在分词结果之上进行才有意义。
LTP中提供的5种分析之间的依赖关系如下所示:
"""
python3.6/win10
联系作者:[email protected]
"""
import os
from pyltp import SentenceSplitter, Segmentor, Postagger, Parser, NamedEntityRecognizer, SementicRoleLabeller
import csv
class LtpLanguageAnalysis(object):
def __init__(self, model_dir="D:/CODE/LTP"):
self.segmentor = Segmentor() # 分词
self.segmentor.load(os.path.join(model_dir, "cws.model"))
self.postagger = Postagger() # 词性标注
self.postagger.load(os.path.join(model_dir, "pos.model"))
self.parser = Parser() # 依存句法分析
self.parser.load(os.path.join(model_dir, "parser.model"))
self.recognizer = NamedEntityRecognizer() # 命名实体识别
self.recognizer.load(os.path.join(model_dir, "ner.model"))
self.labeller = SementicRoleLabeller() # 语义角色标注
self.labeller.load(os.path.join(model_dir, "pisrl_win.model"))
def analyze(self, content):
# 分句
texts = SentenceSplitter.split(content)
print('\n'.join(texts))
for text in texts:
print("————————————————————")
print("当前文本:{}".format(text))
# 分词
words = self.segmentor.segment(text)
words_str = '\t'.join(words)
print("[分词]")
print(words_str)
# 词性标注
postags = self.postagger.postag(words)
postags_str = '\t'.join(postags)
print("[词性标注]")
print(postags_str)
# 依存句法分析
arcs = self.parser.parse(words, postags)
arcs_str = "\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs)
print("[依存句法分析]")
print(arcs_str)
# 命名实体识别
netags = self.recognizer.recognize(words, postags) # 命名实体识别
netags_str = '\t'.join(netags)
print("[命名实体识别]")
print(netags_str)
# 语义角色标注
roles = self.labeller.label(words, postags, arcs) # 语义角色标注
for role in roles:
print("[语义角色标注]")
print(role.index, "".join(["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments]))
def release_model(self):
# 释放模型
self.segmentor.release()
self.postagger.release()
self.parser.release()
if __name__ == '__main__':
text = '元芳你怎么看?我就趴窗口上看呗!'
# 开始分析
ltp = LtpLanguageAnalysis()
ltp.analyze(text)
ltp.release_model()
python运行结果:
[dynet] random seed: 903498811
[dynet] allocating memory: 2000MB
[dynet] memory allocation done.
元芳你怎么看?
我就趴窗口上看呗!
————————————————————
当前文本:元芳你怎么看?
[分词]
元芳 你 怎么 看 ?
[词性标注]
nh r r v wp
[依存句法分析]
4:SBV 4:SBV 4:ADV 0:HED 4:WP
[命名实体识别]
S-Nh O O O O
[语义角色标注]
3 A0:(1,1)ADV:(2,2)
————————————————————
当前文本:我就趴窗口上看呗!
[分词]
我 就 趴 窗口 上 看 呗 !
[词性标注]
r d v nl nd v u wp
[依存句法分析]
3:SBV 3:ADV 0:HED 5:ATT 3:VOB 3:COO 6:RAD 3:WP
[命名实体识别]
O O O O O O O O
2 A0:(0,0)DIS:(1,1)A1:(3,4)
4 A0:(0,0)DIS:(1,1)
5 A0:(0,0)DIS:(1,1)
对第一句话的在线演示结果:
注:
句法分析(蓝)
语义依存(树)分析(绿)
语义依存(图)分析(紫)
元芳你怎么看?
我就趴窗口上看呗!
元芳 你 怎么 看
当前文本:元芳你怎么看?
元芳 你 怎么 看 ?
nh r r v wp
LTP 使用 863 词性标注集 :
标注 | 说明 | 例 |
---|---|---|
a | adjective | 美丽 |
b | other noun-modifier | 大型, 西式 |
c | conjunction | 和, 虽然 |
d | adverb | 很 |
e | exclamation | 哎 |
g | morpheme | 茨, 甥 |
h | prefix | 阿, 伪 |
i | idiom | 百花齐放 |
j | abbreviation | 公检法 |
k | suffix | 界, 率 |
m | number | 一, 第一 |
n | general noun | 苹果 |
nd | direction noun | 右侧 |
nh | person name | 杜甫, 汤姆 |
ni | organization name | 保险公司 |
nl | location noun | 城郊 |
ns | geographical name | 北京 |
nt | temporal noun | 近日, 明代 |
nz | other proper noun | 诺贝尔奖 |
o | onomatopoeia | 哗啦 |
p | preposition | 在, 把 |
q | quantity | 个 |
r | pronoun | 我们 |
u | auxiliary | 的, 地 |
v | verb | 跑, 学习 |
wp | punctuation | ,。! |
ws | foreign words | CPU |
x | non-lexeme | 萄, 翱 |
z | descriptive words | 瑟瑟,匆匆 |
——来自官方文档
元芳 你 怎么 看 ?
nh r r v wp
4:SBV 4:SBV 4:ADV 0:HED 4:WP
官方说明:
arc.head 表示依存弧的父节点词的索引。ROOT节点的索引是0,第一个词开始的索引依次为1、2、3…
arc.relation 表示依存弧的关系。
我的理解:
结合在线演示图中的蓝色线图
0:HED对应“看”,是核心词
各词索引依次为:元芳1,你2,怎么3,看4,?5
“元芳”对应“4:SBV”,即, “元芳”一词与索引为4的词(看),构成SBV(主谓关系),元芳<-看
“怎么”对应“4:ADV”, 即, “怎么”一词与(看)构成ADV(状中结构),怎么<-看
依存句法关系:
关系类型 | 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 | 指整个句子的核心 |
——来自官方文档
元芳 你 怎么 看 ?
nh r r v wp
S-Nh O O O O
命名实体的作用:命名实体识别的类型一般是根据任务确定的。LTP提供最基本的三种实体类型人名、地名、机构名的识别。 用户可以很容易将实体类型拓展成品牌名、软件名等实体类型。
O-S-B-I-E含义:
标记 | 含义 |
---|---|
O | 这个词不是NE |
S | 这个词单独构成一个NE |
B | 这个词为一个NE的开始 |
I | 这个词为一个NE的中间 |
E | 这个词位一个NE的结尾 |
——来自官方文档
元芳 你 怎么 看 ?
nh r r v wp
4:SBV 4:SBV 4:ADV 0:HED 4:WP
S-Nh O O O O
3 A0:(1,1)ADV:(2,2)
- 语义角色标注不对整个句子进行详细的语义分析,而只是标注句子中某些短语为给定谓词 ( 动词、名词、形容词等 ) 的语义角色,这些短语作为此谓词的框架的一部分被赋予一定的语义含义,例如 “[ 委员会 Agent][ 明天 Tmp] 将要 [通过 V][ 此议案 Passive] 。”,其中,“ 通过 ” 为谓词,“ 委员会 ” 、“ 此议案” 和 “ 明天 ” 分别是其施事、受事和动作发生的时间。
- 另外,语义角色标注不考虑时态信息,例如 “ 他要来北京。” 与 “ 他来北京了。” ,虽然时态并不相同,但是语义角色表示是相同的,同为:“ 来 ( 他,北京 ) ” 。同时,语义角色标注也不考虑谓词改变但语义不变的情况,例如 “ 曹雪芹写了《红楼梦》” 与“《红楼梦》的作者是曹雪芹 ” ,虽然它们的语义相同,但是由于谓词不同,语义角色标注的表示结果并不一样,需要根据不同的应用进行更深入的处理。
语义角色关系:
——引用自车万翔. 基于核方法的语义角色标注研究[D].哈尔滨工业大学,2008.
附加语义角色列表如下:
语义角色类型 | 说明 |
---|---|
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 ( 被持有 ) |
——来自官方文档
pyltp 暂不提供语义依存分析功能。若需使用该功能,请使用语言云 。