工具简介
对文本进行处理或分析时,我们往往会对其进行分词、词性标注等。目前开源可用的工具有Jieba、HanLP、ltp等。今天要介绍一款来自斯坦福NLP研究组的高质量的开源自然语言处理工具 Stanford CoreNLP,主要功能有分词、词性标注、命名实体识别、短语结构分析、依存句法分析。
相较于市面上较为流行的自然语言处理工具,Stanford CoreNLP主要有以下优势:训练语料标注质量较高,中英文语料来自著名的宾州树库,因而自动标注的质量也较好,适用于对标注准确率要求较高的领域,如语言学研究等。
一站式服务,该工具集成了自然语言处理的常用功能。
性能高,支持并行(多条句子同时)分析。
但Stanford CoreNLP是用Java编写的,调用较为复杂,因此我将python调用方式进行了封装,并发布了pip包(corenlp-client),方便用户使用。安装方式为:
pip install corenlp_client
快速入门
调用该工具对文本进行分词,只需3行代码:
from corenlp_client import CoreNLP # 导入CoreNLP类
annotator = CoreNLP(url="https://corenlp.run", lang="zh") # 创建标注器对象
print(annotator.tokenize("今天天气不错!我想去故宫博物院。")) # 分词
返回的是一个分词后的句子列表:
[['今天', '天气', '不错', '!'], ['我', '想', '去', '故宫', '博物院', '。']]
如果不想进行分句,可指定ssplit参数为False:
print(annotator.tokenize("今天天气不错!我想去故宫博物院。",ssplit=False))
返回的就是分词列表:
['今天', '天气', '不错', '!', '我', '想', '去', '故宫', '博物院', '。']
词性标注/命名实体识别:
annotator.pos_tag("今天天气不错!我想去故宫博物院。")
annotator.ner("今天天气不错!我想去故宫博物院。")
结果如下(词性标注的格式与分词一致,命名实体每句的元素是一个字典,key为实体和实体的token span构成的元组,方便对应分词后的结果,value为实体类别):
[['NT', 'NN', 'VA', 'PU'], ['PN', 'VV', 'VV', 'NR', 'NN', 'PU']]
[[{('今天', (0, 1)): 'DATE'}], [{('故宫博物院', (3, 5)): 'FACILITY'}]]
本地调用
上文介绍的调用CoreNLP的方式都是调用在线的api,由于网络延迟等原因,返回结果的速度较慢且可能会因网络问题断连。因此,推荐使用本地启动CoreNLP Server后,再进行调用。安装Java
需要注意的是,启动CoreNLP Server前您的电脑必须安装Java 8。Java 8的安装非常简单,可以通过访问官网下载(速度可能会慢一些),或通过我分享的网盘链接下载安装即可。
(安装完成后在可通过命令行中输入java -version确认安装成功)
2. 下载模型
Java安装成功后,分别下载CoreNLP官网提供的压缩包及相应的语言的模型(如果想对中文进行处理则下载中文),然后将中文模型(.jar文件)放入解压后的CoreNLP压缩包中即可。官方的下载源在国外,速度较慢。国内用户可以通过我的网盘链接下载,链接提供的压缩包已包含了中文和英文的模型,无需额外下载。
CoreNLP官网下载地址:Download
3. 启动CoreNLP Server
启动Server的方式有两种,一种是通过命令行方式启动,官网有详细的启动说明(CoreNLP Server),操作方法是打开命令行(windows下的命令提示符或linux/Mac下的Terminal),输入以下命令即可(具体使用说明请参看官方文档)。用该命令启动Server后,可通过上文提到的指定url参数的方式调用本地的api。
java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000
对于入门用户,推荐使用第二种启动方式,即利用我提供的pip包在python中直接启动Server并对语料进行处理,示例的python代码如下。其中,annotators参数指定的是启动Server时要加载什么标注器,常用的有:tokenize(分词),ssplit(分句),pos(词性标注),ner(命名实体识别),parse(成分句法分析),deparse(依存句法分析)。这里加载的是分词、分句。不同的标注器用逗号隔开。不同语言支持的标注器可参看(Using CoreNLP on other human languages)。
from corenlp_client import CoreNLP
corenlp_dir = "/path/to/corenlp" # 这里填写CoreNLP压缩包解压后的路径
with CoreNLP(annotators="tokenize,ssplit,pos", corenlp_dir=corenlp_dir, lang="zh") as annotator:
print(annotator.tokenize("今天天气不错!我想去故宫博物院。")) # 在with语句下缩进代码
如果发现内存或CPU占用过多,可通过关键字参数限制:
# max_mem: 内存占用限制, 默认为4G;threads: 最大线程数, 默认为cpu核心数。
with CoreNLP(annotators="tokenize", corenlp_dir="/path/to/corenlp", local_port=9000, max_mem=4, threads=2) as annotator:
# your code here
进阶使用
以上介绍了使用corenlp_client进行分词、分句、词性标注、命名实体识别及如何本地启动CoreNLP Server。对于进阶用户,corenlp_client还提供了更多的功能,以便用户进一步处理:
# 此处省略导入包及创建annotator对象的代码
anno = annotator.annotate("CoreNLP is your one stop shop for natural language processing in Java! Enjoy yourself! ")
print(anno.tokens) # tokens,包含分词、词性标注、token级别的ner结果
print(anno.parse_tree) # 成分句法分析
print(anno.bi_parse_tree) # 二叉化的成分句法分析
print(anno.basic_dep) # basic依存句法分析
print(anno.enhanced_dep) # enhanced依存句法分析
print(anno.enhanced_pp_dep) # enhanced++依存句法分析
print(anno.entities) # entitymentions
print(anno.openie) # openie
print(anno.ann_result) # CoreNLP Server的原始返回结果
print(annotator.pretty_print_tree(anno.parse_tree[0])) # 将成分句法分析的结果打印为树结构
本项目的github地址为:Jason3900/corenlp_clientgithub.com
欢迎大家提供使用反馈及意见,当然也欢迎手动Star以支持本项目维护~谢谢!