pyltp安装及模型下载

可以使用pip直接安装,如果安装失败,建议下载源码进行手动编译。

pip install pyltp

安装pyltp后,下载模型文件,百度云地址在这。

我下载的是ltp-data-v3.3.1.tar.bz2。然后将下载到的模型解压,存放在任意地方。

注意:版本对应

pyltp版本:0.1.9

LTP版本:3.3.2

模型版本:3.3.1

上面两步都完成后,我们就可以使用pyltp进行一些文本操作了,例如:分句,分词,词性标注,命名实体识别以及依存句法等。

pyltp语言云的使用

分句 - SentenceSplitter
from pyltp import SentenceSplitter
sentence = SentenceSplitter.split('我是逗号,我是句号。我是问号?我是感叹号!')
print '\n'.join(sentence)

分句结果如下:

我是逗号,我是句号。

我是问号?

我是感叹号!

分词 - Segmentor

import os
LTP_DATA_DIR = '/path/to/your/ltp_data' # ltp模型目录的路径
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model') # 分词模型路径,模型名称为`cws.model`
from pyltp import Segmentor
segmentor = Segmentor() # 初始化实例
segmentor.load(cws_model_path) # 加载模型
words = segmentor.segment('欧几里得是西元前三世纪的希腊数学家。') # 分词
print ' '.join(words)
segmentor.release() # 释放模型

分词结果如下,【欧几里得】被拆成了四个单独的字。

欧 几 里 得 是 西元前 三 世纪 的 希腊 数学家 。

pyltp分词支持用户使用自定义词典。分词外部词典本身是一个文本文件,每行指定一个词,编码须为 UTF-8,样例如下所示:

欧几里得

亚里士多德

使用自定义词典进行分词的模型加载方式如下:

segmentor = Segmentor() # 初始化实例
segmentor.load_with_lexicon(cws_model_path, '/path/to/your/lexicon') # 加载模型,参数lexicon是自定义词典的文件路径
words = segmentor.segment('欧几里得是西元前三世纪的希腊数学家。')
print ' '.join(words)
segmentor.release()

自定义词典,分词结果如下,分词效果明显得到改善。

欧几里得 是 西元前 三 世纪 的 希腊 数学家 。

词性标注 - Postagger

pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model') # 词性标注模型路径,模型名称为`pos.model`
from pyltp import Postagger
postagger = Postagger() # 初始化实例
postagger.load(pos_model_path) # 加载模型
words = ['欧几里得', '是', '西元前', '三', '世纪', '的', '希腊', '数学家', '。']
postags = postagger.postag(words) # 词性标注
print ' '.join(postags)
postagger.release() # 释放模型

词性标注结果如下,如果想了解更多的词性含义。请参考语言云词性标注简介。

nh v nt m n u ns n wp
# 欧几里得 - nh - 人名
# 是 - v - 动词
# 西元前 - nt - 时间名词
# 三 - m - 数字
# 世纪 - n - 普通名词
# 的 - u - 助词
# 希腊 - ns - 地理名词
# 数学家- n - 普通名词
# 。 - wp - 标点符号

命名实体识别 - NamedEntityRecognizer

ner_model_path = os.path.join(LTP_DATA_DIR, 'ner.model') # 命名实体识别模型路径,模型名称为`ner.model`
from pyltp import NamedEntityRecognizer
recognizer = NamedEntityRecognizer() # 初始化实例
recognizer.load(ner_model_path) # 加载模型
words = ['欧几里得', '是', '西元前', '三', '世纪', '的', '希腊', '数学家', '。']
postags = ['nh', 'v', 'nt', 'm', 'n', 'u', 'ns', 'n', 'wp']
nertags = recognizer.recognize(words, postags) # 命名实体识别
print ' '.join(nertags)
recognizer.release() # 释放模型

命名实体结果如下,ltp命名实体类型为:人名(Nh),地名(NS),机构名(Ni);ltp采用BIESO标注体系。B表示实体开始词,I表示实体中间词,E表示实体结束词,S表示单独成实体,O表示不构成实体。

S-Nh O O O O O S-Ns O O
# 欧几里得 - S-Nh - 人名
# 希腊 - S-Ns - 地名

依存句法分析 - Parser

par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model') # 依存句法分析模型路径,模型名称为`parser.model`
from pyltp import Parser
parser = Parser() # 初始化实例
parser.load(par_model_path) # 加载模型
words = ['欧几里得', '是', '西元前', '三', '世纪', '的', '希腊', '数学家', '。']
postags = ['nh', 'v', 'nt', 'm', 'n', 'u', 'ns', 'n', 'wp']
arcs = parser.parse(words, postags) # 句法分析
rely_id = [arc.head for arc in arcs] # 提取依存父节点id
relation = [arc.relation for arc in arcs] # 提取依存关系
heads = ['Root' if id == 0 else words[id-1] for id in rely_id] # 匹配依存父节点词语
for i in range(len(words)):
print relation[i] + '(' + words[i] + ', ' + heads[i] + ')'
parser.release() # 释放模型

依存句法分析,输出结果如下,关于依存句法分析,详细参照语言云依存句法简介。

SBV(欧几里得, 是)
HED(是, Root)
ATT(西元前, 世纪)
ATT(三, 世纪)
ATT(世纪, 数学家)
RAD(的, 世纪)
ATT(希腊, 数学家)
VOB(数学家, 是)
WP(。, 是)