Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

机器之心编辑部编译

支持53种语言预训练模型,斯坦福发布全新NLP工具包StanfordNLP

今日,Stanford NLP 团队发布了包含 53 种语言预训练模型的自然语言处理工具包 StanfordNLP,该工具包支持 Python 3.6 及之后版本,并基于 PyTorch,支持多种语言的完整文本分析管道,包括分词、词性标注、词形归并和依存关系解析,此外它还提供了与 CoreNLP 的 Python 接口。

  • Github: https://github.com/stanfordnlp/stanfordnlp

  • Paper: https://nlp.stanford.edu/pubs/qi2018universal.pdf

  • PyPI: https://pypi.org/project/stanfordnlp/

以下内容介绍了 StanfordNLP 的相关论文、安装、使用以及设置方法。

StanfordNLP 结合了斯坦福团队参加 CoNLL 2018 Shared Task on Universal Dependency Parsing 使用的软件包,和 Stanford CoreNLP 软件的官方 Python 接口。StanfordNLP 不仅提供 CoreNLP 的功能,还包含一系列工具,可将文本字符串转换为句子和单词列表,生成单词的基本形式、词性和形态特征,以及适用于 70 余种语言中的句法结构。

StanfordNLP 用高度准确的神经网络构建而成,允许使用自己的标注数据进行高效训练和评估。这些模块基于 PyTorch 构建。

StanfordNLP 的特征:

  • 可以轻松设置本地 Python 实现;

  • 包含进行文本分析的完整神经网络管道(neural network pipeline),包括分词、多词 token(MWT)扩展、词形归并(lemmatization)、词性(POS)和形态特征标记以及依存关系解析;

  • 提供在 73 个 treebanks 上的 53 种人类语言的预训练神经模型;

  • 官方维护的接入到 CoreNLP 的稳定 Python 接口。

论文:Universal Dependency Parsing from Scratch 

论文地址:https://nlp.stanford.edu/pubs/qi2018universal.pdf

依存关系解析是用于语义作用标记的各种自然语言处理系统、关系提取机器翻译中的重要组成部分。然而,大多数研究都已经将依赖解析单独处理,并且在很大程度上忽略了为解析器准备相关数据的上游 NLP 组件,例如标记器和词形化器。然而,实际上,这些上游系统仍然远非完美。

为此,研究者构建了一个 raw-textto-CoNLL-U 管道系统,该系统执行 Shared Task 所需的所有任务。利用深度学习,该管道在每个相互关联的任务阶段中都实现了有竞争力的性能:分词、句子和词分割、词性(POS)/形态特征(UFeats)标记、词形归并,最后是依存关系解析。

研究者表示,该工作的主要贡献包括:

  • 将符号统计知识与灵活、强大的神经系统相结合以提高稳健性的新方法;

  • 用于联合 POS / UFeats 预测的 biaffine 分类器,可提高预测一致性;

  • 使用编辑分类器增强的词形归并工具,可提高少样本序列上的序列到序列模型的稳健性;

  • 扩展解析器到模型线性化。

该系统在 big-treebanks 上实现了竞争性的表现。在修复了一个关键的错误之后,更正后的系统在官方评估指标 LAS、MLAS 和 BLEX 上获得了第 2 名、第 1 名和第 3 名,并且在所有指标上大幅度地优于低资源 treebank 类别的所有提交系统。

实验结果

主要结果如表 1 所示。当对所有 treebank 进行宏观平均时,该系统几乎可以在所有指标上实现竞争性能。此外,当仅在 big-treebanks 上进行评估时,它在多个指标上实现了最佳性能。即使不是表现最好的系统,该系统也会在这些 treebank 上的每个指标上取得竞争结果。该系统由单系统组件组成,而一些表现最佳的模型则使用集成方法

此外,该系统的 UFeats 分类器在这些 treebank 上也非常准确。它不仅在 UFeats F1 上实现了最佳性能,而且还帮助解析器在 big-treebanks 上实现了最佳 MLAS,即使解析器在其他指标评估上没有取得最佳性能。研究者强调了 POS 标记器/ UFeats 分类器中的一致性建模的贡献:在两种设置中,与 AllTags 度量标准相比,各个度量标准(UPOS、XPOS 和 UFeats)在参考系统上实现了更低的 advantage margin,表明参考系统尽管有时在每个单独的任务上更准确,但并不像本研究中的整体系统那样一致。

all-treebanks 和 big-treebanks 的结果之间的最大差异来自句子分割。在检查了较小 treebank 上的结果和实现后,研究者注意到标记器中处理数据的方式对这些 treebank 的泛化产生了负面影响。这对于这些 treebank 来说是毁灭性的,因为所有下游组件都在句子水平处理单词。

研究者解决了这个问题,并在提交时训练了新的分词器,其中所有超参数都与系统相同。他们进一步构建了一个非官方的评估管道,验证了它与官方系统达到的评估结果相同,并且仅通过替换分词器来评估整个管道。如表 1 所示,由此产生的系统(Stanford+)整体上更准确,分别在官方评估指标 LAS、MLAS 和 BLEX 上排名第 2、第 1 和第 3。在 big-treebanks 上,所有指标仅在 0.02%的 F1 内变化,因此不包括在内。然而,在 small treebanks 上这种影响更为明显:如表 2 所示,校正系统在所有低资源 treebank 的所有官方评估指标上都大大优于所有提交系统。

表 1:测试集上的评估结果(F1),仅适用于所有 treebank 及大型 treebank 测试集。对于所有指标上的每一组结果,研究者将其与来自参照系统的结果进行对比。参照系统是指在那个指标上当前性能最好的系统。

