python命名实体识别工具包 结巴_分词、词性标注、命名实体识别、句法分析?三行Python代码调用斯坦福自然语言处理工具~...

工具简介

对文本进行处理或分析时,我们往往会对其进行分词、词性标注等。目前开源可用的工具有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_client​github.com

欢迎大家提供使用反馈及意见,当然也欢迎手动Star以支持本项目维护~谢谢!

你可能感兴趣的:(python命名实体识别工具包,结巴)