本文参考链接 https://www.jianshu.com/p/f78453f5d1ca
1.LTP介绍
语言技术平台(LTP) 提供包括中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等丰富、 高效、精准的自然语言处理技术。经过 哈工大社会计算与信息检索研究中心 11 年的持续研发和推广,LTP 已经成为国内外最具影响力的中文处理基础平台
LTP提供了一系列中文自然语言处理工具,用户可以使用这些工具对于中文文本进行分词、词性标注、句法分析等等工作。从应用角度来看,LTP为用户提供了下列组件:
- 针对单一自然语言处理任务,生成统计机器学习模型的工具
- 针对单一自然语言处理任务,调用模型进行分析的编程接口
- 使用流水线方式将各个分析工具结合起来,形成一套统一的中文自然语言处理系统
- 系统可调用的,用于中文语言处理的模型文件
- 针对单一自然语言处理任务,基于云端的编程接口
官网:http://ltp.ai/
2.pyltp简介
pyltp 是 LTP 的 Python 封装,提供了分词,词性标注,命名实体识别,依存句法分析,语义角色标注的功能。
github网址:https://github.com/HIT-SCIR/pyltp
在线文档:https://pyltp.readthedocs.io/zh_CN/latest/api.html
3.pyltp的安装
首先确保自己使用的python版本
pylpt支持的python版本如下:
我这里使用的是python3.6版本
然后安装pylpt
step1:下载pyltp-0.2.1-cp36-cp36m-win_amd64.whl文件,百度云,提取码:1gki
step2:切换到下载文件的目录,执行 pip install pyltp-0.2.1-cp36-cp36m-win_amd64.whl
然后下载模型文件:
百度云提取码:7qk2,当前模型版本 - 3.4.0
4.基本组件使用
4.1.分句
from pyltp import SentenceSplitter
sents = SentenceSplitter.split('元芳你怎么看?我就趴窗口上看呗!') # 分句
print('\n'.join(sents))
代码运行结果:
元芳你怎么看?
我就趴窗口上看呗!
4.2.分词
import os
from pyltp import Segmentor
LTP_DATA_DIR='D:\LTP\ltp_data_v3.4.0'
cws_model_path=os.path.join(LTP_DATA_DIR,'cws.model')
segmentor=Segmentor()
segmentor.load(cws_model_path)
words=segmentor.segment('熊高雄你吃饭了吗')
print(type(words))
print('\t'.join(words))
segmentor.release()
代码运行结果:
<class 'pyltp.VectorOfString'>
熊高雄 你 吃饭 了 吗
4.3.使用自定义字典
import os
from pyltp import Segmentor
# ltp模型目录的路径
LTP_DATA_DIR='D:\LTP\ltp_data_v3.4.0'
# 分词模型路径,模型名称为`cws.model`
cws_model_path=os.path.join(LTP_DATA_DIR,'cws.model')
segmentor=Segmentor() #初始化实例
# 加载模型 第二个参数是您的外部词典文件路径
segmentor.load_with_lexicon(cws_model_path,'lexicon')
words=segmentor.segment('亚硝酸盐是一种化学物质')
print('\t'.join(words))
segmentor.release()
代码运行结果:
[INFO] 2020-03-01 17:42:09 loaded 2 lexicon entries
亚硝酸盐 是 一 种 化学 物质
4.4.词性标注
词性标注的目标是用一个单独的标签标记每一个词,该标签表示了用法和其句法作用,比如名词、动词、形容词等。
在自然语言分析中,机器需要模拟理解语言。为了实现这一点,它必须在一定程度上能够了解自然语言的规则。它首先需要理解的是词,特别是每一个词的性质。它是一个名词还是一个形容词?如果它是一个动词的屈折形式,那么它的不定形式是什么,以及该屈折形式使用了什么对应的时态、人称和数?这个任务被称为词性标注(Part-of-Speech (PoS) tagging)
词性标注的正确与否将会直接影响到后续的句法分析、语义分析,是中文信息处理的基础性课题之一。常用的词性标注模型有 N 元模型、隐马尔科夫模型、最大熵模型、基于决策树的模型等。其中,隐马尔科夫模型是应用较广泛且效果较好的模型之一。
import os
from pyltp import Postagger
# ltp模型目录的路径
LTP_DATA_DIR='D:\LTP\ltp_data_v3.4.0'
# 词性标注模型路径,模型名称'pos.model'
pos_model_path=os.path.join(LTP_DATA_DIR,'pos.model')
postagger=Postagger() #初始化实例
# 加载模型
postagger.load(pos_model_path)
words=['元芳','你','怎么','看'] #分词结果
postags=postagger.postag(words); #词性标注
print('\t'.join(postags))
postagger.release() #释放模型
代码运行结果:
nh r r v
4.5.命名实体识别
参考 命名实体识别
命名实体识别(Named Entity Recognition,简称NER),又称作“专名识别”,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。简单的讲,就是识别自然文本中的实体指称的边界和类别。
常见方法:
早期的命名实体识别方法基本都是基于规则的。之后由于基于大规模的语料库的统计方法在自然语言处理各个方面取得不错的效果之后,一大批机器学习的方法也出现在命名实体类识别任务。宗成庆老师在统计自然语言处理一书粗略的将这些基于机器学习的命名实体识别方法划分为以下几类:
有监督的学习方法:这一类方法需要利用大规模的已标注语料对模型进行参数训练。目前常用的模型或方法包括隐马尔可夫模型、语言模型、最大熵模型、支持向量机、决策树和条件随机场等。值得一提的是,基于条件随机场的方法是命名实体识别中最成功的方法。
半监督的学习方法:这一类方法利用标注的小数据集(种子数据)自举学习。
无监督的学习方法:这一类方法利用词汇资源(如 WordNet)等进行上下文聚类。
混合方法:几种模型相结合或利用统计方法和人工总结的知识库。
值得一提的是,由于深度学习在自然语言的广泛应用,基于深度学习的命名实体识别方法也展现出不错的效果,此类方法基本还是把命名实体识别当做序列标注任务来做,比较经典的方法是 LSTM+CRF、BiLSTM+CRF。
LTP 采用 BIESO 标注体系。B 表示实体开始词,I表示实体中间词,E表示实体结束词,S表示单独成实体,O表示不构成命名实体。
LTP 提供的命名实体类型为:人名(Nh)、地名(Ns)、机构名(Ni)。
B、I、E、S位置标签和实体类型标签之间用一个横线 - 相连;O标签后没有类型标签。
import os
from pyltp import NamedEntityRecognizer
# ltp模型目录的路径
LTP_DATA_DIR='D:\LTP\ltp_data_v3.4.0'
# 命名实体识别模型路径,模型名称'ner.model'
ner_model_path=os.path.join(LTP_DATA_DIR,'ner.model')
recognizer=NamedEntityRecognizer() #初始化实例
# 加载模型
recognizer.load(ner_model_path)
words=['元芳','你','怎么','看'] #分词结果
postags=['nh','r','r','v'] #词性标注结果
netags=recognizer.recognize(words,postags) #命名实体识别
print('\t'.join(netags))
recognizer.release() #释放模型
代码运行结果
S-Nh O O O
4.6.依存句法分析
import os
from pyltp import Parser
# ltp模型目录的路径
LTP_DATA_DIR='D:\LTP\ltp_data_v3.4.0'
# 依存句法分析模型路径,模型名称'parser.model'
par_model_path=os.path.join(LTP_DATA_DIR,'parser.model')
parser=Parser() #初始化实例
# 加载模型
parser.load(par_model_path)
words=['元芳','你','怎么','看'] #分词结果
postags=['nh','r','r','v'] #词性标注结果
arcs=parser.parse(words,postags) #句法分析
print("\t".join("%d:%s" % (arc.head,arc.relation)for arc in arcs))
parser.release() #释放模型
代码运行结果:
4:SBV 4:SBV 4:ADV 0:HED
4.7.语义角色标注
语义角色标注
语义角色标注(Semantic Role Labeling,简称 SRL)是一种浅层的语义分析。
给定一个句子, SRL 的任务是找出句子中谓词的相应语义角色成分,包括核心语义角色(如施事者、受事者等) 和附属语义角色(如地点、时间、方式、原因等)。根据谓词类别的不同,又可以将现有的 SRL 分为动词性谓词 SRL 和名词性谓词 SRL。
import os
from pyltp import SementicRoleLabeller
from pyltp import Parser
# ltp模型目录的路径
LTP_DATA_DIR='D:\LTP\ltp_data_v3.4.0'
# 依存句法分析模型路径,模型名称'parser.model'
par_model_path=os.path.join(LTP_DATA_DIR,'parser.model')
# 语义角色标注模型路径,模型名称'pisrl_win.model'
srl_model_path=os.path.join(LTP_DATA_DIR,'pisrl_win.model')
#初始化实例
parser=Parser()
labeller=SementicRoleLabeller()
#加载模型
parser.load(par_model_path)
labeller.load(srl_model_path)
words=['元芳','你','怎么','看']
postags=['nh','r','r','v']
#句法分析
arcs=parser.parse(words,postags)
#arcs使用依存句法的结果
roles=labeller.label(words,postags,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() #释放模
代码运行结果
[dynet] random seed: 2834750376
[dynet] allocating memory: 2000MB
[dynet] memory allocation done.
3 A0:(1,1) ADV:(2,2)
来源:CSDN
作者:单线程的Daniel
链接:https://blog.csdn.net/weixin_42684418/article/details/104596214