Yizhong's Blog

在Python中使用Stanford CoreNLP进行数据预处理

Stanford CoreNLP工具包

Stanford CoreNLP是自然语言处理领域非常重要并且好用的工具包, 它集成了tokenization, lemmatization, pos tagging, parsing等基础工具,也包括情感分析、命名实体识别等高级功能。而且,在某些任务上,该工具包包含对于中文在内的多种语言,因此在很多文章中都可以看到使用该工具来进行文本的预处理。

Stanford NLP group为该工具编写了很完善的使用文档,因此本文将不着重于介绍它的功能,而重点说明如何在Python中调用该工具包。实际上,Stanford Corenlp提供了jar包,在下载之后可以直接通过命令行的方式运行,但这一方式很慢,在处理多个文件时,对于每一个文件程序都会花费大量的时间来重新加载模型,所以,我们希望模型只需要加载一次,这里我们要用到的就是它的Server模式

使用Server模式

首先,在官网下载该工具包。解压后,cd进入目录。通过如下命令,运行该工具包的Server模式:

1
java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000

之后,程序会监听指定端口(9000),对于我们post到该端口的请求进行处理。运行截图如下:

Stanford CoreNLP Running

在Python中发送请求

在Python中可以直接使用requests对相应端口进行post请求,请求的方式如下图所示:

Post Request

需要注意的是,需要的annotator和返回的格式需要在url中指定,post的数据只包含原始文本。CoreNLP所支持的所有annotator可见官方的介绍

除了直接请求外,多个Python工具包封装了对Stanford CoreNLP的请求,我采用的是pycorenlp,它的使用方式非常简单,可以直接通过pip安装:

1
pip install pycorenlp

使用时,先import该python包:

1
2
>>> from pycorenlp import StanfordCoreNLP
>>> nlp = StanfordCoreNLP('http://localhost:9000')

之后,对文本进行处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> text = (
'Pusheen and Smitha walked along the beach. '
'Pusheen wanted to surf, but fell off the surfboard.')
>>> output = nlp.annotate(text, properties={
'annotators': 'tokenize,ssplit,pos,depparse,parse',
'outputFormat': 'json'
})
>>> print(output['sentences'][0]['parse'])
(ROOT
(S
(NP (NNP Pusheen)
(CC and)
(NNP Smitha))
(VP (VBD walked)
(PP (IN along)
(NP (DT the) (NN beach))))
(. .)))

当然,也可以指定更复杂的annotator,这里不一一说明。对于多语言,Stanford CoreNLP支持的annotator如下表所示:

multilingual support

script>