Python下的自然语言处理利器-LTP语言技术平台 pyltp 学习手札
1 什么是pyltp
语言技术平台(LTP) 是由 哈工大社会计算与信息检索研究中心 11
年的持续研发而形成的一个自然语言处理工具库,其提供包括中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等丰富、
高效、精准的自然语言处理技术。LTP制定了基于XML的语言处理结果表示,并在此基础上提供了一整套自底向上的丰富而且高效的中文语言处理模块(包括词法、句法、语义等6项中文处理核心技术),以及基于动态链接库(Dynamic
Link Library, DLL)的应用程序接口,可视化工具,并且能够以网络服务(Web Service)的形式进行使用。
默认上来说,ltp平台是基于C++的,但是大家也都知道我是不用C++的,所以我看到了其python的版本,pyltp,于是拿来写了个手札。
我目前主要用到的部分可能还是以中文分词为主,其他后续加上(PS:因为我觉得之前那个不太喜欢)。
NLPIR 汉语分词系统 (PyNLPIR) 学习手札
好了废话不多说,一步一步来,让我们先从安装开始。
这次我首次安装pyltp的平台是windows 10(我的环境osx or windows10 or Ubuntu,一般nlp相关的都是osx或win上,平台相关的都是Ubuntu) + python2.7
1 pyltp 安装
1、使用Pip进行安装
关于Pip,已经不用重复太多了,快速简单,我也一直用,这里也一样。
$ pip install pyltp
这里说一下我遇到的问题,缺少Visual C++ 9.0:
Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat). Get it from http://aka.ms/vcpython27
解决方式(2选1):
1、安装一个Visual Studio 2008 只能是这个版本,网上说12,我的15都不行
2、安装一个Micorsoft Visual C++ Compiler for Python 2.7,或者这个链接直接下载,但是可能会失效 安装完成后,重新运行那个安装指令就可以了
2、模型下载
安装完成后,我们需要安装pyltp的模型,从百度云这里下载 ,注意模型版本必须要和pynlp的版本对应
我写文的时候,使用的是3.3.1,注意网盘里面有个zip和tar两种,选择一个你能下载的就可以了
pyltp 版本:0.1.9 LTP 版本:3.3.2 模型版本:3.3.1
3 配置
当我们完成了安装和模型下载后,就需要做一些相关的配置,保证pyltk可以使用到对应的模型
这里所谓的配置,就是在代码中,需要预先load一下
1、将上述的模型压缩包解压到指定的文件夹
2、在使用时,使用类似的方式的加载模型,注意替换自己的模型地址
segmentor.load('/path/to/your/model') # 加载模型
3 pyltk 使用
分句
分句,也就是将一片文本分割为独立的句子,不需要加载模型的哦,我看了一下应该就是按照符号来分割的。
# -*- coding: utf-8 -*-
from pyltp import SentenceSplitter
#分句,也就是将一片文本分割为独立的句子
def sentence_splitter(sentence='你好,你觉得这个例子从哪里来的?当然还是直接复制官方文档,然后改了下这里得到的。'):sents = SentenceSplitter.split(sentence) # 分句print '\n'.join(sents)#测试分句子
sentence_splitter()
运行结果
分词
关于分词是什么,就不用多说了,直接看。
注意分词的模型默认是:cws.model
# -*- coding: utf-8 -*-
from pyltp import Segmentor
#分词
def segmentor(sentence='你好,你觉得这个例子从哪里来的?当然还是直接复制官方文档,然后改了下这里得到的。我的微博是MebiuW,转载请注明来自MebiuW!'):segmentor = Segmentor() # 初始化实例segmentor.load('C:\\Users\\72770\\Documents\\Chatbot\\ltp-data-v3.3.1\\ltp_data\\cws.model') # 加载模型words = segmentor.segment(sentence) # 分词#默认可以这样输出# print '\t'.join(words)# 可以转换成List 输出words_list = list(words)for word in words_list:print wordsegmentor.release() # 释放模型return words_list
#测试分词
segmentor()
运行结果
分词-高级
注意此部分,我是直接复制了官方文档
以下代码中的XX模型,请自定替换为模型的地址!!!
pyltp 分词支持用户使用自定义词典。分词外部词典本身是一个文本文件(plain text),每行指定一个词,编码同样须为 UTF-8,样例如下所示
苯并芘
亚硝酸盐
示例如下
# -*- coding: utf-8 -*-
from pyltp import Segmentor
segmentor = Segmentor() # 初始化实例
segmentor.load_with_lexicon('模型地址, '用户字典') # 加载模型
words = segmentor.segment('亚硝酸盐是一种化学物质')
print '\t'.join(words)
segmentor.release()
使用个性化分词模型
个性化分词是 LTP 的特色功能。个性化分词为了解决测试数据切换到如小说、财经等不同于新闻领域的领域。 在切换到新领域时,用户只需要标注少量数据。 个性化分词会在原有新闻数据基础之上进行增量训练。 从而达到即利用新闻领域的丰富数据,又兼顾目标领域特殊性的目的。
pyltp 支持使用用户训练好的个性化模型。关于个性化模型的训练需使用 LTP,详细介绍和训练方法请参考 个性化分词 。
在 pyltp 中使用个性化分词模型的示例如下
# -*- coding: utf-8 -*-
from pyltp import CustomizedSegmentor
customized_segmentor = CustomizedSegmentor() # 初始化实例
customized_segmentor.load('基本模型', '个性模型') # 加载模型
words = customized_segmentor.segment('亚硝酸盐是一种化学物质')
print '\t'.join(words)
customized_segmentor.release()
同时使用外部字典的话
# -*- coding: utf-8 -*-
from pyltp import CustomizedSegmentor
customized_segmentor = CustomizedSegmentor() # 初始化实例
customized_segmentor.load_with_lexicon('基本模型', '个性模型', '用户字典') # 加载模型
words = customized_segmentor.segment('亚硝酸盐是一种化学物质')
print '\t'.join(words)
customized_segmentor.release()
#词性标注
词性标注也是我们经常遇到的任务,也不多解释了
词性标注需要输入分词后的结果,所以请先参考下之前的按个分词部分,其返回的结果可以作为输入直接标注
# -*- coding: utf-8 -*-
from pyltp import Segmentor
from pyltp import Postagger
#分词
def segmentor(sentence='你好,你觉得这个例子从哪里来的?当然还是直接复制官方文档,然后改了下这里得到的。我的微博是MebiuW,转载请注明来自MebiuW!'):segmentor = Segmentor() # 初始化实例segmentor.load('C:\\Users\\72770\\Documents\\Chatbot\\ltp-data-v3.3.1\\ltp_data\\cws.model') # 加载模型words = segmentor.segment(sentence) # 分词#默认可以这样输出# print '\t'.join(words)# 可以转换成List 输出words_list = list(words)segmentor.release() # 释放模型return words_listdef posttagger(words=segmentor()):postagger = Postagger() # 初始化实例postagger.load('C:\\Users\\72770\\Documents\\Chatbot\\ltp-data-v3.3.1\\ltp_data\\pos.model') # 加载模型postags = postagger.postag(words) # 词性标注for word,tag in zip(words,postags):print word+'/'+tagpostagger.release() # 释放模型
#测试标注
posttagger()
运行结果: 前面是词语,后面是词性,词性的表述请参照这里
命名实体识别
命名实体识别,主要是hi识别一些人名,地名,机构名等。
需要前面分词和词性标注作为输入
#注意,从这里开始,因为牵扯到的代码比较多,所以不是完成的代码,只是片段,要保证正常运行,请参照最后的完整代码附录
# -*- coding: utf-8 -*-
from pyltp import NamedEntityRecognizer
def ner(words, postags):recognizer = NamedEntityRecognizer() # 初始化实例recognizer.load('C:\\Users\\72770\\Documents\\Chatbot\\ltp-data-v3.3.1\\ltp_data\\ner.model') # 加载模型netags = recognizer.recognize(words, postags) # 命名实体识别for word, ntag in zip(words, netags):print word + '/' + ntagrecognizer.release() # 释放模型return netags#测试分句子
#sentence_splitter()
#测试分词
words = segmentor('我家在昆明,我现在在北京上学。中秋节你是否会想到李白?')
#测试标注
tags = posttagger(words)
#命名实体识别
ner(words,tags)
运行结果
命名实体的参照标记,也是请看这里
依存句法分析
依存句法依旧需要之前的两个输入,words 和 postags 分别为分词和词性标注的结果。
arc.head 表示依存弧的父节点词的索引,arc.relation 表示依存弧的关系。其具体的表述看这里
# -*- coding: utf-8 -*-
from pyltp import Parser
def parse(words, postags):parser = Parser() # 初始化实例parser.load('C:\\Users\\72770\\Documents\\Chatbot\\ltp-data-v3.3.1\\ltp_data\\parser.model') # 加载模型arcs = parser.parse(words, postags) # 句法分析print "\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs)parser.release() # 释放模型#测试分句子
#sentence_splitter()
#测试分词
words = segmentor('我家在昆明,我现在在北京上学。中秋节你是否会想到李白?还有,微博是MebiuW')
#测试标注
tags = posttagger(words)
#依存句法识别
parse(words,tags)
运行结果
语义角色标注
arg.name 表示语义角色关系,arg.range.start 表示起始词位置,arg.range.end 表示结束位置。
# -*- coding: utf-8 -*-
from pyltp import SementicRoleLabeller
def role_label(words, postags, netags, arcs):labeller = SementicRoleLabeller() # 初始化实例labeller.load('C:\\Users\\72770\\Documents\\Chatbot\\ltp-data-v3.3.1\\ltp_data\\srl') # 加载模型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])labeller.release() # 释放模型
#测试分句子
#sentence_splitter()
#测试分词
words = segmentor('我家在昆明,我现在在北京上学。中秋节你是否会想到李白?还有,微博是MebiuW')
#测试标注
tags = posttagger(words)
#命名实体识别
netags = ner(words,tags)
#依存句法识别
arcs = parse(words,tags)
#j角色标注
roles = role_label(words,tags,netags,arcs)运行结果:
角色对照看这里
结语
有点累,突然写不动了,就先写这些吧,有问题我们评论或者新浪微博@MebiuW 交流
参考
1、Pyltk 官方文档
参考本篇完整代码
可能有些打印有点杂乱,见谅
# -*- coding: utf-8 -*-
#作者:MebiuW
#微博:@MebiuW
#python 版本:2.7
#时间 2016/9/10
from pyltp import SentenceSplitter
from pyltp import Segmentor
from pyltp import Postagger
from pyltp import SementicRoleLabeller
from pyltp import NamedEntityRecognizer
from pyltp import Parser#分词
def segmentor(sentence='你好,你觉得这个例子从哪里来的?当然还是直接复制官方文档,然后改了下这里得到的。我的微博是MebiuW,转载请注明来自MebiuW!'):segmentor = Segmentor() # 初始化实例segmentor.load('C:\\Users\\72770\\Documents\\Chatbot\\ltp-data-v3.3.1\\ltp_data\\cws.model') # 加载模型words = segmentor.segment(sentence) # 分词#默认可以这样输出print '\t'.join(words)# 可以转换成List 输出words_list = list(words)segmentor.release() # 释放模型return words_listdef posttagger(words):postagger = Postagger() # 初始化实例postagger.load('C:\\Users\\72770\\Documents\\Chatbot\\ltp-data-v3.3.1\\ltp_data\\pos.model') # 加载模型postags = postagger.postag(words) # 词性标注for word,tag in zip(words,postags):print word+'/'+tagpostagger.release() # 释放模型return postags#分句,也就是将一片文本分割为独立的句子
def sentence_splitter(sentence='你好,你觉得这个例子从哪里来的?当然还是直接复制官方文档,然后改了下这里得到的。我的微博是MebiuW,转载请注明来自MebiuW!'):sents = SentenceSplitter.split(sentence) # 分句print '\n'.join(sents)#命名实体识别
def ner(words, postags):recognizer = NamedEntityRecognizer() # 初始化实例recognizer.load('C:\\Users\\72770\\Documents\\Chatbot\\ltp-data-v3.3.1\\ltp_data\\ner.model') # 加载模型netags = recognizer.recognize(words, postags) # 命名实体识别for word, ntag in zip(words, netags):print word + '/' + ntagrecognizer.release() # 释放模型return netags#依存语义分析
def parse(words, postags):parser = Parser() # 初始化实例parser.load('C:\\Users\\72770\\Documents\\Chatbot\\ltp-data-v3.3.1\\ltp_data\\parser.model') # 加载模型arcs = parser.parse(words, postags) # 句法分析print "\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs)parser.release() # 释放模型return arcs#角色标注
def role_label(words, postags, netags, arcs):labeller = SementicRoleLabeller() # 初始化实例labeller.load('C:\\Users\\72770\\Documents\\Chatbot\\ltp-data-v3.3.1\\ltp_data\\srl') # 加载模型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])labeller.release() # 释放模型
#测试分句子
print('******************测试将会顺序执行:**********************')
sentence_splitter()
print('###############以上为分句子测试###############')
#测试分词
words = segmentor('我家在昆明,我现在在北京上学。中秋节你是否会想到李白?还有,微博是MebiuW')
print('###############以上为分词测试###############')
#测试标注
tags = posttagger(words)
print('###############以上为词性标注测试###############')
#命名实体识别
netags = ner(words,tags)
print('###############以上为命名实体识别测试###############')
#依存句法识别
arcs = parse(words,tags)
print('###############以上为依存句法测试###############')
#角色标注
roles = role_label(words,tags,netags,arcs)
print('###############以上为角色标注测试###############')
Python下的自然语言处理利器-LTP语言技术平台 pyltp 学习手札相关推荐
- python语音标注平台_Python下的自然语言处理利器-LTP语言技术平台 pyltp 学习手札...
1 什么是pyltp 语言技术平台(LTP) 是由 哈工大社会计算与信息检索研究中心 11 年的持续研发而形成的一个自然语言处理工具库,其提供包括中文分词.词性标注.命名实体识别.依存句法分析.语义角 ...
- ZH奶酪:自然语言处理工具LTP语言云调用方法
前言 LTP语言云平台 不支持离线调用: 支持分词.词性标注.命名实体识别.依存句法分析.语义角色标注: 不支持自定义词表,但是你可以先用其他支持自定义分词的工具(例如中科院的NLPIR)把文本进行分 ...
- 哈工大信息检索研究室 语言技术平台相关技术简介
模块名称:中文文本自动断句模块 哈工大信息检索研究室 语言技术平台相关技术简介 平台总指导:刘挺教授 平台架构及程序实现负责人:郎君 下列模块按平台处理顺序列出 模块名称:中文文本自动断句模块 负责人 ...
- java控制硬件_厨师都开始用Python和Java了,现在C语言还值得我们学习吗?
C语言是否值得我们学习? ? ? ? ? ? 最近几年,大数据.人工智能.机器学习越来越受人关注,甚至达到妇孺皆知的程度.但是精通这方面的人才供不应求,再加上薪资水平相当高,会有很多人想要学习Pyth ...
- 黑客用python还是ruby-Python、Ruby、Go语言哪个更值得学习?
路过,进来答一篇. 先说python, Python的优点是足够简单,语言年龄大,有历史年头了,积累很广的使用人群,库也非常的完善,很多数据库,表格出具,爬虫,算法等你能想到的,python都有库实现 ...
- 计算机科学与技术python方向是什么意思-大学计算机科学与技术相关专业学习路线...
原标题:大学计算机科学与技术相关专业学习路线 不管你是如何选择了这门专业,我想告诉你的是这是一个很深的领域,没有热爱不如尽早转行. 根据百度百科计算机科学与技术专业(以下简称计算机专业)给出的描述,该 ...
- 【ChatBot开发笔记】使用LTP(语言技术平台)进行自然语言处理
目录 准备工作 测试示例 测试代码 1.ltp.py run.py 测试结果及分析 中文分词 词性标注 依存语句分析 命名实体识别 语义角色标注 语义依存 (依存树) 分析 语义依存 (依存图) 分析 ...
- 编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码
JDK:java version "1.8.0_31" Java(TM) SE Runtime Environment (build 1.8.0_31-b13) Java HotS ...
- 用Python生成答题库,辅助完成XX在线平台视频学习的课后考试
文章目录 前言 思路 引入库和全局变量 一.截图 二.选图 三.识图 四.生成答题库 完整代码 最终效果 作者语 前言 随着XX在线视频学习的任务增多,有时刷完视频并不能轻松完成课后考试,本篇文章意在 ...
最新文章
- 用指针查找数组中温度值为32的天数
- 使用php吧excel数据存到数据库,php如何存excel数据到数据库
- Linux中断(interrupt)子系统之三:中断流控处理层
- cognos 样例 oracle,cognos10.2 sample(ORACLE学样例)
- 网络管理常用命令(6/14) -netstat命令详解
- 【SEW-伺服电机-Profinet-io通讯控制——伺服配置】
- 【小憩】流光容易把人抛,红了樱桃,绿了芭蕉
- 制作拨号服务器,如何打造全自动的拨号上网服务器
- 使用python批量解压7z格式压缩包
- 【历史上的今天】3 月 4 日:美团网正式上线;Dropbox 的创始人出生;PS2 游戏机问世
- ⽬标⾏动及稠密环境未知情况下,⽆⼈机跟踪的系统解决⽅案
- 苹果电脑怎么用c语言编程,mac电脑怎么调试c语言
- 猜数字游戏java课程设计报告
- URLDecoder.decode与URLEncoder.encode
- 如何把HTML转换成动图,视频转gif 如何将视频制作gif动画图片
- 基于区块链技术,电子商务平台将提高安全性和透明度
- 韩国小姐选美连连看----android版
- C语言程序的翻译过程
- 为什么你不回我微信了?
- 边沿检测 Verilog