LTP使用指南
(2017-03-09 15:17:16)分类: 实用技能 |
LTP使用指南
一、LTP简介
LTP提供了一系列中文自然语言处理工具,用户可以使用这些工具对于中文文本进行分句、分词、词性标注、命名实体识别、句法分析、语义依存分析等等工作。从应用角度来看,LTP为用户提供了下列组件:
1、针对单一自然语言处理任务,生成统计机器学习模型的工具
2、针对单一自然语言处理任务,调用模型进行分析的编程接口
3、使用流水线方式将各个分析工具结合起来,形成一套统一的中文自然语言处理系统
4、系统可调用的,用于中文语言处理的模型文件
5、针对单一自然语言处理任务,基于云端的编程接口
二、LTP的下载和安装【建议在Linux系统下使用,以下只介绍Linux系统的下载和使用,Windows配置比较麻烦,等我成功了再更新】
要使用LTP,首先得下载两个文件:
l
l
这两个文件我都给大家下载好了,其中的模型文件(ltp_data)放在项目文件夹(ltp-3.3.2)下面,我已经上传到百度云网盘,大家需要的可以找我拷或者到云盘下载:
链接: https://pan.baidu.com/s/1pLlovqj 密码: ihba
下载好文件以后,下面进行编译:
Linux系统下环境编译:
建议使用pip安装cmake
l
安装命令为:~$ sudo apt-get install python-pip
l
在终端执行以下命令:~$ pip install cmake
显示successfully installed cmake则表示安装成功
l
在项目文件夹下面新建一个文件夹build,然后打开这个文件夹,然后在终端执行
~$ cmake ..
l
编译成功后,会在 bin 目录下生成一些二进制程序,至于这些程序是啥不用管了,如果你非要知道是些啥,请上http://ltp.readthedocs.io/zh_CN/latest/install.html自己查看。
三、LTP的使用
完成第二步以后,就代表ltp已经完全安装完成啦!下面就是使用了,你会感到非常神奇的是不管是分句/分词/词性标注/句法分析/语义依存分析统统只要一行代码就可以完成!!!
在我们前面下载好的模型文件中一共有这么几个文件,看文件名就知道它们分别是用来做什么的了!!!
模型名 |
说明 |
cws.model |
分词模型,单文件 |
pos.model |
词性标注模型,单文件 |
ner.model |
命名实体识别模型,单文件 |
parser.model |
依存句法分析模型,单文件 |
srl_data/ |
语义角色标注模型,多文件 |
在项目文件根目录下的./bin/examples/里面还有这样一些文件:xxx_cmdline,我们来看看都是些啥
u
u
u
u
这些都是你在使用ltp过程中需要用到的东西!前缀和上面的模型一致!
下面正式进入命令的使用!!!!不要感到惊讶哟,睁大你们的眼睛!
假设你现在拥有的是一个生语料文本,文件名称为input(如果你的文本有后缀的话请加上后缀,比如input.txt),那么就从分词开始!你只需要在终端输入一下命令,其中output是你的输出文件:
v
~$ cat input | ./bin/cws_cmdline --segmentor-model ./ltp_data/cws.model > output
v
~$ cat input | ./bin/cws_cmdline --segmentor-model ./ltp_data/cws.model | ./bin/pos_cmdline --postagger-model ./ltp_data/pos.model > output
v
~$ cat input | ./bin/cws_cmdline --segmentor-model ./ltp_data/cws.model | ./bin/pos_cmdline --postagger-model ./ltp_data/pos.model | ./bin/par_cmdline --parser-model ./ltp_data/pos.model > output
在终端执行以上命令的时候会出现
TRACE: Model is loaded
TRACE: Running 1 thread(s)
WARN: Cann't open file! use stdin instead.
不用管这些,其实你的程序正在运行,是OK的!!!
为了防止用户输入太长的句子影响稳定性,ltp限制用户输入字数少于1024字,分词结果少于256词。所以针对DCC的语料,建议先分句。
四、Python调用ltp
要想在Python中调用ltp,首先你要安装一个pyltp包,那么从哪儿下载和安装呢?很简单!!!直接在终端输入命令:
~$pip install pyltp
是不是so easy?!!!(目前pyltp只支持Python2环境,因此在Python中调用的时候请用Python2执行程序!)
安装好了pyltp,你就可以用Python来调用ltp啦!(不过我觉得处理本地文件的时候,在python中调用没有在终端直接执行效率高哟)
【分句】(其中文字部分可以换成变量名哟,这个不用我解释吧)
# -*- coding: utf-8 -*-
from pyltp import SentenceSplitter
sents =
SentenceSplitter.split('元芳你怎么看?我就趴窗口上看呗!')
print '\n'.join(sents)
这个的输出结果就可以将一段文本变成一行一句的文本啦!至于原理是什么,应该是按照标点符号来分的,嗯!
【分词cws.model】
# -*- coding: utf-8 -*-
from pyltp import Segmentor
segmentor =
Segmentor()
segmentor.load('这个地方填你模型的绝对路径')
words =
segmentor.segment('元芳你怎么看')
print '\t'.join(words)
segmentor.release()
【使用外部词典分词cws.model】(分词外部词典本身是一个文本文件(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()
【词性标注pos.model】(参数 words 是分词模块的返回值,也可以是Python原生的列表类型)
# -*- coding: utf-8 -*-
from pyltp import Postagger
postagger = Postagger() # 初始化实例
postagger.load('这个地方填你模型的绝对路径')
postags =
postagger.postag(words)
print '\t'.join(postags)
postagger.release()
词性标注集请参考http://ltp.readthedocs.io/zh_CN/latest/appendix.html#id3,同样也支持外部词典
【命名实体识别ner.model】(人名/地名/机构名)
# -*- coding: utf-8 -*-
from pyltp import NamedEntityRecognizer
recognizer = NamedEntityRecognizer() # 初始化实例
recognizer.load('这个地方填你模型的绝对路径')
netags =
recognizer.recognize(words, postags)
print '\t'.join(netags)
recognizer.release()
其中,words 和 postags 分别为分词和词性标注的结果
标记集请查看http://ltp.readthedocs.io/zh_CN/latest/appendix.html#id4
【句法分析parser.model】
# -*- coding: utf-8 -*-
from pyltp import Parser
parser = Parser() # 初始化实例
parser.load('这个地方填你模型的绝对路径')
arcs =
parser.parse(words, postags)
print "\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs)
parser.release()
其中,words 和 postags 分别为分词和词性标注的结果。
arc.head 表示依存弧的父节点词的索引,arc.relation 表示依存弧的关系。
标记集请看http://ltp.readthedocs.io/zh_CN/latest/appendix.html#id5
【语义角色标注】
# -*- coding: utf-8 -*-
from pyltp import SementicRoleLabeller
labeller = SementicRoleLabeller() # 初始化实例
labeller.load('这个地方填你模型的绝对路径/dir')
roles =
labeller.label(words, postags, netags, arcs)
for role in roles:
labeller.release()
arg.name 表示语义角色关系,arg.range.start 表示起始词位置,arg.range.end 表示结束位置。
标记集请看http://ltp.readthedocs.io/zh_CN/latest/appendix.html#id6