LTP/pyltp安装和使用教程

文章目录

        • LTP介绍
        • 分句
        • 分词
          • 加载外部词典
          • 个性化分词
        • 词性标注
        • 命名实体识别NER
        • 依存句法分析
        • 语义角色标注

LTP介绍

官网:https://ltp.ai/
下载可以到官网的下载专区:https://ltp.ai/download.html

在这里插入图片描述
语言技术平台(Language Technology Platform,LTP):是哈工大社会计算与信息检索研究中心历时十年研制的一整套开放中文自然语言处理系统。提供了一整套自底向上的丰富、高效、高精度的中文自然语言处理模块 (包括词法、句法、语义等5项中文处理核心技术)。

本文使用的LTP版本是ltp_data_v3.4.0
pyltp版本是0.4.0

分句
from pyltp import SentenceSplitter

sent = "知识图谱按照功能和应用场景可以分为通用知识图谱和领域知识图谱。其中通用知识图谱面向的是通用领域,强调知识的广度,形态通常为结构化的百科知识,\
    针对的使用者主要为普通用户;领域知识图谱则面向某一特定领域,强调知识的深度,通常需要基于该行业的数据库进行构建,针对的使用者为行业内的从业人员以及潜在的业内人士等。"

sents = SentenceSplitter.split(sent)
output_split_sen = '\n'.join(sents) 
print(output_split_sen)
知识图谱按照功能和应用场景可以分为通用知识图谱和领域知识图谱。
其中通用知识图谱面向的是通用领域,强调知识的广度,形态通常为结构化的百科知识,    针对的使用者主要为普通用户;
领域知识图谱则面向某一特定领域,强调知识的深度,通常需要基于该行业的数据库进行构建,针对的使用者为行业内的从业人员以及潜在的业内人士等。
分词
import os
from pyltp import Segmentor

# 分词模型的路径
LTP_DATA_DIR = 'E:/ltp_data_v3.4.0'
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')
# 实例化
segmentor = Segmentor()
# 加载分词模型
segmentor.load(cws_model_path)
# 分词
# words返回值类型是native的VectorOfString类型,可以使用list转换成Python的列表类型
words = segmentor.segment("你认为人工智能、机器学习和深度学习的关系是什么?")
# 输出
output_split_words = '|'.join(words)
print(list(words))
print(output_split_words)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_24988/3875451578.py in <module>
      6 cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')
      7 # 实例化
----> 8 segmentor = Segmentor()
      9 # 加载分词模型
     10 segmentor.load(cws_model_path)

TypeError: __init__(): incompatible constructor arguments. The following argument types are supported:
    1. pyltp.Segmentor(model_path: str, lexicon_path: str = None, force_lexicon_path: str = None)

Invoked with: 

直接使用会报错,因为目前的pyltp版本是0.4.0,版本过高,此时分词的写法已经发生改变。

最新的写法是将实例化加载分词模型合并起来。后面的词性标注等方法也是如此。如果版本较低,写的方法就不用改变。

import os
from pyltp import Segmentor

# 分词模型的路径
LTP_DATA_DIR = 'E:/ltp_data_v3.4.0'
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')
# 实例化
segmentor = Segmentor(cws_model_path)
# 分词
# words返回值类型是native的VectorOfString类型,可以使用list转换成Python的列表类型
words = segmentor.segment("你认为人工智能、机器学习和深度学习的关系是什么?")
# 输出
output_split_words = '|'.join(words)
print(list(words))
print(output_split_words)
['你', '认为', '人工智能', '、', '机器', '学习', '和', '深度', '学习', '的', '关系', '是', '什么', '?']|认为|人工智能||机器|学习||深度|学习||关系||什么|
加载外部词典

特有名词,比如机器学习、深度学习等词语不应该分开,所以可以将它们放在特有名词的外部词典中进行加载。

在这里插入图片描述

  • 旧版本写法
