在python中使用哈工大LTP进行自然语言处理(安装和结果分析)

目录

  • 一、LTP介绍
  • 二、安装
    • 1. 安装pynlp
    • 2. 下载模型文件
  • 三、python下的功能实现
    • 1.代码参考
    • 2.结果说明
      • 1. 分句
      • 2. 分词
      • 3. 词性标注
      • 4. 依存句法分析
      • 5. 命名实体识别
      • 6. 语义角色标注
      • 7. 语义依存分析
  • 四、总结

一、LTP介绍

语言技术平台(LTP) 提供包括中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等丰富、 高效、精准的自然语言处理技术。

官方文档:

  1. 语言技术平台(LTP)使用文档
  2. pyltp文档
  1. 分词。和大部分西方语言不同,汉语书面语词语之间没有明显的空格标记,文本中的句子以字串的形式出现。因此汉语自然语言处理的首要工作就是要将输入的字串切分为单独的词语,然后在此基础上进行其他更高级的分析。
  2. 词性标注的目的是为每一个词性赋予一个类别,这个类别称为词性标记(Part-of-speech tag),比如,名词(Noun)、动词(Verb)、形容词(Adjective)等。一般来说,属于相同词性的词,在句法中承担类似的角色。
  3. 命名实体识别的任务是识别句子中的人名、地名、机构名等命名实体。每一个命名实体由一个或多个词语构成。根据标注规范的不同,命名实体可能存在嵌套的情况,但是目前大部分研究工作不考虑嵌套的情况。比如,“王义和老师”是人名,“哈尔滨南岗区”是地名,“哈尔滨工业大学”是机构名或地名。

——引用自:李正华. 汉语依存句法分析关键技术研究[D].哈尔滨工业大学,2013.

二、安装

环境:python3.6 win10

官方文档:

  • http://ltp.ai/ (有时打不开,隔段时间刷新试试)
  • https://ltp.readthedocs.io/zh_CN/latest/index.html
  • https://github.com/HIT-SCIR/pyltp

1. 安装pynlp

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

2. 下载模型文件

下载地址:百度云

百度云下载慢的话点这里,选择对应的模型文件,我下载的是v3.4

注意
请确保下载的模型版本与当前版本的 pyltp 对应,否则会导致程序无法正确加载模型。
windows下需要另外下载SRL模型

在python中使用哈工大LTP进行自然语言处理(安装和结果分析)_第1张图片
下载后文件夹如图:
在python中使用哈工大LTP进行自然语言处理(安装和结果分析)_第2张图片

模型文件名 说明
cws.model 分句模型
ner.model 命名实体识别模型
parser.model 依存句法分析模型
pisrl.model 语义角色标注模型
pos.model 词性标注模型

注意:记住模型存放位置,后续python文件中需要调用。

三、python下的功能实现

分词、词性标注、句法分析一系列任务之间存在依赖关系。举例来讲,对于词性标注,必须在分词结果之上进行才有意义。

LTP中提供的5种分析之间的依赖关系如下所示:

分词
词性标注
命名实体识别
依存句法分析
语义角色标注

1.代码参考

"""
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()
  • 注意
  1. 需要修改model路径
  2. 文件编码采用utf-8
  3. 依存句法分析中,句子长度要求少于1024字,分词结果少于256词
  • 参考来源
  1. 焦距 - 哈工大LTP语言分析:分词、词性标注、句法分析等
  2. 竹聿Simon - 哈工大语言云(LTP)本地安装使用及Python调用
  3. 官方文档

2.结果说明

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)

对第一句话的在线演示结果:
在python中使用哈工大LTP进行自然语言处理(安装和结果分析)_第3张图片
注:
句法分析(蓝)
语义依存(树)分析(绿)
语义依存(图)分析(紫)

1. 分句

元芳你怎么看?
我就趴窗口上看呗!

2. 分词

元芳 你 怎么 看

3. 词性标注

当前文本:元芳你怎么看?
元芳 你 怎么 看 ?
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 瑟瑟,匆匆

——来自官方文档

4. 依存句法分析

元芳 你 怎么 看 ?
nh r r v wp
4:SBV 4:SBV 4:ADV 0:HED 4:WP

  • 官方说明:
    arc.head 表示依存弧的父节点词的索引。ROOT节点的索引是0,第一个词开始的索引依次为1、2、3…
    arc.relation 表示依存弧的关系。

  • 我的理解:
    结合在线演示图中的蓝色线图
    在python中使用哈工大LTP进行自然语言处理(安装和结果分析)_第4张图片
    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 指整个句子的核心

——来自官方文档

5. 命名实体识别

元芳 你 怎么 看 ?
nh r r v wp
S-Nh O O O O

  • 官方说明
    LTP 采用 BIESO 标注体系。B 表示实体开始词,I表示实体中间词,E表示实体结束词,S表示单独成实体,O表示不构成命名实体。
    LTP 提供的命名实体类型为:人名(Nh)、地名(Ns)、机构名(Ni)。
    B、I、E、S位置标签和实体类型标签之间用一个横线 - 相连;O标签后没有类型标签。
  • 我的理解:
    S-Nh对应“元芳”,即,“元芳”单独构成一个表示人名的命名实体。
    其他词语对应O,都不是命名实体。

命名实体的作用:命名实体识别的类型一般是根据任务确定的。LTP提供最基本的三种实体类型人名、地名、机构名的识别。 用户可以很容易将实体类型拓展成品牌名、软件名等实体类型。

O-S-B-I-E含义:

标记 含义
O 这个词不是NE
S 这个词单独构成一个NE
B 这个词为一个NE的开始
I 这个词为一个NE的中间
E 这个词位一个NE的结尾

——来自官方文档

6. 语义角色标注

元芳 你 怎么 看 ?
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.

  • 官方说明
    核心的语义角色为 A0-5 六种,A0 通常表示动作的施事,A1通常表示动作的影响等,A2-5 根据谓语动词不同会有不同的语义含义。其余的15个语义角色为附加语义角色,如LOC 表示地点,TMP 表示时间等。

附加语义角色列表如下:

语义角色类型 说明
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 ( 被持有 )

——来自官方文档

  • 我的理解:
    表示没看懂。

7. 语义依存分析

pyltp 暂不提供语义依存分析功能。若需使用该功能,请使用语言云 。

四、总结

  1. 安装时遇到c++的问题,特别麻烦,说要下载对应版本的,但是安装c++的时候系统又提示电脑上已经有了需要卸载才能安装。最后在github项目issue里看到解决方法。
  2. 有问题多看官方文档,整理下来,对照着看。
  3. 我主要是想用依存句法分析简化句子结构,提取需要的成分用作后续分析,所以没有去深入理解语义角色标注的作用。

你可能感兴趣的:(在python中使用哈工大LTP进行自然语言处理(安装和结果分析))