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

news2025/2/27 23:11:28

【NLP】pyltp工具介绍、安装和使用pyltp

文章目录

  • 【NLP】pyltp工具介绍、安装和使用pyltp
    • 1. 介绍
    • 2. 使用
      • 2.1 分句
      • 2.2 分词
      • 2.3 词性标注
      • 2.4 命名实体识别
      • 2.5 依存句法分析
      • 2.6 词义角色标注
      • 2.7 完整示例
    • 3. 参考

1. 介绍

  • 什么是pyltp
    pyltp 是LTP的 Python 封装,提供了分词,词性标注,命名实体识别,依存句法分析,语义角色标注的功能。
  • 安装 pyltp
    官方安装是直接使用pip install pyltp命令安装。
  • 使用 pyltp
    使用前请先下载完整模型:下载、ltp简介
  • 注意编码:
    • pyltp 的所有输入的分析文本和输出的结果的编码均为 UTF-8。
    • 如果您以非 UTF-8 编码的文本输入进行分析,结果可能为空。请注意源代码文件的默认编码。
    • 由于 Windows 终端采用 GBK 编码显示,直接输出 pyltp 的分析结果会在终端显示为乱码。您可以将标准输出重定向到文件,以 UTF8 方式查看文件,就可以解决显示乱码的问题。

2. 使用

2.1 分句

from pyltp import SentenceSplitter
sents = SentenceSplitter.split('元芳你怎么看?我就趴在窗口上看呗!元芳你怎么这样子了?我哪样子了?')
sents = '\n'.join(sents)   #不经过此处处理直接输出会报错 原因是没有给出输出的格式  当然 sents = '|'.join(sents)是用“|”分割的
print(sents)

结果:

元芳你怎么看?
我就趴在窗口上看呗!
元芳你怎么这样子了?
我哪样子了?

2.2 分词

1)普通分词

import os
from pyltp import Segmentor

LTP_DATA_DIR = r'./ltp_data'   # LTP模型目录路径
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')  # 分词模型路径, 模型名称为'cws.model'

segmentor = Segmentor()  #初始化实例
segmentor.load(cws_model_path)   #加载模型
words =segmentor.segment('元芳你怎么看')  #分词  返回类型值是native的VectorOfString类型,可以使用list转换为Python列表
print(type(words))   #分词类型
words = '|'.join(words)
print(type(words))
print(words)
segmentor.release()   #释放模型

结果:

<class 'pyltp.VectorOfString'>
<class 'str'>
元芳||怎么|

2)使用外部词典

首先,建立一个外部的词典文件:plain.txt

苯并芘
亚硝酸盐

代码:

import os
from pyltp import Segmentor

LTP_DATA_DIR = r'C:\Users\22843\AppData\Local\Programs\Python\Python36\Lib\site-packages\pyltp-0.2.1.dist-info\ltp_data'   # LTP模型目录路径
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')  # 分词模型路径, 模型名称为'cws.model'

segmentor = Segmentor()  #初始化实例
segmentor.load_with_lexicon(cws_model_path,'plain.txt')   #加载模型
words =segmentor.segment('亚硝酸盐是一种化学物质')  #分词  返回类型值是native的VectorOfString类型,可以使用list转换为Python列表
print(type(words))   #分词类型
words = '|'.join(words)
print(type(words))
print(words)
segmentor.release()   #释放模型


结果:

<class 'pyltp.VectorOfString'>
<class 'str'>
亚硝酸盐||||化学|物质
[INFO] 2020-11-20 00:52:40 loaded 2 lexicon entries

2.3 词性标注

import os
from pyltp import Postagger

LTP_DATA_DIR = r'C:\Users\22843\AppData\Local\Programs\Python\Python36\Lib\site-packages\pyltp-0.2.1.dist-info\ltp_data'   # LTP模型目录路径
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')  # 分词模型路径, 模型名称为'cws.model'

postagger = Postagger()  #初始化实例
postagger.load(pos_model_path)   #加载模型
words = ['元芳','你','怎么','看']  #words是分词模块的返回值,也支持Python原来的list
postags = postagger.postag(words)  #词性标注
postags = '|'.join(postags)
print(postags)
postagger.release()   #释放模型

结果:

nh|r|r|v

LTP 使用 863 词性标注集,如下图所示:
在这里插入图片描述

2.4 命名实体识别

import os
from pyltp import NamedEntityRecognizer