segmentor_1 = Segmentor()
# 加载模型,第二个参数是外部词典文件路径
segmentor_1.load_with_lexicon(cws_model_path, 'dict.txt') 
words_1 = segmentor_1.segment('你会机器学习中的随机森林吗')
output_split_words_1 = '|'.join(words_1)

print(list(output_split_words_1))
print(output_split_words_1)
segmentor.release()
  • 新版本写法
# 加载模型,第二个参数是外部词典文件路径
segmentor_1 = Segmentor(cws_model_path,lexicon_path='dict.txt')

words_1 = segmentor_1.segment("你认为人工智能、机器学习和深度学习的关系是什么?")
output_split_words_1 = '|'.join(words_1)

print(list(output_split_words_1))
print(output_split_words_1)
segmentor.release()
['你', '|', '认', '为', '|', '人', '工', '智', '能', '|', '、', '|', '机', '器', '学', '习', '|', '和', '|', '深', '度', '学', '习', '|', '的', '|', '关', '系', '|', '是', '|', '什', '么', '|', '?']|认为|人工智能||机器学习||深度学习||关系||什么|
个性化分词

pyltp还支持个性化分词:个性化分词为了解决测试数据切换到如小说、财经等不同于新闻领域的领域。 在切换到新领域时,用户只需要标注少量数据。 个性化分词会在原有新闻数据基础之上进行增量训练。 从而达到即利用新闻领域的丰富数据,又兼顾目标领域特殊性的目的。

# 个性化分词
from pyltp import CustomizedSegmentor

customized_segmentor = CustomizedSegmentor()
# 加载模型,第二个参数是您的增量模型路径
customized_segmentor.load(cws_model_path, '/path/to/your/customized_model')
words_2 = customized_segmentor.segment('你会机器学习中的随机森林吗')

print('\t'.join(words_2))
customized_segmentor.release()

# 个性化分词
from pyltp import CustomizedSegmentor

customized_segmentor = CustomizedSegmentor()
# 加载模型,第二个参数是您的增量模型路径
customized_segmentor.load(cws_model_path, '/path/to/your/customized_model')
words_2 = customized_segmentor.segment('你会机器学习中的随机森林吗')

print('\t'.join(words_2))
customized_segmentor.release()

词性标注

在这里插入图片描述

from pyltp import Postagger

# 词性标注模型路径,模型名称为`pos.model`
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')  

postagger = Postagger(pos_model_path) # 初始化实例

postags = postagger.postag(words) 
postags_1 = postagger.postag(words_1)  # 词性标注

print( '\t'.join(postags))
print( '\t'.join(postags_1))
postagger.release()  # 释放模型
['你', '认为', '人工智能', '、', '机器', '学习', '和', '深度', '学习', '的', '关系', '是', '什么', '?']|认为|人工智能||机器|学习||深度|学习||关系||什么|?
r       v       n       wp      n       v       c       n       v       u       n       v       r       wp

如果添加了新的分词字典,那么当其进行词性标注时,会出现错误,如将“机器学习”误认为动词,因此词性标注时也可以使用外部词典:词性标注外部词典同样为一个文本文件,每行指定一个词,第一列指定单词,第二列之后指定该词的候选词性(可以有多项,每一项占一列),列与列之间用空格区分。


# 词性标注模型路径,模型名称为`pos.model`
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')  

postagger_1 = Postagger(pos_model_path,lexicon_path='dict.txt') # 初始化实例,加载模型

# 标注结果
postags_2 = postagger_1.postag(words_1)  # 词性标注

print(list(postags_2))
postagger_1.release()  # 释放模型
['你', '认为', '人工智能', '、', '机器学习', '和', '深度学习', '的', '关系', '是', '什么', '?']|认为|人工智能||机器学习||深度学习||关系||什么|['r', 'v', 'n', 'wp', 'n', 'c', 'n', 'u', 'n', 'v', 'r', 'wp']
命名实体识别NER