表 2:在低资源 treebank 测试集上的评估结果(F1)。

安装和使用

设置

StanfordNLP 支持 Python 3.6 及之后版本。推荐从 PyPI 中安装 StanfordNLP。如果已经安装了 pip,运行以下命令:

pip install stanfordnlp

这有助于解决 StanfordNLP 的所有依赖项,例如 PyTorch 1.0.0 及以上版本。

或者,你还可以从该 git repo 中安装 StanfordNLP,这样你可以更加灵活地基于 StanfordNLP 开发,以及训练自己的模型。运行以下命令:

git clone git@github.com:stanfordnlp/stanfordnlp.gitcd stanfordnlp
pip install -e .

运行 StanfordNLP

启动神经网络管道

要想运行第一个 StanfordNLP pipeline,只需在 Python 交互式解释器中进行以下步骤:

>>> import stanfordnlp>>> stanfordnlp.download('en')   # This downloads the English models for the neural pipeline>>> nlp = stanfordnlp.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()

最后一个命令将输出输入字符串中第一个句子中的单词,以及在句子的通用依存解析中控制该单词的单词索引、单词之间的依赖关系。输出如下:

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

注意:如果你遇到了 OSError: [Errno 22] Invalid argument 这样的问题,很可能是因为 Python 的问题。推荐使用 Python 3.6.8 及之后版本和 Python 3.7.2 及之后版本。

StanfordNLP 还提供多语言 demo 脚本,展示了如何在非英语语言中使用 StanfordNLP,如繁体中文。

demo 地址:https://github.com/stanfordnlp/stanfordnlp/blob/master/demo/pipeline_demo.py

python demo/pipeline_demo.py -l zh

详见:https://stanfordnlp.github.io/stanfordnlp/installation_download.html#getting-started

访问 Java Stanford CoreNLP Server

除了神经网络管道,该项目还包括一个官方 wrapper,允许使用 Python 代码访问 Java Stanford CoreNLP Server。

初始设置如下:

  • 下载 Stanford CoreNLP 和你想使用语言的模型。

  • 将 model jar 放在分发目录中。

  • 在 Python 代码中写明 Stanford CoreNLP 的地址:export CORENLP_HOME=/path/to/stanford-corenlp-full-2018-10-05。

该项目提供另一个 demo 脚本,展示如何使用 CoreNLP 客户端以及如何从中提取不同的标注。

demo 地址:https://github.com/stanfordnlp/stanfordnlp/blob/master/demo/corenlp.py

神经网络管道中的模型

该项目目前提供 CoNLL 2018 Shared Task 中所有 treebank 的模型。模型下载和使用说明详见:

 https://stanfordnlp.github.io/stanfordnlp/installation_download.html#models-for-human-languages。

批处理以最大化 Pipeline 速度

为了最大化速度,对文档进行批量处理是必要的。一次仅对一个句子运行 for loop 太慢了。最好的方法是将文档串联到一起,每个文档由空白行分割(即两个换行符\n\n)。分词器会将空白行识别为断句。目前,研究者正在积极寻求改善多文档处理。

训练自己的神经网络管道

该库中的所有神经模块,包括分词器、多词标记 (MWT) 扩展器、POS/形态特征标注器、词形归并和依存解析器,都可以用你自己的 CoNLL-U 格式数据来训练。目前,该库还不支持通过 Pipeline 接口训练模型。因此,为了训练你自己的模型,你要 clone 这个 git repo,然后从源代码进行设置。

如果想详细了解如何一步步训练和评估自己的模型,请参考以下链接:

https://stanfordnlp.github.io/stanfordnlp/training.html

参考原文:https://stanfordnlp.github.io/stanfordnlp/

理论斯坦福NLP预训练模型
31
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

关系提取技术

关系抽取任务需要检测和分类一组工件中的语义关系提及,通常来自文本或XML文档。该任务与信息提取(IE)的任务非常相似,但是IE另外需要去除重复关系(消歧),并且通常指的是提取许多不同的关系。

超参数技术

在机器学习中,超参数是在学习过程开始之前设置其值的参数。 相反,其他参数的值是通过训练得出的。 不同的模型训练算法需要不同的超参数,一些简单的算法(如普通最小二乘回归)不需要。 给定这些超参数,训练算法从数据中学习参数。相同种类的机器学习模型可能需要不同的超参数来适应不同的数据模式,并且必须对其进行调整以便模型能够最优地解决机器学习问题。 在实际应用中一般需要对超参数进行优化,以找到一个超参数元组(tuple),由这些超参数元组形成一个最优化模型,该模型可以将在给定的独立数据上预定义的损失函数最小化。

机器翻译技术

机器翻译(MT)是利用机器的力量「自动将一种自然语言(源语言)的文本翻译成另一种语言(目标语言)」。机器翻译方法通常可分成三大类:基于规则的机器翻译(RBMT)、统计机器翻译(SMT)和神经机器翻译(NMT)。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

集成方法技术

在统计学和机器学习中,集成方法使用多种学习算法来获得比单独使用任何组成学习算法更好的预测性能。

文本分析技术

文本分析是指对文本的表示及其特征项的选取;文本分析是文本挖掘、信息检索的一个基本问题,它把从文本中抽取出的特征词进行量化来表示文本信息。

自然语言处理技术

自然语言处理(英语:natural language processing,缩写作 NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

序列到序列技术

词分割技术

词分割是将一串书面语言分成其组成单词的问题。在使用某种形式的拉丁字母的英语和许多其他语言中,空格是单词分隔符(单词分隔符)的良好近似,尽管这个概念具有局限性。

推荐文章
Warmup