LTP_DATA_DIR = r'C:\Users\22843\AppData\Local\Programs\Python\Python36\Lib\site-packages\pyltp-0.2.1.dist-info\ltp_data'   # LTP模型目录路径
ner_model_path = os.path.join(LTP_DATA_DIR, 'ner.model')  # 分词模型路径, 模型名称为'cws.model'

recognizer = NamedEntityRecognizer()  #初始化shili
recognizer.load(ner_model_path)  #加载模型
words = ['元芳', '你', '怎么', '看']   # 分词模块的返回值
postags = ['nh', 'r', 'r', 'v']   # 词性标注的返回值
netags = recognizer.recognize(words,postags)  #命名实体识别
print(netags)
print(list(netags))
recognizer.release()  #模型释放

结果:

<pyltp.VectorOfString object at 0x0000025FCEDAA450>
['S-Nh', 'O', 'O', 'O']

LTP 采用 BIESO 标注体系。

  • B 表示实体开始词,I表示实体中间词,E表示实体结束词,S表示单独成实体,O表示不构成命名实体。

LTP 提供的命名实体类型为:人名(Nh)、地名(Ns)、机构名(Ni)。

  • B、I、E、S位置标签和实体类型标签之间用一个横线 - 相连;O标签后没有类型标签。

  • NE识别模块的标注结果采用O-S-B-I-E标注形式,其含义为:
    在这里插入图片描述

2.5 依存句法分析

import os
from pyltp import Parser

LTP_DATA_DIR = r'C:\Users\22843\AppData\Local\Programs\Python\Python36\Lib\site-packages\pyltp-0.2.1.dist-info\ltp_data'   # LTP模型目录路径
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')  # 分词模型路径, 模型名称为'cws.model'

parser = Parser()  #初始化实例
parser.load(par_model_path)  #加载模型
words = ['元芳', '你', '怎么', '看']   # 分词模块的返回值
postags = ['nh', 'r', 'r', 'v']   # 词性标注的返回值
arcs = parser.parse(words,postags)  #句法分析
arcs = '\t'.join('%d:%s'%(arc.head,arc.relation) for arc in arcs)
#arc.head表示依存弧的父节点词的索引。ROOT节点的索引是0,第一个词开始的索引依次为1,2,3...
#arc.relation表示依存弧的关系
print(arcs)
parser.release()  #模型释放

结果:

4:SBV	4:SBV	4:ADV	0:HED
  • 依存句法关系:
    在这里插入图片描述

2.6 词义角色标注

import os
LTP_DATA_DIR='D:\Data\ltp_data_v3.4.0'  # ltp模型目录的路径
srl_model_path = os.path.join(LTP_DATA_DIR, 'pisrl_win.model')  # 语义角色标注模型目录路径,模型目录为`srl`。注意该模型路径是一个目录,而不是一个文件。
 
from pyltp import SementicRoleLabeller
labeller = SementicRoleLabeller() # 初始化实例
labeller.load(srl_model_path)  # 加载模型
 
words = ['元芳', '你', '怎么', '看']
postags = ['nh', 'r', 'r', 'v']
# arcs 使用依存句法分析的结果
roles = labeller.label(words, postags, arcs)  # 语义角色标注
 