在这里插入图片描述

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

  • 旧版本写法
from pyltp import NamedEntityRecognizer
import os

LTP_DATA_DIR = 'E:/ltp_data_v3.4.0'

# 命名实体识别模型路径,模型名称为`ner.model`
ner_model_path = os.path.join(LTP_DATA_DIR, 'ner.model') 
recognizer = NamedEntityRecognizer() 
recognizer.load(ner_model_path) 
# 命名实体识别
words_4 = ['奥巴马','住','在','纽约']
postags_4 = ['nh','v','r','ns']
netags = recognizer.recognize(words_4, postags_4) 

print( '\t'.join(netags))
recognizer.release()
  • 新版本写法
from pyltp import NamedEntityRecognizer
import os

LTP_DATA_DIR = 'E:/ltp_data_v3.4.0'

# 命名实体识别模型路径,模型名称为`ner.model`
ner_model_path = os.path.join(LTP_DATA_DIR, 'ner.model') 
recognizer = NamedEntityRecognizer(ner_model_path) 

# 命名实体识别
words_4 = ['奥巴马','住','在','纽约']
postags_4 = ['nh','v','r','ns']
netags = recognizer.recognize(words_4, postags_4) 

print('\t'.join(words_4))
print('\t'.join(postags_4))
print( '\t'.join(netags))
recognizer.release()
奥巴马  住      在      纽约
nh      v       r       ns
S-Nh    O       O       B-Ns
依存句法分析

在这里插入图片描述

  • 旧版本写法
# 依存句法分析模型路径,模型名称为`parser.model`
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')  
parser = Parser() 
parser.load(par_model_path) 

# 句法分析
arcs = parser.parse(words_4, postags_4) 

