本文介绍 Christopher Manning 所在的斯坦福 NLP 组开源了 Python 版的工具包——Stanza,让 Python 生态系统又增添了一员 NLP 大将。

我们都知道斯坦福 NLP 组的开源工具——这是一个包含了各种 NLP 工具的代码库。近日,他们公开了 Python 版本的工具,名为 Stanza。该库有 60 多种语言的模型,可进行命名实体识别等 NLP 任务。一经开源,便引起了社区的热议。李飞飞就在推特上点赞了这个项目。



斯坦福nlp课程 斯坦福nlp工具包_斯坦福nlp课程


目前,该项目可直接从 pip 进行安装。 项目地址:https://github.com/stanfordnlp/stanza

现有模型和支持的 NLP 任务

Stanza 包含了 60 多种语言模型,在 Universal Dependencies v2.5 数据集上进行了预训练。这些模型包括简体、繁体、古文中文,英语、法语、西班牙语、德语、日语、韩语、阿拉伯语等,甚至还有北萨米语等不太常见的语言。 除了语言模型外,Stanza 还支持了数十种语言的命名实体识别模型。完整列表如下:

斯坦福nlp课程 斯坦福nlp工具包_模型训练 python_02


据 Stanza 的论文介绍,Stanza 涵盖了多个自然语言处理任务,如分词、词性标注、依存句法分析、命名实体识别等。此外,它还提供了 Pyhton 界面,用来和我们熟悉的 Stanford CoreNLP 库进行交互,从而扩展了已有的功能。 另外值得注意的是,Stanza 是完全基于神经网络 pipeline 的。研究者在 112 个数据集上进行了预训练,但使用的是同一个模型架构。他们发现,同样一个神经网络架构可以泛化得很好。网络在所有语言上的性能都很好。整个神经网络 pipeline 都是通过 PyTorch 实现的。 运行 Stanza

神经网络 pipeline 入门

要运行首个 Stanza pipeline,只需要在 python 解释器 z 中进行操作:

>>> import stanza>>> stanza.download('en') # This downloads the English models for the neural pipeline# IMPORTANT: The above line prompts you before downloading, which doesn't work well in a Jupyter notebook.# To avoid a prompt when using notebooks, instead use: >>> stanza.download('en', force=True)>>> nlp = stanza.Pipeline() # This sets up a default neural pipeline in English>>> doc = nlp("Barack Obama was born in Hawaii. He was elected president in 2008.")>>> doc.sentences[0].print_dependencies()


而最后一条指令将输出当时输入字符串中第一个句子中的词(或是 Stanza 中表示的 Document),以及在该句的 Universal Dependencies parse(其「head」部分)中控制该词的索引,以及词之前的依赖关系。输出如下:

('Barack', '4', 'nsubj:pass')('Obama', '1', 'flat')('was', '4', 'aux:pass')('born', '0', 'root')('in', '6', 'case')('Hawaii', '4', 'obl')('.', '4', 'punct')


入门指南里会有更多详细信息。 访问 Java Stanford Core NLP 软件

除了神经 Pipeline,该软件包还包括一个官方包,用于使用 Python 代码访问 Java Stanford CoreNLP 软件。 初始设置:

  • 下载 Stanford CoreNLP 以及想要使用的语言模型;
  • 将模型放入分配的文件夹中;
  • 通过设置 CORENLP_HOME 环境变量(如在*nix 中):export CORENLP_HOME=/path/to/stanford-corenlp-full-2018-10-05 告诉 Python 代码 Stanford CoreNLP 所在的位置。


文档中会有全面的示例,展示如何通过 Stanza 使用 CoreNLP,并从中获取注释。 训练 Neural Pipeline 模型

当前为所用的 Universal Dependencies 库 V2.5 提供模型,并为几种广泛使用的语言提供 NER 模型。 批量处理最大化 Pipeline 速度

为了最大程度地提供速度方面的性能,必须针对成批的文档运行 Pipeline。每一次单在一个句子上运行一个 for 循环将 fei'c 非常慢,目前解决方法是将文档连在一起,每个文档见用空行(及两个换行符\n\n)进行分割。分词器将在句子中断时去识别空白行。 训练自己的 neural pipelines

该库中所有神经模块都可以使用自己的数据进行训练。如 Tokenizer、multi-word token(MWT)扩展器、POS/特征标记器等。目前,不支持通过 pipeline 进行模型训练,因此需要克隆 git 存储库并从源代码中运行训练。 以下为训练神经 pipeline 的示例,可以看到项目中提供了各种 bash 脚本来简化 scripts 目录中的训练过程。训练模型运行以下指令:

bash scripts/run_${module}.sh ${corpus} ${other_args}


其中 ${module} 是 tokenize, mwt, pos, lemma,depparse 之一,是主体的全名; ${corpus} 是训练脚本所允许的其他参数。 例如,可以使用以下指令在 UD_English-EWT 语料库上训练时批量处理大小为 32,而终止率为 0.33:

bash scripts/run_tokenize.sh UD_English-EWT --batch_size 32 --dropout 0.33


注意对于 dependency parser, 还需要在训练/开发数据中为使用的 POS 标签类型指定 gold|predicted:

bash scripts/run_depparse.sh UD_English-EWT gold


如果使用了 predicted,训练后的标记器模型会首先在训练/开发数据上运行以便生成预测的标记。  默认情况下,模型文件将在训练期间保存到 save_models 目录(也可以使用 save_dir 参数进行更改)。 架构和与现有库的对比


斯坦福nlp课程 斯坦福nlp工具包_斯坦福nlp课程_03


Stanza 的论文提供了整个代码库的架构。可以看到,它以原始文本为输入,能够直接输出结构化的结果。

斯坦福nlp课程 斯坦福nlp工具包_Python_04

Stanza 的神经网络部分架构。除了神经网络 pipeline 以外,Stanza 也有一个 Python 客户端界面,和 Java 版的 Stanford CoreNLP 进行交互。

于此同时,论文还将 Stanza 和现有的 NLP 工具,如 spaCy 等进行了对比。可以看到,Stanza 是目前涵盖语言数量最多,达到 SOTA 且完全基于神经网络框架的库。

斯坦福nlp课程 斯坦福nlp工具包_斯坦福nlp课程_05

和现有 NLP 库的对比。

最后,研究者还将 Stanza 上 NLP 任务的性能和现有的基线进行对比,发现 Stanza 大部分情况下都超过了 SOTA。

斯坦福nlp课程 斯坦福nlp工具包_bash_06


和已有基线性能的对比。可以看到,Stanza 在多个语言多个任务中都实现了 SOTA。 参考链接:https://arxiv.org/abs/2003.07082