NLP入门:pyltp的介绍与使用
♚
作者: jclian,喜欢算法,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远!
pyltp的简介
语言技术平台(LTP)经过哈工大社会计算与信息检索研究中心 11 年的持续研发和推广, 是国内外最具影响力的中文处理基础平台。它提供的功能包括中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等。
pyltp 是 LTP 的 Python 封装,同时支持Python2和Python3版本。Python3的安装方法为:
pip3 install pyltp
官网下载网址:
https://pypi.org/project/pyltp/0.1.7/
官方使用说明文档:
https://pyltp.readthedocs.io/zh_CN/develop/api.html
在使用该模块前,需要下载完整的模型文件,文件下载地址为:
https://pan.baidu.com/share/link?shareid=1988562907&uk=2738088569#list/path=%2F
pyltp 的所有输入的分析文本和输出的结果的编码均为 UTF-8。模型的数据文件如下:
其中,cws.model用于分词模型,lexicon.txt为分词时添加的用户字典,ner.model为命名实体识别模型,parser.model为依存句法分析模型,pisrl.model为语义角色标注模型,pos为词性标注模型。
pyltp的使用
pyltp的使用示例项目结构如下:
分句
分句指的是将一段话或一片文章中的文字按句子分开,按句子形成独立的单元。示例的Python代码sentenct_split.py如下:
# -*- coding: utf-8 -*-
from pyltp import SentenceSplitter
# 分句doc = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。' '盖茨原计划从明年1月9日至14日陆续访问中国和日本,目前,他决定在行程中增加对韩国的访问。莫莱尔表示,' '盖茨在访韩期间将会晤韩国国防部长官金宽镇,就朝鲜近日的行动交换意见,同时商讨加强韩美两军同盟关系等问题,' '拟定共同应对朝鲜挑衅和核计划的方案。'sents = SentenceSplitter.split(doc) # 分句
for sent in sents: print(sent)
输出结果如下:
据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。盖茨原计划从明年1月9日至14日陆续访问中国和日本,目前,他决定在行程中增加对韩国的访问。莫莱尔表示,盖茨在访韩期间将会晤韩国国防部长官金宽镇,就朝鲜近日的行动交换意见,同时商讨加强韩美两军同盟关系等问题,拟定共同应对朝鲜挑衅和核计划的方案。
分词
分词指的是将一句话按词语分开,按词语形成独立的单元。示例的Python代码words_split.py如下:
# -*- coding: utf-8 -*-
import osfrom pyltp import Segmentor
cws_model_path = os.path.join(os.path.dirname(__file__), 'data/cws.model') # 分词模型路径,模型名称为`cws.model`lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt') # 参数lexicon是自定义词典的文件路径
segmentor = Segmentor()segmentor.load_with_lexicon(cws_model_path, lexicon_path)
sent = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。'words = segmentor.segment(sent) # 分词
print('/'.join(words))
segmentor.release()
输出的结果如下:
据/韩联社/12月/28日/反映/,/美/国防部/发言人/杰夫·莫莱尔/27日/表示/,/美/国防部长/盖茨/将/于/2011年/1月/14日/访问/韩国/。
词性标注
词性标注指的是一句话分完词后,制定每个词语的词性。示例的Python代码postagger.py如下:
# -*- coding: utf-8 -*-
import osfrom pyltp import Segmentor, Postagger
# 分词cws_model_path = os.path.join(os.path.dirname(__file__), 'data/cws.model') # 分词模型路径,模型名称为`cws.model`lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt') # 参数lexicon是自定义词典的文件路径
segmentor = Segmentor()segmentor.load_with_lexicon(cws_model_path, lexicon_path)
sent = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。'words = segmentor.segment(sent) # 分词
# 词性标注pos_model_path = os.path.join(os.path.dirname(__file__), 'data/pos.model') # 词性标注模型路径,模型名称为`pos.model`
postagger = Postagger() # 初始化实例postagger.load(pos_model_path) # 加载模型postags = postagger.postag(words) # 词性标注
for word, postag in zip(words, postags): print(word, postag)
# 释放模型segmentor.release()postagger.release()
'''词性标注结果说明https://ltp.readthedocs.io/zh_CN/latest/appendix.html#id3'''
输出结果如下:
据 p韩联社 ni12月 nt28日 nt反映 v, wp美 j国防部 n发言人 n杰夫·莫莱尔 nh27日 nt表示 v, wp美 j国防部长 n盖茨 nh将 d于 p2011年 nt1月 nt14日 nt访问 v韩国 ns。 wp
词性标注结果可参考网址:https://ltp.readthedocs.io/zh_CN/latest/appendix.html 。
命名实体识别
命名实体识别(NER)指的是识别出一句话或一段话或一片文章中的命名实体,比如人名,地名,组织机构名。示例的Python代码ner.py如下:
# -*- coding: utf-8 -*-
import osfrom pyltp import Segmentor, Postagger
# 分词cws_model_path = os.path.join(os.path.dirname(__file__), 'data/cws.model') # 分词模型路径,模型名称为`cws.model`lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt') # 参数lexicon是自定义词典的文件路径
segmentor = Segmentor()segmentor.load_with_lexicon(cws_model_path, lexicon_path)
sent = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。'words = segmentor.segment(sent) # 分词
# 词性标注pos_model_path = os.path.join(os.path.dirname(__file__), 'data/pos.model') # 词性标注模型路径,模型名称为`pos.model`
postagger = Postagger() # 初始化实例postagger.load(pos_model_path) # 加载模型postags = postagger.postag(words) # 词性标注
ner_model_path = os.path.join(os.path.dirname(__file__), 'data/ner.model') # 命名实体识别模型路径,模型名称为`pos.model`
from pyltp import NamedEntityRecognizerrecognizer = NamedEntityRecognizer() # 初始化实例recognizer.load(ner_model_path) # 加载模型# netags = recognizer.recognize(words, postags) # 命名实体识别
# 提取识别结果中的人名,地名,组织机构名
persons, places, orgs = set(), set(), set()
netags = list(recognizer.recognize(words, postags)) # 命名实体识别print(netags)# print(netags)i = 0for tag, word in zip(netags, words): j = i # 人名 if 'Nh' in tag: if str(tag).startswith('S'): persons.add(word) elif str(tag).startswith('B'): union_person = word while netags[j] != 'E-Nh': j += 1 if j < len(words): union_person += words[j] persons.add(union_person) # 地名 if 'Ns' in tag: if str(tag).startswith('S'): places.add(word) elif str(tag).startswith('B'): union_place = word while netags[j] != 'E-Ns': j += 1 if j < len(words): union_place += words[j] places.add(union_place) # 机构名 if 'Ni' in tag: if str(tag).startswith('S'): orgs.add(word) elif str(tag).startswith('B'): union_org = word while netags[j] != 'E-Ni': j += 1 if j < len(words): union_org += words[j] orgs.add(union_org)
i += 1
print('人名:', ','.join(persons))print('地名:', ','.join(places))print('组织机构:', ','.join(orgs))
# 释放模型segmentor.release()postagger.release()recognizer.release()
输出的结果如下:
['O', 'S-Ni', 'O', 'O', 'O', 'O', 'B-Ni', 'E-Ni', 'O', 'S-Nh', 'O', 'O', 'O', 'S-Ns', 'O', 'S-Nh', 'O', 'O', 'O', 'O', 'O', 'O', 'S-Ns', 'O']人名: 杰夫·莫莱尔,盖茨地名: 美,韩国组织机构: 韩联社,美国防部
命名实体识别结果可参考网址:https://ltp.readthedocs.io/zh_CN/latest/appendix.html
依存句法分析
依存语法 (Dependency Parsing, DP) 通过分析语言单位内成分之间的依存关系揭示其句法结构。 直观来讲,依存句法分析识别句子中的“主谓宾”、“定状补”这些语法成分,并分析各成分之间的关系。示例的Python代码parser.py代码如下:
# -*- coding: utf-8 -*-
import osfrom pyltp import Segmentor, Postagger, Parser
# 分词cws_model_path = os.path.join(os.path.dirname(__file__), 'data/cws.model') # 分词模型路径,模型名称为`cws.model`lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt') # 参数lexicon是自定义词典的文件路径
segmentor = Segmentor()segmentor.load_with_lexicon(cws_model_path, lexicon_path)
sent = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。'words = segmentor.segment(sent) # 分词
# 词性标注pos_model_path = os.path.join(os.path.dirname(__file__), 'data/pos.model') # 词性标注模型路径,模型名称为`pos.model`
postagger = Postagger() # 初始化实例postagger.load(pos_model_path) # 加载模型postags = postagger.postag(words) # 词性标注
# 依存句法分析par_model_path = os.path.join(os.path.dirname(__file__), 'data/parser.model') # 模型路径,模型名称为`parser.model`
parser = Parser() # 初始化实例parser.load(par_model_path) # 加载模型arcs = parser.parse(words, postags) # 句法分析
rely_id = [arc.head for arc in arcs] # 提取依存父节点idrelation = [arc.relation for arc in arcs] # 提取依存关系heads = ['Root' if id == 0 else words[id-1] for id in rely_id] # 匹配依存父节点词语
for i in range(len(words)): print(relation[i] + '(' + words[i] + ', ' + heads[i] + ')')
# 释放模型segmentor.release()postagger.release()parser.release()
输出结果如下:
ADV(据, 表示)SBV(韩联社, 反映)ATT(12月, 28日)ADV(28日, 反映)POB(反映, 据)WP(,, 据)ATT(美, 国防部)ATT(国防部, 发言人)ATT(发言人, 杰夫·莫莱尔)SBV(杰夫·莫莱尔, 表示)ADV(27日, 表示)HED(表示, Root)WP(,, 表示)ATT(美, 国防部长)ATT(国防部长, 盖茨)SBV(盖茨, 访问)ADV(将, 访问)ADV(于, 访问)ATT(2011年, 14日)ATT(1月, 14日)POB(14日, 于)VOB(访问, 表示)VOB(韩国, 访问)WP(。, 表示)
依存句法分析结果可参考网址:https://ltp.readthedocs.io/zh_CN/latest/appendix.html
语义角色标注
语义角色标注是实现浅层语义分析的一种方式。在一个句子中,谓词是对主语的陈述或说明,指出“做什么”、“是什么”或“怎么样,代表了一个事件的核心,跟谓词搭配的名词称为论元。语义角色是指论元在动词所指事件中担任的角色。主要有:施事者(Agent)、受事者(Patient)、客体(Theme)、经验者(Experiencer)、受益者(Beneficiary)、工具(Instrument)、处所(Location)、目标(Goal)和来源(Source)等。示例的Python代码rolelabel.py如下:
# -*- coding: utf-8 -*-
import osfrom pyltp import Segmentor, Postagger, Parser, SementicRoleLabeller
# 分词cws_model_path = os.path.join(os.path.dirname(__file__), 'data/cws.model') # 分词模型路径,模型名称为`cws.model`lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt') # 参数lexicon是自定义词典的文件路径
segmentor = Segmentor()segmentor.load_with_lexicon(cws_model_path, lexicon_path)
sent = '据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。'words = segmentor.segment(sent) # 分词
# 词性标注pos_model_path = os.path.join(os.path.dirname(__file__), 'data/pos.model') # 词性标注模型路径,模型名称为`pos.model`
postagger = Postagger() # 初始化实例postagger.load(pos_model_path) # 加载模型postags = postagger.postag(words) # 词性标注
# 依存句法分析par_model_path = os.path.join(os.path.dirname(__file__), 'data/parser.model') # 模型路径,模型名称为`parser.model`
parser = Parser() # 初始化实例parser.load(par_model_path) # 加载模型arcs = parser.parse(words, postags) # 句法分析
# 语义角色标注srl_model_path = os.path.join(os.path.dirname(__file__), 'data/pisrl.model') # 语义角色标注模型目录路径labeller = SementicRoleLabeller() # 初始化实例labeller.load(srl_model_path) # 加载模型roles = labeller.label(words, postags, arcs) # 语义角色标注
# 打印结果for role in roles: print(words[role.index], end=' ') print(role.index, "".join(["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments]))
# 释放模型segmentor.release()postagger.release()parser.release()labeller.release()
输出结果如下:
反映 4 A0:(1,1)A0:(2,3)表示 11 MNR:(0,5)A0:(6,9)TMP:(10,10)A1:(13,22)访问 21 A0:(13,15)ADV:(16,16)TMP:(17,20)A1:(22,22)
总结
本文介绍了中文NLP的一个杰出工具pyltp,并给出了该模块的各个功能的一个示例,希望能给读者一些思考与启示。本文到此结束,感谢大家阅读。
热 门 推 荐
为你的Python程序加密
爬取豆瓣电影榜单构建知识图谱
用Python分析《都挺好》中的人物关系
用Pandas库实现MySQL数据库的读写
推荐Python中文社区旗下的几个服务类公众号
▼ 点击成为社区注册会员 「在看」一下,一起PY!
NLP入门:pyltp的介绍与使用相关推荐
- 【NLP】pyltp工具介绍、安装和使用代码+示例
[NLP]pyltp工具介绍.安装和使用pyltp 文章目录 [NLP]pyltp工具介绍.安装和使用pyltp 1. 介绍 2. 使用 2.1 分句 2.2 分词 2.3 词性标注 2.4 命名实体 ...
- 自然语言处理(NLP)之pyltp的介绍与使用(中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注)
pyltp的简介 语言技术平台(LTP)经过哈工大社会计算与信息检索研究中心 11 年的持续研发和推广, 是国内外最具影响力的中文处理基础平台.它提供的功能包括中文分词.词性标注.命名实体识别.依 ...
- NLP汉语自然语言处理入门基础知识介绍
NLP汉语自然语言处理入门基础知识介绍 自然语言处理定义: 自然语言处理是一门计算机科学.人工智能以及语言学的交叉学科.虽然语言只是人工智能的一部分(人工智能还包括计算机视觉等),但它是非常独特的一部 ...
- NLP入门学习3——句法分析(基于LTP4)
NLP入门学习3--句法分析(基于LTP4) 0.简介 1.LTP介绍 2.安装 2.1 模块安装 2.2 模型下载 3.使用 3.1 分句 3.2 分词 3.3 词性标注 3.4 命名实体识别 3. ...
- 【组队学习】【29期】9. 基于transformers的自然语言处理(NLP)入门
9. 基于transformers的自然语言处理(NLP)入门 航路开辟者:多多.erenup.张帆.张贤.李泺秋.蔡杰.hlzhang 领航员:张红旭.袁一涵 航海士:多多.张红旭.袁一涵.童鸣 基 ...
- 【组队学习】【28期】基于transformers的自然语言处理(NLP)入门
基于transformers的自然语言处理(NLP)入门 论坛版块: http://datawhale.club/c/team-learning/39-category/39 开源内容: https: ...
- NLP入门必知必会(一):Word Vectors
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:芦冬生,Datawhale优秀学习者,北京理工大学 自然语言处理( ...
- NLP入门之路及学习方法:从任务实践入手!
Datawhale原创 作者:康兵兵,Datawhale成员 寄语:NLP入门,科学有效的方法是找到切入点,一个具体任务.从任务实践入手,做到既见树木也见森林. 笔者从2018年初开始接触机器学习,现 ...
- NLP入门之综述阅读-基于深度学习的自然语言处理研究综述
NLP入门-综述阅读-[基于深度学习的自然语言处理研究综述] 基于深度学习的自然语言处理研究综述 摘要 0 引言 1 深度学习概述 卷积神经网络 递归神经网络 2 NLP应用研究进展 3 预训练语言模 ...
- NLP入门概览(9) ——句法分析c:局部句法分析、依存关系分析
在上一部分中,我们介绍了基于规则法.概率统计法.神经网络法的完全句法分析方法(NLP入门概览(8)--句法分析b:完全句法分析). 在这一部分中,我们将介绍句法分析中的另外两种类型:局部句法分 ...
最新文章
- 20181113-2 每周例行报告
- manjaro linux 教程,Manjaro 使用基础
- “围棋人机大战”唯一人类的胜利记录将被制作成NFT进行拍卖
- SELinux系列(十二)安全上下文的修改和设置(chcon和restorecon命令)
- 【Angular 4】依赖注入
- Jquery插件之ajaxForm ajaxSubmit的理解用法
- 为什么函数lamda显示权限不足_C++常用内置函数
- 【语音编辑】基于matlab语音编辑【含Matlab源码 539期】
- 别被IBM抛出的“认知商业”搞晕 这里为你详解
- 小程序商城源码,很不错,推荐给开发者
- 《深入浅出Python机器学习》读书笔记 第二章 基于Python语言的环境配置
- Win10自带无线投屏功能(含无安装失败解决办法)
- WinForm中 SplitContainer的使用
- Fisher精确检验与卡方检验
- SpringBoot重点详解--事件监听
- View UI (iview)表格合并单元格(行/列合并)
- 微型计算机pcu,浅谈丰田紧凑型HV动力控制单元(下)
- 将txt文本数据转换为json对象
- Android手机横屏竖屏的应用
- php 导出excel 2007,PHPExcel-1.8.1导入、导出Excel表格
热门文章
- execl筛选去重_excel表格如何去除重复数据进行筛选
- css hover变成手_html实现鼠标悬停变成手型实现方式
- AUTOSAR 网络管理NM
- 错过“复联4”在所不惜,迅雷链技术沙龙北京站有哪些更精彩的地方?
- 米家接入HomeKit系列二:通过群辉NAS的Docker搭建HomeAssistant
- 找不到sct文件解决方法:Could not open scatter descript
- Mac系统安装软件的三种方式
- hazelcast配置内存_在内存数据网格中引入hazelcast imdg
- SpringCloudSpringBoot集成Acivity6.0
- 计算机三维制图描述零件绘制过程,AutoCAD三维实体零件图绘制