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

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

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

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋冬无暖阳°

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值