发表日期:2019-06-12
StanfordNLP,让你在 Python 里一手掌握 53 种自然语言分析
—— 不久之前,斯坦福大学公开了它最新的自然语言处理代码库—— StanfordNLP。它不但包含了完整的语义分析工具链,还带有 73 个不同的高精度神经网络模...
作者:Mohd Sanad Zaki Rizvi
不久之前,斯坦福大学公开了它最新的自然语言处理代码库—— StanfordNLP。它不但包含了完整的语义分析工具链,还带有 73 个不同的高精度神经网络模型,能解析 53 种不同的人类语言。是不是很牛×啊?今天的教程里,优达菌就手把手带你在 Python 上使用 StanfordNLP,进行一些自然语言处理实战。
在学习自然语言处理(NLP)的过程中,我们常常会遇到这样一个问题:“我们能不能为除英语之外的其他语言构建模型呢?”在很长一段时间里,这都是一个难以完成的任务。要知道,每种语言都有自己独特的语法模式和细微的语言差别,而且除了英语之外,其他语言的数据集实在是少之又少。
但如今,我们有了 StanfordNLP 这一神器。
当我第一次看到 StanfordNLP 的介绍时,我简直无法抑制自己的激动之情。作者声称它可以支持超过 53 中不同的人类语言!(没错,你没看错,确实是 53 种……我当时也觉得自己一定是眼花了。)
在 StanfordNLP 的官方网站上,作者列出了目前支持的所有 53 种人类语言,其中包含了许多其他 NLP 库所没有的语言,比如印地语、日语和我们最爱的中文。这简直是为我们打开了通往无限可能的新世界的大门啊!
StanfordNLP 到底是何方神圣,我为啥需要用它?
简单地说,StanfordNLP 是一系列预训练好的,高水平的神经网络模型。目前的 73 个模型都是来自 2017、18 年 CoNLL 会议上的研究者。它们都是用 PyTorch 训练而来的,你也可以用自己的语料库来训练和评估它们,是不是很酷炫?
此外,StanfordNLP 还包含了一个官方的 CoreNLP 封装。CoreNLP 作为一款广受好评的史诗级 NLP 库,在此之前,你只能依靠 Java 才能用上它。对有兴趣的读者,我建议你看看这个教程,了解更多有关 CoreNLP 的信息,以及它在 Python 中的工作原理。
对 NLP 爱好者来说,真是没有比这个更棒的了。现在,就让我们在 Python 中实际操作一下吧!
在 Python 中安装设置 StanfordNLP 库
最初,这个库里有一些奇怪的东西,让我感到十分困惑。例如,你需要使用 Python 3.6 / 3.7 或更高版本才能使用 StanfordNLP。为了安全起见,我在 Anaconda 中设置了一个单独的 Python 3.7.1 环境。具体步骤如下:
打开 conda 命令行,输入:
conda create -n stanfordnlp python=3.7.1
一般来说一路 yes 到底即可。
接着激活刚建立的环境:
source activate stanfordnlp
conda 4.6 或更高版本可以用:
conda activate stanfordnlp
在新环境里安装 StanfordNLP 库:
pip install stanfordnlp
接下来,我们需要下载对应自然语言的模型。打开一个 Python 命令行,导入 StanfordNLP 库:
import stanfordnlp
接着下载对应的语言模型,以英语(“en”)为例:
stanfordnlp.download('en')
根据你网络速度的不同,这可能需要花费一些时间。一般来说你得下载大概 300M 的内容。
一些注意事项
StanfordNLP 是基于 PyTorch 1.0.0 构建的。如果你尝试在更早的版本上运行它,可能会遇到一些奇怪的问题。你可以在命令行运行这样的命令来检查你的 PyTorch 版本:
pip freeze | grep torch
正常情况下你应该看到类似 torch==1.0.0 这样的输出。
我试过在没有独立显示芯片的机器上跑这个库,比如我的联想 Thinkpad E470(8G 内存,英特尔核显)。
结果是,Python 很快就甩了一个 memory error 给我。因此,我换到一台有独立显卡的机器上来运行这些代码,我强烈建议你也这么做。
对了,你可以试试 Google 出品的地表最强 Python 编辑器——Google Colab,它提供了 12-14G 的内存,以及免费的 GPU 算力。
好啦,说了这么多,你应该已经装好了相关的库和模型了吧?让我们试着开始一些基本的 NLP 处理吧。
使用 StanfordNLP 完成简单的 NLP 任务
假设我们要分析一段英文材料,首先,我们需要建立一个文字处理管道(pipeline):
nlp = stanfordnlp.Pipeline(processors = "tokenize,mwt,lemma,pos")
doc = nlp("""The prospects for Britain’s orderly withdrawal from the Eu