在Centos7上安装使用Pyltp

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/stevenkwong/article/details/73624316

本篇主要介绍在centos7上安装pyltp时本人遇到的问题以及相应的对策。

什么是pyltp

“语言技术平台(Language Technology Platform,LTP)是哈工大社会计算与信息检索研究中心历时十年开发的一整套中文语言处理系统。LTP制定了基于XML的语言处理结果表示,并在此基础上提供了一整套自底向上的丰富而且高效的中文语言处理模块(包括词法、句法、语义等6项中文处理核心技术),以及基于动态链接库(Dynamic Link Library, DLL)的应用程序接口、可视化工具,并且能够以网络服务(Web Service)的形式进行使用。”

pyltp就是这款平台的python版本。

安装方式

官方有pip和python install
如果是在anaconda3的环境下,使用pip会报错,官方建议下载整个源码库,然后在本地用python install

-用pip安装报错的问题答复

 $ git clone https://github.com/HIT-SCIR/pyltp
 $ git submodule init
 $ git submodule update
 $ python setup.py install

安装g++

git在国内的网速奇慢,好不容易将pyltp的源码库都下下来了,这时也按前面提到的python install的方法操作,却弹出报错,其中有一句

gcc: error trying to exec 'cc1plus': execvp: 没有那个文件或目录

是因为没有安装g++造成的

缺啥补啥呗,但要注意g++在yum里面叫做gcc-c++
所以在shell里面要敲入

yum install gcc-c++

安装成功

当g++安装好之后,就安装成功了,这时候import pyltp 不报错就安装成功了。然后下载你想要的版本的模型。我选择了3.3.1版本的,然后 将其中.zip 那个模型压缩文件解压,按照使用方法指定模型路径,导入模型,就可以使用啦~

效果

其他性能效果暂不评论,我是冲着语义角色标注的功能才用pyltp的,但出来的效果似乎不太理想。

就拿官方的
‘国务院总理李克强调研上海外高桥时提出,支持上海积极探索新机制。’
例子试了一下,‘国务院总理李克’居然被识别成TMP(时间)的角色上了。
感觉实在不太理想。可能得考虑自己搭神经网络实现了。

就拿官方的

个人demo源码

# -*- coding: utf-8 -*-

input_str = '国务院总理李克强调研上海外高桥时提出,支持上海积极探索新机制。'

import os
LTP_DATA_DIR = '/steven_workspace/ltp_data'  # ltp模型目录的路径
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model') 
# 先做分词
print('='*10+'分词'+'='*10)
from pyltp import Segmentor
segmentor = Segmentor()  # 初始化实例
segmentor.load(cws_model_path)  # 加载模型
words = segmentor.segment(input_str)  # 分词
print ('\t'.join(words))
segmentor.release()  # 释放模型

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


from pyltp import Postagger
postagger = Postagger() # 初始化实例
postagger.load(pos_model_path)  # 加载模型
postags = postagger.postag(words)  # 词性标注
print_str_list = ['%s: %s'%(words[ind],postags[ind]) for ind in range(len(words))]

print ('\t'.join(print_str_list))
postagger.release()  # 释放模型
# 做依存句法分析
print('='*10+'依存句法分析'+'='*10)
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')  # 依存句法分析模型路径,模型名称为`parser.model`

from pyltp import Parser
parser = Parser() # 初始化实例
parser.load(par_model_path)  # 加载模型
arcs = parser.parse(words, postags)  # 句法分析

arcs_str_list = ["%d:%s" % (arc.head, arc.relation) for arc in arcs]
print_str_list = ['%s: %s'%(words[ind],arcs_str_list[ind]) for ind in range(len(words))]

print ("\t".join(print_str_list))
parser.release()  # 释放模型

# 命名实体识别
print('='*10+'命名实体识别'+'='*10)
ner_model_path = os.path.join(LTP_DATA_DIR, 'ner.model')  # 命名实体识别模型路径,模型名称为`pos.model`
from pyltp import NamedEntityRecognizer
recognizer = NamedEntityRecognizer() # 初始化实例
recognizer.load(ner_model_path)  # 加载模型
netags = recognizer.recognize(words, postags)  # 命名实体识别

print_str_list = ['%s: %s'%(words[ind],netags[ind]) for ind in range(len(words))]

print ('\t'.join(print_str_list))
recognizer.release()  # 释放模型
# 做语义角色标注
print('='*10+'语义角色标注'+'='*10)
srl_model_path = os.path.join(LTP_DATA_DIR, 'srl')  # 语义角色标注模型目录路径,模型目录为`srl`。注意该模型路径是一个目录,而不是一个文件。

from pyltp import SementicRoleLabeller
labeller = SementicRoleLabeller() # 初始化实例
labeller.load(srl_model_path)  # 加载模型

# arcs 使用依存句法分析的结果
roles = labeller.label(words, postags, netags, 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]))
    print(role.index, "".join(
        ["%s:(%s)" % (arg.name, input_str[arg.range.start:arg.range.end+1]) for arg in role.arguments]))
labeller.release()  # 释放模型

猜你喜欢

转载自blog.csdn.net/stevenkwong/article/details/73624316