最近做项目用到了哈工大的LTP,假期期间一直在自己笔记本电脑上开发,用的是最新的LTP4。因为自己的电脑环境是CUDA 10,并且安装的是PyTorch 1.6,所以没遇到什么问题。在迁移到服务器环境的时候,发现LTP4要求PyTorch版本>=1.2.0,于是不得不降级LTP版本。记录一下在Ubuntu服务器安装LTP 3.4.0,以及python调用的过程。

LTP 4

LTP 4.0的安装就很方便,执行如下语句即可安装

1
pip install ltp

快速使用

1
2
3
4
5
6
7
8
9
from ltp import LTP
ltp = LTP() # 默认加载 Small 模型
# ltp = LTP(path = "small|tiny|base")
segment, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
pos = ltp.pos(hidden)
ner = ltp.ner(hidden)
srl = ltp.srl(hidden)
dep = ltp.dep(hidden)
sdp = ltp.sdp(hidden)

LTP 3.4.0

pyltp安装

LTP 3.4.0对应的Python包为pyltp,在服务器上直接pip install pyltp之后会在某一步停住,所以采用官网文档提供的从源码安装。

1
2
3
4
5
git clone https://github.com/HIT-SCIR/pyltp
cd pyltp
git submodule init
git submodule update
python setup.py install

执行上述步骤之后,可以看到已经安装好了pyltp 0.4.0版本。

模型下载

点击此处可以下载对应的版本,这里下载的是ltp_data_v3.4.0.zip,在服务器上建个文件夹解压到里面即可。

LTP下载界面

Python调用

由于网上大部分的使用说明都是对应pyltp 0.2.x版本的,pyltp 0.4.0版本的调用各种分词器的函数读取模型是有些微小的改变。

分句器

1
2
3
from pyltp import SentenceSplitter
sents = SentenceSplitter.split('元芳你怎么看?我就趴窗口上看呗!')
print('分句结果',sents)

LTP模型路径

1
LTP_DATA_DIR = "你的LTP模型解压后的文件夹路径,例如 /home/DUTIR/lishuaichi/ltp_model/"

分词器

1
2
3
4
5
6
7
8
9
10
cws_model_path=os.path.join(LTP_DATA_DIR,'cws.model')
segmentor=Segmentor(cws_model_path)
# 如果这里报错请尝试如下语句:
# segmentor=Segmentor()
# segmentor.load(cws_model_path)
# 以下模块的load同理

words=segmentor.segment('熊高雄你吃饭了吗')
print('分词结果',words)
segmentor.release()

加载自定义词典

1
2
3
4
5
6
7
segmentor=Segmentor(cws_model_path,'lexicon')
'''lexicon文件内容,用tab隔开
熊高雄你 n
'''
words=segmentor.segment('熊高雄你吃饭了吗')
print(words)
segmentor.release()

词性标注

1
2
3
4
5
6
pos_model_path = os.path.join(LTP_DATA_DIR, 'pos.model')
postagger = Postagger(pos_model_path,'lexicon')
words = ['元芳', '你', '怎么', '看']
postags = postagger.postag(words)
print('\t'.join(postags))
postagger.release()

依存句法分析

1
2
3
4
5
6
7
8
par_model_path = os.path.join(LTP_DATA_DIR, 'parser.model')
parser = Parser(par_model_path)

words = ['元芳', '你', '怎么', '看']
postags = ['nh', 'r', 'r', 'v']
arcs = parser.parse(words, postags)
print([arc for arc in arcs])
parser.release()

语义角色标注

1
2
3
4
5
6
7
srl_model_path = os.path.join(LTP_DATA_DIR, 'pisrl.model') 
labeller = SementicRoleLabeller(srl_model_path) #
words = ['元芳', '你', '怎么', '看']
postags = ['nh', 'r', 'r', 'v']
# arcs 使用依存句法分析的结果
roles = labeller.label(words, postags, arcs)
labeller.release()

实体识别

1
2
3
4
5
6
7
8
9
ner_model_path = os.path.join(LTP_DATA_DIR, 'ner.model') 
recognizer = NamedEntityRecognizer(ner_model_path)

words = ['元芳', '你', '怎么', '看']
postags = ['nh', 'r', 'r', 'v']
netags = recognizer.recognize(words, postags)

print('\t'.join(netags))
recognizer.release()