# 打印结果
for role in roles:
    print(role.index, "".join(
        ["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments]))
labeller.release()  # 释放模型

结果:

[dynet] random seed: 1676210130
[dynet] allocating memory: 2000MB
[dynet] memory allocation done.
3 A0:(1,1)ADV:(2,2)
  • 词义角色关系
    在这里插入图片描述

2.7 完整示例

import os, sys
from pyltp import SentenceSplitter, Segmentor, Postagger, Parser, NamedEntityRecognizer, SementicRoleLabeller

LTP_DATA_DIR = r'C:\Users\22843\AppData\Local\Programs\Python\Python36\Lib\site-packages\pyltp-0.2.1.dist-info\ltp_data'   # LTP模型目录路径

cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')  # 分词模型路径, 模型名称为'cws.model'

paragraph = '中国进出口银行与中国银行加强合作。中国进出口银行与中国银行加强合作!'

sentence = SentenceSplitter.split(paragraph)[0]  # 分句并取第一句

# 分词
segmentor = Segmentor()  # 初始化
segmentor.load(os.path.join(LTP_DATA_DIR, 'cws.model'))  # 加载模型
words = segmentor.segment(sentence)  # 分词
print(list(words))
print('|'.join(words))

# 词性标注
postagger = Postagger()  # 初始化
postagger.load(os.path.join(LTP_DATA_DIR, 'pos.model'))  # 加载模型
postags = postagger.postag(words)
# postags = postagger.postag(['中国', '进出口', '银行', '与', '中国银行', '加强', '合作', '。'])
print(list(postags))

# 依存句法分析
parser = Parser()
parser.load(os.path.join(LTP_DATA_DIR, 'parser.model'))
arcs = parser.parse(words, postags)
print('\t'.join('%d:%s' % (arc.head, arc.relation) for arc in arcs))

# 命名实体识别
recognizer = NamedEntityRecognizer()  # 实例化
recognizer.load(os.path.join(LTP_DATA_DIR, 'ner.model'))
netags = recognizer.recognize(words, postags)
print(list(netags))

# 语义角色标注
labeller = SementicRoleLabeller()
labeller.load(os.path.join(LTP_DATA_DIR, 'pisrl_win.model'))
roles = labeller.label(words, postags, arcs)
for role in roles:
    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()
recognizer.release()
labeller.release()

运行结果

['中国', '进出口', '银行', '与', '中国银行', '加强', '合作', '。']
中国|进出口|银行||中国银行|加强|合作|['ns', 'v', 'n', 'p', 'ni', 'v', 'v', 'wp']
3:ATT	3:ATT	6:SBV	6:ADV	4:POB	0:HED	6:VOB	6:WP
[dynet] random seed: 921284091
[dynet] allocating memory: 2000MB
['B-Ni', 'I-Ni', 'E-Ni', 'O', 'S-Ni', 'O', 'O', 'O']
[dynet] memory allocation done.
SRL: Model not loaded!

3. 参考

【1】https://blog.csdn.net/m0_43425029/article/details/109831743
【2】https://blog.csdn.net/weixin_33978016/article/details/94669702

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/412706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp - 全平台兼容的 “多图上传“ 功能,搭配 uview 组件库中的 upload 上传组件(附带详细的示例源码及注释,可直接复制使用或简单修改)

效果图 使用 uniapp 开发,多平台全端兼容的多图上传功能,支持限制个数及移除等。 组件库使用的是 uview 框架,上传组件基于 Upload组件,功能完美无bug。 准备阶段 Upload组件支持手动上传与

CMMI 3.0究竟有哪些变化?

新鲜出炉&#xff0c;CMMI 3.0究竟有哪些变化&#xff1f; 2023年4月6日&#xff0c;ISACA&#xff08;国际信息系统审计协会&#xff09;下属的CMMI研究院发布了CMMI 3.0版本。有哪些具体的变化呢&#xff1f;本文做了系统梳理&#xff0c;分为更名、新增、删除、实践域内的变…

代码随想录-67-450. 删除二叉搜索树中的节点

目录前言题目1.二叉搜索树特性递归找到要删除的节点2. 本题思路分析&#xff1a;3. 算法实现4. 算法坑点前言 我在刷卡哥的“代码随想录”&#xff0c;自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。 代码随想录此题链接 题目 1.二叉搜索树特性递归找到要删除的节…

【Python】Python中使用Matplotlib绘制折线图、散点图、饼形图、柱形图和箱线图

【Python】使用Matplotlib绘制折线图、散点图、饼形图、柱形图和箱线图 python数据可视化课程&#xff0c;实验二 Matplotlib 中文API&#xff1a;API 概览 | Matplotlib 一、实验任务的数据背景 提供的源数据&#xff08;数据文件employee.csv&#xff09;共拥有4个特征&…

Vue3自定义指令之前端水印功能实现

一、前置知识 — Vue 中的自定义指令 先来说说 vue2和vue3中自定义全局指令的区别 相同点&#xff1a;指令的应用场景&#xff0c;原理是一致的&#xff1b; 不同点&#xff1a;生命周期钩子函数名&#xff0c;指令定义的格式不一样。 vue2中自定义全局指令&#xff1a; 定义…

实时翻译器-实时自动翻译器

自动翻译器——让语言不再是障碍。 在当今全球化的背景下&#xff0c;语言已不再是跨文化交流的障碍。而自动翻译技术作为突破语言壁垒的有效手段&#xff0c;越来越受到关注和需求。我们的自动翻译器就是一个高效、准确的翻译工具&#xff0c;它能够根据用户输入的内容自动识…

mysql知识点看这一篇就够了!

存储引擎 InnoDB InnoDB 是 MySQL 默认的事务型存储引擎&#xff0c;只要在需要它不支持的特性时&#xff0c;才考虑使用其他存储引擎。 InnoDB 采用 MVCC 来支持高并发&#xff0c;并且实现了四个标准隔离级别(未提交读、提交读、可重复读、可串行化)。其默认级别时可重复读…

Springboot项目怎么设计业务操作日志功能?

目录 前言 需求描述与分析 系统日志 操作日志 设计思路 Spring AOP Filter和HandlerInterceptor 过滤器 拦截器 SpringAOP、过滤器、拦截器对比 实现方案 环境配置 依赖配置 表结构设计 代码实现 测试 调试方法 验证结果 总结 前言 很久以前都想写这篇文章…

[ 应急响应基础篇 ] Windows系统隐藏账户详解(Windows留后门账号)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Spring Web MVC DispatcherServlet详解—官方原版

一、概述 Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring框架中。正式名称“SpringWebMVC”来自其源模块&#xff08;Spring-webmvc&#xff09;的名称&#xff0c;但它更常见的名称是“SpringMVC”。 与Spring Web MVC并行&#xff0c…

【AIGC】GitHub Copilot 免费注册及在 PyCharm 中的安装使用

欢迎关注【youcans的 AIGC 学习笔记】原创作品 《GitHub Copilot 免费注册及在 VS Code 中的安装使用》 《GitHub Copilot 免费注册及在 PyCharm 中的安装使用》 GitHub Copilot 免费注册及在 PyCharm 中的安装使用1. GitHub Copilot 功能介绍2. 用户注册与申请2.1 个人订阅 Gi…

经典算法50例-无敌五十剑-算法五十重天

这里写目录标题1.汉诺塔2.费式数列3.巴斯卡三角形4.三色棋5.老鼠走迷官&#xff08;一&#xff09;6.老鼠走迷官&#xff08;二&#xff09;7.骑士走棋盘8.八皇后9.八枚银币10.生命游戏11.字串核对12.双色、三色河内塔13.背包问题14.蒙地卡罗法求 PI15.Eratosthenes筛选求质数1…

LeetCode——遍历序列构造二叉树

105从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,2…

3.12、生成者消费者模型

3.12、生成者消费者模型1.生产者消费者模型介绍2.一个没有实现线程同步的生产者消费者模型1.生产者消费者模型介绍 生产者消费者模型是一种多线程的设计模式&#xff0c;用于解决生产者和消费者之间的同步和协作问题。 在生产者消费者模型中&#xff0c;生产者和消费者通过共享…

代码随想录算法训练营第五十五天 | 392.判断子序列、115.不同的子序列

打卡第55天。 今日任务 392.判断子序列115.不同的子序列 392.判断子序列 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xf…

哪个品牌的蓝牙耳机便宜耐用?内行公认四大便宜耐用的蓝牙耳机

蓝牙耳机发展至今&#xff0c;品牌众多&#xff0c;且各品牌旗下拥有无数不同价格的耳机&#xff0c;各自的主打优势又不一样。那么&#xff0c;哪个品牌的蓝牙耳机便宜耐用&#xff1f;下面&#xff0c;我来给大家推荐四款便宜耐用的蓝牙耳机&#xff0c;一起来看看吧。 一、…

【数据结构】第九站:树和二叉树

目录 一、树的概念及结构 1.树的概念 2.树的相关概念 3.树的表示 二、二叉树的概念及结构 1.概念 2.特殊的二叉树 3.二叉树的性质 三、二叉树的存储结构 一、树的概念及结构 1.树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个…

Redis缓冲区溢出及解决方案

缓冲区(buffer)&#xff0c;是内存空间的一部分。也就是说&#xff0c;在内存空间中预留了一定的存储空间&#xff0c;这些存储空间用来缓冲输入或输出的数据&#xff0c;这部分预留的空间就叫做缓冲区。 一、Redis缓冲区溢出影响 在Redis中&#xff0c;主要有三个场景用到了…

数据资产目录建设方法

以信息技术为核心的第四次经济革命使得全球经济进入到数字化转型时期&#xff0c;对于今天的企业来说&#xff0c; 数字化转型已经不是可做可不做的自选题&#xff0c; 而是必须付诸行动的必选题。 从数字化转型的实践经验中我们可以得知&#xff0c;企业的数据资产是企业数字…

Flink CDC 在京东的探索与实践

摘要&#xff1a;本文整理自京东资深技术专家韩飞&#xff0c;在 Flink Forward Asia 2022 数据集成专场的分享。本篇内容主要分为四个部分&#xff1a; 京东自研 CDC 介绍京东场景的 Flink CDC 优化业务案例未来规划点击查看直播回放和演讲 PPT 一、京东自研 CDC 介绍 京东自研…