Pyltp的安装使用笔记

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

Pyltp的安装使用笔记

出现如图所示,即安装成功

2.安装pyltp2.1

尝试了网上所有的方法pip,以及源码下载,都太麻烦

在此我下载了一个whl

链接:https://pan.baidu.com/s/1ee4IXNxuSFQRnoke0I3aNQ

提取码:9lac

Pyltp的安装使用笔记

下载之后打开cmd,进到对应下载目录,输入

pip install pyltp-0.2.1-cp36-cp36m-win_amd64.whl

等待安装成功

3.下载ltp模型文件

此连接为pyltp的一个使用文档

https://pyltp.readthedocs.io/zh_CN/latest/api.html

Pyltp的安装使用笔记

通过百度云可以下载相应的模型文件

https://pan.baidu.com/share/link?shareid=1988562907&uk=2738088569

按照网上查阅来说应该要版本对应一致,但是我下载2.0版本测试失败,所以我试着安装3.4版本的时候就可以,所以我下载了3.4版本的模型文件

Pyltp的安装使用笔记

解压之后使用的时候发现Ltp3.4.0在windows下进行语义角色标注失败,上网查阅发现原因是ltp3.4.0,3.4.0 版本 SRL模型 pisrl.model 如在windows系统下不可用

所以我到了此链接下下载了可用模型文件”pisrl_win.model”

http://ltp.ai/download.html

Pyltp的安装使用笔记

也可以直接用下载链接:在此附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

Pyltp的安装使用笔记

Pyltp的安装使用笔记

此为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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球