赞
踩
LTP(language Technology Platform)是哈工大研发的中文语言处理系统,提供了一整套自底向上的丰富而且高效的中文语言处理模块
(包括词法、句法、语义等6项中文处理核心技术)。而pyltp是用python语言对LTP的封装。
注意:pyltp 的所有输入的分析文本和输出的结果的编码均为 UTF-8
from pyltp import SentenceSplitter
sents = SentenceSplitter.split('你开学了吗?我还没开学呢。')
output_split_sen = '\n'.join(sents)
print(output_split_sen)
你开学了吗?
我还没开学呢。
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)
['你', '会', '机器', '学习', '中', '的', '随机', '森林', '吗']
你|会|机器|学习|中|的|随机|森林|吗
由上可以看出,“机器学习”“随机森林”应该是分为一个词比较合适,模型的分词功能有限。因此,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()
['你', '会', '机器学习', '中', '的', '随机森林', '吗']
你|会|机器学习|中|的|随机森林|吗
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()
# 个性化模型使用外部字典
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()
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() # 释放模型
r v n v nd u b n u
r v v nd u i u
可以看出,如果添加了新的分词字典,那么当其进行词性标注时,会出现错误,如,将“机器学习”误认为动词,因此词性标注时也可以使用外部词典:词性标注外部词典同样为一个文本文件,每行指定一个词,第一列指定单词,第二列之后指定该词的候选词性(可以有多项,每一项占一列),列与列之间用空格区分。
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() # 释放模型
['r', 'v', 'n', 'nd', 'u', 'n', 'u']
r v n nd u n u
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()
S-Nh O O B-Ns
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()
2:SBV 0:HED 2:CMP 3:POB
其中,words_4和 postags_4 分别为分词和词性标注的结果。同样支持Python原生的list类型。
arc.head 表示依存弧的父节点词的索引。ROOT节点的索引是0,第一个词开始的索引依次为1、2、3…。
arc.relation 表示依存弧的关系。
那么,2:SBV就表示当前词“奥巴马”和第二个词也就是“住”是主谓关系。
注意:对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 A0:(0,0)A1:(2,3)
2 A0:(0,0)A1:(3,3)
第一个词开始的索引依次为0、1、2…
返回结果 roles 是关于多个谓词的语义角色分析的结果。由于一句话中可能不含有语义角色,所以结果可能为空。
role.index 代表谓词的索引。
role.arguments 代表关于该谓词的若干语义角色。
arg.name 表示语义角色类型。
arg.range.start 表示该语义角色起始词位置的索引。
arg.range.end 表示该语义角色结束词位置的索引。
本文参考了LTP官方文档以及毒瘤博客中的安装教程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。