作者: 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的介绍与使用相关推荐

  1. 【NLP】pyltp工具介绍、安装和使用代码+示例

    [NLP]pyltp工具介绍.安装和使用pyltp 文章目录 [NLP]pyltp工具介绍.安装和使用pyltp 1. 介绍 2. 使用 2.1 分句 2.2 分词 2.3 词性标注 2.4 命名实体 ...

  2. 自然语言处理(NLP)之pyltp的介绍与使用(中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注)

    pyltp的简介   语言技术平台(LTP)经过哈工大社会计算与信息检索研究中心 11 年的持续研发和推广, 是国内外最具影响力的中文处理基础平台.它提供的功能包括中文分词.词性标注.命名实体识别.依 ...

  3. NLP汉语自然语言处理入门基础知识介绍

    NLP汉语自然语言处理入门基础知识介绍 自然语言处理定义: 自然语言处理是一门计算机科学.人工智能以及语言学的交叉学科.虽然语言只是人工智能的一部分(人工智能还包括计算机视觉等),但它是非常独特的一部 ...

  4. NLP入门学习3——句法分析(基于LTP4)

    NLP入门学习3--句法分析(基于LTP4) 0.简介 1.LTP介绍 2.安装 2.1 模块安装 2.2 模型下载 3.使用 3.1 分句 3.2 分词 3.3 词性标注 3.4 命名实体识别 3. ...

  5. 【组队学习】【29期】9. 基于transformers的自然语言处理(NLP)入门

    9. 基于transformers的自然语言处理(NLP)入门 航路开辟者:多多.erenup.张帆.张贤.李泺秋.蔡杰.hlzhang 领航员:张红旭.袁一涵 航海士:多多.张红旭.袁一涵.童鸣 基 ...

  6. 【组队学习】【28期】基于transformers的自然语言处理(NLP)入门

    基于transformers的自然语言处理(NLP)入门 论坛版块: http://datawhale.club/c/team-learning/39-category/39 开源内容: https: ...

  7. NLP入门必知必会(一):Word Vectors

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:芦冬生,Datawhale优秀学习者,北京理工大学 自然语言处理( ...

  8. NLP入门之路及学习方法:从任务实践入手!

    Datawhale原创 作者:康兵兵,Datawhale成员 寄语:NLP入门,科学有效的方法是找到切入点,一个具体任务.从任务实践入手,做到既见树木也见森林. 笔者从2018年初开始接触机器学习,现 ...

  9. NLP入门之综述阅读-基于深度学习的自然语言处理研究综述

    NLP入门-综述阅读-[基于深度学习的自然语言处理研究综述] 基于深度学习的自然语言处理研究综述 摘要 0 引言 1 深度学习概述 卷积神经网络 递归神经网络 2 NLP应用研究进展 3 预训练语言模 ...

  10. NLP入门概览(9) ——句法分析c:局部句法分析、依存关系分析

      在上一部分中,我们介绍了基于规则法.概率统计法.神经网络法的完全句法分析方法(NLP入门概览(8)--句法分析b:完全句法分析).   在这一部分中,我们将介绍句法分析中的另外两种类型:局部句法分 ...

最新文章

  1. 20181113-2 每周例行报告
  2. manjaro linux 教程,Manjaro 使用基础
  3. “围棋人机大战”唯一人类的胜利记录将被制作成NFT进行拍卖
  4. SELinux系列(十二)安全上下文的修改和设置(chcon和restorecon命令)
  5. 【Angular 4】依赖注入
  6. Jquery插件之ajaxForm ajaxSubmit的理解用法
  7. 为什么函数lamda显示权限不足_C++常用内置函数
  8. 【语音编辑】基于matlab语音编辑【含Matlab源码 539期】
  9. 别被IBM抛出的“认知商业”搞晕 这里为你详解
  10. 小程序商城源码,很不错,推荐给开发者
  11. 《深入浅出Python机器学习》读书笔记 第二章 基于Python语言的环境配置
  12. Win10自带无线投屏功能(含无安装失败解决办法)
  13. WinForm中 SplitContainer的使用
  14. Fisher精确检验与卡方检验
  15. SpringBoot重点详解--事件监听
  16. View UI (iview)表格合并单元格(行/列合并)
  17. 微型计算机pcu,浅谈丰田紧凑型HV动力控制单元(下)
  18. 将txt文本数据转换为json对象
  19. Android手机横屏竖屏的应用
  20. php 导出excel 2007,PHPExcel-1.8.1导入、导出Excel表格

热门文章

  1. execl筛选去重_excel表格如何去除重复数据进行筛选
  2. css hover变成手_html实现鼠标悬停变成手型实现方式
  3. AUTOSAR 网络管理NM
  4. 错过“复联4”在所不惜,迅雷链技术沙龙北京站有哪些更精彩的地方?
  5. 米家接入HomeKit系列二:通过群辉NAS的Docker搭建HomeAssistant
  6. 找不到sct文件解决方法:Could not open scatter descript
  7. Mac系统安装软件的三种方式
  8. hazelcast配置内存_在内存数据网格中引入hazelcast imdg
  9. SpringCloudSpringBoot集成Acivity6.0
  10. 计算机三维制图描述零件绘制过程,AutoCAD三维实体零件图绘制