Pyltp的安装使用笔记
LTP(Language Technology Platform) 提供了一系列中文自然语言处理工具,用户可以使用这些工具对于中文文本进行分词、词性标注、句法分析等等工作。
“语言云” 以哈工大社会计算与信息检索研究中心研发的 “语言技术平台(LTP)” 为基础,为用户提供高效精准的中文自然语言处理云服务。
pyltp 是 LTP 的 Python 封装,提供了分词,词性标注,命名实体识别,依存句法分析,语义角色标注的功能。
1.安装python3.6
因为pyltp支持版本的问题l,python的版本我u用到了3.6.1
https://www.python.org/ftp/python/3.6.1/python-3.6.1-amd64.exe
此链接下载python安装,然后在安装界面勾选把路径加到系统变量
在cmd中输入
python -V
出现如图所示,即安装成功
2.安装pyltp2.1
尝试了网上所有的方法pip,以及源码下载,都太麻烦
在此我下载了一个whl
链接:https://pan.baidu.com/s/1ee4IXNxuSFQRnoke0I3aNQ
提取码:9lac
下载之后打开cmd,进到对应下载目录,输入
pip install pyltp-0.2.1-cp36-cp36m-win_amd64.whl
等待安装成功
3.下载ltp模型文件
此连接为pyltp的一个使用文档
https://pyltp.readthedocs.io/zh_CN/latest/api.html
通过百度云可以下载相应的模型文件
https://pan.baidu.com/share/link?shareid=1988562907&uk=2738088569
按照网上查阅来说应该要版本对应一致,但是我下载2.0版本测试失败,所以我试着安装3.4版本的时候就可以,所以我下载了3.4版本的模型文件
解压之后使用的时候发现Ltp3.4.0在windows下进行语义角色标注失败,上网查阅发现原因是ltp3.4.0,3.4.0 版本 SRL模型 pisrl.model 如在windows系统下不可用
所以我到了此链接下下载了可用模型文件”pisrl_win.model”
也可以直接用下载链接:在此附http://model.scir.yunfutech.com/server/3.4.0/pisrl_win.model连接。
下载之后吧pisrl_win.model放到ltp模型文件夹与pisrl.model文件同路径即可。
4.代码测试
通过此github的Matt Zheng作者的LtpExtraction(基于ltp的简单评论观点抽取模块)项目中的SRLparsing.py代码运行成功,并成功抽取出评论中的观点
https://github.com/mattzheng/LtpExtraction
此为Matt Zheng作者在github上面的示例代码
-*- coding: utf-8 -*-
ltp模块
import sys, os
from pyltp import SentenceSplitter, Segmentor, Postagger, Parser, NamedEntityRecognizer, SementicRoleLabeller
import pandas as pd
import numpy as np
from tqdm import tqdm
#segmentor.release() # 释放模型
class ltp_api(object):
def __init__(self,MODELDIR,exword_path = None):
self.MODELDIR = MODELDIR
self.output = {}
self.words = None
self.postags = None
self.netags = None
self.arcs = None
self.exword_path = exword_path # e.x: '/data1/research/matt/ltp/exwords.txt'
# 分词
self.segmentor = Segmentor()
if not self.exword_path:
# 是否加载额外词典
self.segmentor.load(os.path.join(self.MODELDIR, "cws.model"))
else:
self.segmentor.load_with_lexicon(os.path.join(self.MODELDIR, "cws.model"), self.exword_path)
# 词性标注
self.postagger = Postagger()
self.postagger.load(os.path.join(self.MODELDIR, "pos.model"))
# 依存句法
self.parser = Parser()
self.parser.load(os.path.join(self.MODELDIR, "parser.model"))
# 命名实体识别
self.recognizer = NamedEntityRecognizer()
self.recognizer.load(os.path.join(self.MODELDIR, "ner.model"))
# 语义角色
self.labeller = SementicRoleLabeller()
self.labeller.load(os.path.join(MODELDIR, "pisrl.model"))
# 分词
def ltp_segmentor(self,sentence):
words = self.segmentor.segment(sentence)
return words
# 词性标注
def ltp_postagger(self,words):
postags = self.postagger.postag(words)
return postags
# 依存语法
def ltp_parser(self,words, postags):
arcs = self.parser.parse(words, postags)
return arcs
# 命名实体识别
def ltp_recognizer(self,words, postags):
netags = self.recognizer.recognize(words, postags)
return netags
# 语义角色识别
def ltp_labeller(self,words,postags, arcs):
output = []
roles = self.labeller.label(words, postags, arcs)
for role in roles:
output.append([(role.index,arg.name, arg.range.start, arg.range.end) for arg in role.arguments])
return output
def release(self):
self.segmentor.release()
self.postagger.release()
self.parser.release()
self.recognizer.release()
self.labeller.release()
def get_result(self,sentence):
self.words = self.ltp_segmentor(sentence)
self.postags = self.ltp_postagger(self.words)
self.arcs = self.ltp_parser(self.words, self.postags)
self.netags = self.ltp_recognizer(self.words, self.postags)
self.output['role'] = self.ltp_labeller(self.words,self.postags, self.arcs)
# 载入output
self.output['words'] = list(self.words)
self.output['postags'] = list(self.postags)
self.output['arcs'] = [(arc.head, arc.relation) for arc in self.arcs]
self.output['netags'] = list(self.netags)
'''
语义角色的解读
主要定位到动词,然后动词实施者与动作的影响人
A0 - A1 ,A0代表主语,A1代表动作的影响
'''
def FindA0(labelle,word,postags,neg_word = ['就是','是'],n_pos = ['n','ns','nt']):
'''
找到是否有A0
输入:labelle,word,postags相关词类型
输出:
A0 是否有A0 bool,True/False
result:[名词,动词,修饰词(相当于定语)]
'''
result = []
A0 = False
# 是否有A0,动作实施者,相当于主语
sign_n = [n for n,la in enumerate(labelle) if la[1] == 'A0']
if len(sign_n) > 0:
A0 = True
la = labelle[sign_n[0]]
verb_word = word[la[0]]
if verb_word in neg_word:
return A0,result
low = la[2]
high = la[3] if (la[3] + 1) > len(words) else la[3] + 1
long_words = [words[n] for n in range(low,high) if postags[n] in n_pos]
n_word = word[la[2]] if la[2] == la[3] else long_words
# A1 动作影响,想当于宾语
sign_n_A1 = [n for n,la in enumerate(labelle) if la[1] == 'A1']
adore_word = []
if len(sign_n_A1) > 0:
la2 = labelle[sign_n_A1[0]]
low = la2[2]
high = la2[3] if (la2[3] + 1) > len(words) else la2[3] + 1
adore_word = word[la2[2]] if la2[2] == la2[3] else words[ low : high ]
result = [n_word,verb_word,adore_word]
return A0,result
def SRLparsing(labeller,words,postags,ToAfter = ['TMP','A1','DIS'],neg_word = ['就是','是'],n_pos = ['n','ns','nt']):
'''
输入:
ToAfter,指的是这些语义角色的类型,TMP(时间),A1(动作的影响),DIS(标记语),这三个影响的对象在后面
输出:
([['ADV', ('最后', '打')], ['ADV', (['平均', '下来'], '便宜')], ['A0', ('40', '便宜')]], (True, ['40', '便宜', []]))
'''
labeller_refine = []
labeller_A0 = []
for labelle in labeller:
#print(labelle)
for la in labelle:
if la[2] == la[3]:
tmp = [la[1],(words[la[0]],words[la[3]])] if la[1] in ToAfter else [la[1],(words[la[3]],words[la[0]])]
labeller_refine.append(tmp)
#print('keypoint word :',words[la[0]])
#print(tmp)
else:
low = la[2]
high = la[3] if (la[3] + 1) > len(words) else la[3] + 1
tmp = [la[1],(words[la[0]],words[low:high])] if la[1] in ToAfter else [la[1],(words[low:high],words[la[0]])]
labeller_refine.append(tmp)
#print('keypoint word :',words[la[0]])
#print(tmp)
#print('\n A0A1 ==== > ',FindA0(labelle,words,postags))
labeller_A0 = FindA0(labelle,words,postags,neg_word = neg_word,n_pos = n_pos)
#print('-----------\n')
return labeller_refine,labeller_A0
if __name__=="__main__":
MODELDIR='ltp-models/ltp_data_v3.4.0' # 模型文件
ltp = ltp_api(MODELDIR)
# ltp.release()
sentence = '陆丙文很帅!'
words = ltp.ltp_segmentor(sentence) # 分词
postags = ltp.ltp_postagger(words) # 词性
arcs = ltp.ltp_parser(words,postags) #依存
netags = ltp.ltp_recognizer(words,postags)# 命名实体识别
labeller = ltp.ltp_labeller(words,postags, arcs) #语义角色
print(SRLparsing(labeller,words,postags,ToAfter = ['TMP','A1','DIS']))
现在您可以开始你的pyltp使用之旅了,冲冲冲!!
Original: https://blog.csdn.net/weixin_60021697/article/details/123498993
Author: 挖坑自埋歌
Title: Pyltp的安装使用笔记
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/528680/
转载文章受原作者版权保护。转载请注明原作者出处!