当前位置:   article > 正文

pyltp的安装及使用_ltp(language technology platform)安装

ltp(language technology platform)安装

pyltp简介

LTP(language Technology Platform)是哈工大研发的中文语言处理系统,提供了一整套自底向上的丰富而且高效的中文语言处理模块
(包括词法、句法、语义等6项中文处理核心技术)。而pyltp是用python语言对LTP的封装。

pyltp的安装

  • 安装系统:win10 64位,python 3.6.5
  • 安装pyltp:由于使用pip会出现很多问题,故参考: 毒瘤的博客
    • 下载pyltp-0.2.1-cp36-cp36m-win_amd64.whl文件,百度云,提取码:cgzj
    • 切换到下载文件的目录,执行 pip install pyltp-0.2.1-cp36-cp36m-win_amd64.whl
  • 下载模型

pyltp的使用

注意:pyltp 的所有输入的分析文本和输出的结果的编码均为 UTF-8

1.分句

from pyltp import SentenceSplitter
sents = SentenceSplitter.split('你开学了吗?我还没开学呢。')
output_split_sen = '\n'.join(sents) 
print(output_split_sen)
  • 1
  • 2
  • 3
  • 4
你开学了吗?
我还没开学呢。
  • 1
  • 2

2.分词

import os
from pyltp import Segmentor

# 分词模型的路径
LTP_DATA_DIR = 'E:\\zym_test\\test\\nlp\\pyltp\\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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
['你', '会', '机器', '学习', '中', '的', '随机', '森林', '吗']
你|会|机器|学习|中|的|随机|森林|吗
  • 1
  • 2

由上可以看出,“机器学习”“随机森林”应该是分为一个词比较合适,模型的分词功能有限。因此,pyltp分词支持使用外部字典,外部字典是一个文本文件,每行指定一个词,编码同样为UTF-8编码 。

segmentor_1 = Segmentor()
# 加载模型,第二个参数是外部词典文件路径
segmentor_1.load_with_lexicon(cws_model_path, 'E:\\zym_test\\test\\nlp\\pyltp\\ltp_data_v3.4.0\\ml.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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
['你', '会', '机器学习', '中', '的', '随机森林', '吗']
你|会|机器学习|中|的|随机森林|吗
  • 1
  • 2

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
# 个性化模型使用外部字典
customized_segmentor_1 = CustomizedSegmentor()  # 初始化实例
customized_segmentor_1.load_with_lexicon(cws_model_path, '/path/to/your/customized_model', '/path/to/your/lexicon') # 加载模型
words_3 = customized_segmentor_1.segment('你会机器学习中的随机森林吗')

print('\t'.join(words_3))
customized_segmentor.release()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.词性标注

在这里插入图片描述

from pyltp import Postagger

# 词性标注模型路径,模型名称为`pos.model`
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')  
postagger = Postagger() # 初始化实例
postagger.load(pos_model_path)  # 加载模型
# 分词结果
# words -> ['你', '会', '机器', '学习', '中', '的', '随机', '森林', '吗']
# words_1 -> ['你', '会', '机器学习', '中', '的', '随机森林', '吗']
postags = postagger.postag(words) 
postags_1 = postagger.postag(words_1)  # 词性标注

print( '\t'.join(postags))
print( '\t'.join(postags_1))
postagger.release()  # 释放模型
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
r	v	n	v	nd	u	b	n	u
r	v	v	nd	u	i	u
  • 1
  • 2

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

postagger_1 = Postagger() # 初始化实例
postagger_1.load_with_lexicon(pos_model_path, 'E:\\zym_test\\test\\nlp\\pyltp\\ltp_data_v3.4.0\\ml_1.txt')  # 加载模型
# 标注结果
postags_2 = postagger_1.postag(words_1)  # 词性标注

print(list(postags_2))
print('\t'.join(postags_2))
postagger.release()  # 释放模型
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
['r', 'v', 'n', 'nd', 'u', 'n', 'u']
r	v	n	nd	u	n	u
  • 1
  • 2

4.命名实体识别

在这里插入图片描述
B、I、E、S位置标签和实体类型标签之间用一个横线 - 相连;O标签后没有类型标签。

from pyltp import NamedEntityRecognizer

# 命名实体识别模型路径,模型名称为`pos.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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
S-Nh	O	O	B-Ns
  • 1

5.依存句法分析

在这里插入图片描述

from pyltp import Parse

# 依存句法分析模型路径,模型名称为`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() 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
2:SBV	0:HED	2:CMP	3:POB
  • 1

其中,words_4和 postags_4 分别为分词和词性标注的结果。同样支持Python原生的list类型。
arc.head 表示依存弧的父节点词的索引。ROOT节点的索引是0,第一个词开始的索引依次为1、2、3…。
arc.relation 表示依存弧的关系。
那么,2:SBV就表示当前词“奥巴马”和第二个词也就是“住”是主谓关系。

6.语义角色标注

在这里插入图片描述
注意:对windows系统此处模型加载必须为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()  # 释放模型
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
1 A0:(0,0)A1:(2,3)
2 A0:(0,0)A1:(3,3)
  • 1
  • 2

第一个词开始的索引依次为0、1、2…
返回结果 roles 是关于多个谓词的语义角色分析的结果。由于一句话中可能不含有语义角色,所以结果可能为空。
role.index 代表谓词的索引。
role.arguments 代表关于该谓词的若干语义角色。
arg.name 表示语义角色类型。
arg.range.start 表示该语义角色起始词位置的索引。
arg.range.end 表示该语义角色结束词位置的索引。

本文参考了LTP官方文档以及毒瘤博客中的安装教程

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/173767
推荐阅读
相关标签
  

闽ICP备14008679号