print("\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs))
parser.release() 
  • 新版本写法
from pyltp import Parser
import os 

LTP_DATA_DIR = 'E:/ltp_data_v3.4.0'

# 依存句法分析模型路径,模型名称为`parser.model`
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')  
parser = Parser(par_model_path) 

# 句法分析
words_4 = ['奥巴马','住','在','纽约']
postags_4 = ['nh','v','r','ns']
arcs = parser.parse(words_4, postags_4) 

print("\t".join("%d:%s" % (arc[0], arc[1]) for arc in arcs))
parser.release() 
2:SBV   0:HED   2:CMP   3:POB

其中,words_4postags_4 分别为分词和词性标注的结果。同样支持Python原生的list类型。

  • 旧版本
    arc.head 表示依存弧的父节点词的索引。ROOT节点的索引是0,第一个词开始的索引依次为1、2、3…
    arc.relation 表示依存弧的关系。
    那么,2:SBV就表示当前词“奥巴马”和第二个词也就是“住”是主谓关系。
语义角色标注

在这里插入图片描述
注意:对windows系统此处模型加载必须为pisrl_win.model,下载地址在官网下载界面http://model.scir.yunfutech.com/server/3.4.0/pisrl_win.model。

  • 旧版本写法
from pyltp import SementicRoleLabeller

srl_model_path = os.path.join(LTP_DATA_DIR, 'pisrl_win.model') 
labeller = SementicRoleLabeller() 
labeller.load(srl_model_path) 
# arcs 使用依存句法分析的结果
roles = labeller.label(words_4, postags_4, 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()  # 释放模型
  • 新版本写法
from pyltp import Parser
import os 

LTP_DATA_DIR = 'E:/ltp_data_v3.4.0'

# 依存句法分析模型路径,模型名称为`parser.model`
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')  
parser = Parser(par_model_path) 

# 句法分析
words_4 = ['奥巴马','住','在','纽约']
postags_4 = ['nh','v','r','ns']
arcs = parser.parse(words_4, postags_4) 

from pyltp import SementicRoleLabeller

srl_model_path = os.path.join(LTP_DATA_DIR, 'pisrl_win.model') 
labeller = SementicRoleLabeller(srl_model_path) 

# arcs 使用依存句法分析的结果
roles = labeller.label(words_4, postags_4, arcs)  # 语义角色标注
# 打印结果
for role in roles:
    print (role)
labeller.release()  # 释放模型

第一个词开始的索引依次为0、1、2…
返回结果 roles 是关于多个谓词的语义角色分析的结果。由于一句话中可能不含有语义角色,所以结果可能为空。

  • role.index 代表谓词的索引。
  • role.arguments 代表关于该谓词的若干语义角色。
  • arg.name 表示语义角色类型。
  • arg.range.start 表示该语义角色起始词位置的索引。
  • arg.range.end 表示该语义角色结束词位置的索引。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round 925 (Div. 3)(A,B,C,D,E,F,G)

比赛链接 这场打的很顺&#xff0c;感觉难度和 div 4 差不多&#xff0c;不是很难。D题稍微考了考同余的性质&#xff0c;E题直接模拟过程即可&#xff0c;F题也可以暴力模拟或者拓扑排序&#xff0c;G题是个数学题&#xff0c;是个简单隔板法。A到F题都可以直接模拟就有点离谱…

嵌入式 day23

链接命令 建立链接文件&#xff1a;ln 命令 命令名称&#xff1a;ln 命令所在路径&#xff1a;/bin/ln 执行权限&#xff1a;所有用户 语法&#xff1a;ln -s [原文件] [目标文件] -s 创建软链接 功能描述&#xff1a;生成链接文件 范例&#xff1…

[嵌入式系统-24]:RT-Thread -11- 内核组件编程接口 - 网络组件 - TCP/UDP Socket编程

目录 一、RT-Thread网络组件 1.1 概述 1.2 RT-Thread支持的网络协议栈 1.3 RT-Thread如何选择不同的网络协议栈 二、Socket编程 2.1 概述 2.2 UDP socket编程 2.3 TCP socket编程 2.4 TCP socket收发数据 一、RT-Thread网络组件 1.1 概述 RT-Thread 是一个开源的嵌入…

不错的PMO 2024建设规划长图

公众号"PMO前沿"是国内最大的PMO组织&#xff0c;经常各个城市举办线下线上活动&#xff0c;很多专家&#xff0c;相当赞&#xff0c;而且每天还分享不少文章&#xff08;春节都不停更&#xff0c;相当感动&#xff09;&#xff0c;建议关注。看到一个不错的PMO 组织…

win32汇编获取系统信息

.data fmt db "页尺寸&#xff1a;%d",0 db "" lpsystem SYSTEM_INFO <?> szbuf db 200 dup(0) .const szCaption db 系统信息,0 .code start: invoke GetSystemInfo,addr lpsystem …

四川古力未来科技公司抖音小店:靠谱的新电商之旅

随着互联网的飞速发展&#xff0c;电商行业日新月异&#xff0c;新兴平台如抖音小店正成为消费者新的购物天堂。在众多抖音小店中&#xff0c;四川古力未来科技公司的店铺以其独特的魅力吸引了众多消费者的目光。那么&#xff0c;四川古力未来科技公司抖音小店到底靠不靠谱呢&a…

【数据结构】17 二叉树的建立

二叉树的建立 由于树是非线性结构&#xff0c;创建一颗二叉树必须首先确定树中结点的输入顺序&#xff0c;常用方法是先序创建和层序创建。 层序创建所用的节点输入序列是按数的从上至下从左到右的顺序形成的各层的空结点输入数值0。在构造二叉树过程中需要一个队列暂时存储各…

鸿蒙开发系列教程(二十三)--List 列表操作(2)

列表样式 1、设置内容间距 在列表项之间添加间距&#xff0c;可以使用space参数&#xff0c;主轴方向 List({ space: 10 }) { … } 2、添加分隔线 分隔线用来将界面元素隔开&#xff0c;使单个元素更加容易识别。 startMargin和endMargin属性分别用于设置分隔线距离列表侧…

【测试运维】性能测试经验文档总结第3篇:VuGen详解(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论性能测试相关知识。入门阶段&#xff1a;认识性能测试分类-(负载测试、压力测试、并发测试、稳定性测试)&#xff0c;常用性能测试指标-(吞吐量、并发数、响应时间、点击数...)&#xff0c;性能测试工具选择。性能脚本&…

Java实现停车场收费系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 停车位模块2.2 车辆模块2.3 停车收费模块2.4 IC卡模块2.5 IC卡挂失模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 停车场表3.2.2 车辆表3.2.3 停车收费表3.2.4 IC 卡表3.2.5 IC 卡挂失表 四、系统实现五、核心代码…

Java面向对象案例之招待朋友Friend(二)

类主要结构图 抽象类&#xff1a;Friend&#xff08;朋友作为父类&#xff09;子类&#xff1a;Chinese&#xff08;中国国籍&#xff09;、Foreigner&#xff08;外国国籍&#xff09;主人&#xff1a;Master&#xff08;主人&#xff0c;用来款待客人&#xff09;测试类&…

ClickHouse--12-可视化工具操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 可视化工具操作1 tabixhttp://ui.tabix.io/ 2 DBeaverhttps://dbeaver.io/download/ 可视化工具操作 1 tabix tabix 支持通过浏览器直接连接 ClickHouse&#xff…

Kubernetes 元信息与控制器模型

一、资源元信息&#xff1a; Kubernetes 的资源对象组成&#xff1a;主要包括了 Spec、Status 和元数据。其中 Spec 部分用来描述期望的状态&#xff0c;Status 部分用来描述观测到的状态。 元数据主要包括了&#xff1a;Labels 用来识别资源的标签&#xff1b;Annotations 用…

在 Android 上部署自定义 YOLOv8 教程

在本教程中&#xff0c;我将向您展示如何在 Android 设备上使用自定义数据集部署 YOLOv8。想要了解如何在 Android 设备上使用您自己的数据集部署 YOLOv8&#xff1f;本文将展示如何操作。 Android 上的 自定义 YOLOv8 &#x1f525; ⚡️ 结果显示标题 对从 GoPro 流式传输到移…

【刷刷刷,爽!】leetcode198. 打家劫舍

题目如上&#xff01; 这是一道非常非常标准的初级动规题。属于走楼梯的进阶版。所以我们尝试把他变成走楼梯。 怎么变&#xff1f;或者说是怎么看成走楼梯。 答案是&#xff01;&#xff01;&#xff01;&#xff01; 看最后一个数。 往往会最有灵感。 比如示例1中[1,2,3,4]&a…

免费申请一个美国EDU学生邮箱

EDU邮箱的作用 例如大名鼎鼎的GitHub学生包。包含各种服务器的优惠卷&#xff0c;可以让你免费使用1-2年的服务器。免费的域名。免费的网站证书。太多了。 微软&#xff1a;免费的5T的OneDrive账户。 Google&#xff1a;G Sutie Drive无限容量 微软、苹果、AWS、都有针对学…

Sora和Pika,RunwayMl,Stable Video对比!网友:Sora真王者,其他都是弟

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

SpringCloud-Nacos集群搭建

本文详细介绍了如何在SpringCloud环境中搭建Nacos集群&#xff0c;为读者提供了一份清晰而详尽的指南。通过逐步演示每个关键步骤&#xff0c;包括安装、配置以及Nginx的负载均衡设置&#xff0c;读者能够轻松理解并操作整个搭建过程。 一、Nacos集群示意图 Nacos&#xff0…

17.3.1.6 自定义处理

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 模拟某款图像处理软件的处理&#xff0c;它只留下红色、绿色或者蓝色这样的单一颜色。 首先按照颜色划分了6个色系&#xff0c;分别…