为什么是SpaCy而不是NLTK?

2,215 阅读17分钟

Why SpaCy over NLTK?

我们列出了spaCy比NLTK更突出的10个方面。它还包括NLTK胜过spaCy的信息。

Why SpaCy over NLTK?

背景介绍

在对这两个最受欢迎的自然语言处理(NLP)库进行比较之前,让我们先了解一下spaCy和NLTK是什么,它们的创造者是谁,以及为什么首先要创建这些软件包?

(如果你已经了解这些库,请随意跳过这一节
从自然语言工具包开始,缩写为NLTK,是最早开发的NLP库,它为NLP任务和计算语言学提供了广泛的软件、数据集(被称为语料库)和所有平台的文档。NLTK的诞生可以追溯到2001年,当时Steven Bird在宾夕法尼亚大学教授计算语言学,Edward Loper也开始担任该校的助教。他们的目的是开发一个持久的软件,使NLP的教学更容易,但他们最终建立了一个最广泛使用的NLP包。它为实验提供了广阔的空间。目前,它已被世界各地数以千计的研究人员贡献并用于开创性的研究。

spaCy是这个游戏的最新参与者,由Matthew Honnibol和Ines Montani开发,当时Matthew决定退出学术界,让人们而不仅仅是研究人员能够使用NLP。他们制作了一个开源的、多平台的库,在短短5-6年内就获得了巨大的人气,成为NLTK的主要竞争对手。这很了不起!这个用Cython和Python编写的具有工业强度、可用于生产的软件包相信能迅速有效地完成所有NLP任务,如解析、标记化、词法化、文本分类、实体识别和链接、可视化等。最新的v3版本支持最先进的(SOTA)转化器模型,为spaCy管道提供了显著的基准。根据最近的更新,spaCy有超过2300万的下载量和近2.12万颗Github星星。

我们为什么要讨论这个问题?

正如微软亚洲研究院所提到的,未来10年将是NLP的黄金时期。它是人工智能(AI)中最热门的研究领域之一。因此,分析当前实现这一研究的技术是最重要的。十年前,我们还不会谈论这个问题。但随着spaCy的出现和崛起,这两个流行的库之间的比较已经开始。在计算语言学使用最多的库中,Spacy和NLTK位居前列。了解spaCy如何以及在哪里领先于NLTK是至关重要的,因为它在NLTK这个强有力的竞争者在市场上的时候就已经蓬勃发展并确立了自己的地位。

让我们来探讨一下我们的主要问题--为什么是SpaCy而不是NLTK?

我已经做好了准备,让我们来了解一下spaCy击败NLTK的优势。在广泛使用这两个库之后,我记下了以下10点来证明我的观点。

在你进一步行动之前,我想说的是,我并不打算以任何方式贬低NLTK。它20年来的发展步伐仍在继续,没有更好的方法来证明它的价值。

Why SpaCy over NLTK?

1.缓慢而稳定地赢得比赛,但并不总是如此。

NLTK拥有人们进行NLP所需的每一种工具和技术。它是一个巨大的库,有各种各样的包装器、干系人、分析器和其他东西。它就像一个糖果店,每个NLP从业者都会因为看到这么多选择而感到震惊。但明智的做法是,在现有的东西中选择最好的。NLTK的可悲之处在于,最好的东西并不在这批产品中。此外,NLTK是一只乌龟,公平地说,它的建立并没有考虑到速度问题,因为它是为了教学而建立的。现在,经过尝试和测试,我完全可以证明Matthew所说的,我们需要一个能与NLP这个热门领域保持同步的库。

输入:spaCy!它对每个特定的管道任务都有令人难以置信的准确性和速度,这是每个NLP从业者梦寐以求的。看看他们的官方网站上的基准,我会等到你的下巴掉下来的时候!它将SOTA算法打包在en_core_web_trf 模型中,并可自由定制管道。 spaCy越来越受欢迎,证明了它的实力。

2.令人惊奇的文档,真的令人惊奇!

当一个人开始使用一个新的库,甚至后来的时候,黑暗中唯一的光明就是它的文档。尽管我们有在线教程,但老实说,如果一个人想从头开始创造一些东西,或者想创造一些新的东西,他就必须深入研究文档,别无他法。因此,比较spaCy和NLTK的文档是非常重要的。spaCy的文档清晰、明了、简洁、有条理且涵盖所有内容。它由详细的解释、有价值的技巧和窍门、有用的代码模块和插图以及视频教程组成,可以让你开始使用。制作者在必要时清除了各种常见问题,使读者没有任何疑虑。丰富多彩的交互式用户界面为用户提供了良好的体验。

相反,NLTK的某些软件包的文档不连贯,难以理解,而且相当不完整,初学者需要花一些时间才能理解。创作者所写的关于使用NLTK进行NLP的书非常详细,可以帮助新手深入理解概念。但是,它仍然缺乏帮助人们实现NLP的指导。这使得NLTK难以学习和使用,因为在文档中没有提到明确的NLP管道。毫无疑问,它有很多代码片段和例子,但并不是所有的软件包都是这样的。此外,在NLTK数据的大型数据库中,没有任何关于每个语料的结构和组织的文档,这可能会限制NLP从业者利用数据集的全部潜力。此外,每个管道API的介绍都是在所有不同的算法API之后,而不是在页面的开头给出,以执行该NLP任务。例如,在解释了Brill's Tagger、CRF Tagger、HMM Tagger、HunPos Tagger、Perceptron Tagger等的API之后,再介绍标签模块。NLTK的文档有改进的余地,而造成这种不统一的最合理的原因是一些贡献者对库的不断补充。

3.真正的国际化!

虽然在最初阶段spaCy只支持英语(v1),但在最新版本(v3)中,它支持17种语言的统计建模和64种以上语言的 "阿尔法标记化"。另一方面,尽管NLTK比spaCy支持更多的语言,但它并没有将支持扩展到所有的模块和算法。在众多的软件包中,只有少数软件包提供了多语言支持,而且所有的软件包都不支持其他软件包所支持的每一种语言。例如,nltk.parse.stanford模块用于解析、标记化和标签,nltk.stem.snowball模块用于干化,提供了大约15种语言的干化器,包括阿拉伯语、英语、罗马尼亚语、瑞典语等,nltk.test.unit提供了评估POS标签和俄语、英语等的翻译方法(不是像Snowball干化器那样全部15种语言),包括对模型未知/未指定的语言和其他一些。但其余的分块、分类、聚类、解析、情感分析、词根、标签、基于转化的学习、单元测试、翻译和基于聊天机器人的算法只支持英语。

因此,国际化不能归功于NLTK所提供的整套文本处理库。然而,spaCy提供了训练有素的管道,并且可以为它所支持的所有语言自由定制,确保可靠和一致的国际化。

Why SpaCy over NLTK?

奖励:spaCy甚至为命名实体的多语言提供了一个预先训练好的语言模型。

4.就在这里,有一些M15take!

错误。期待一个字符串,发现一个整数。
我还记得,当我刚开始使用NLTK时,尝试探索一个新的语料库,却没能理解为什么某个特定的方法是无效的。在许多情况下都是这样,我在NLTK中训练我的标记器时花了很多时间来调试错误。说到spaCy,v3有一个令人难以置信的错误处理和验证支持,使spaCy占了上风。它有Python 3的类型提示支持,以及像Mypy那样的静态或编译时类型检查器,用于验证和给出友好的错误信息。所遵循的政策是 "错误发生时",这是非常有帮助的。此外,Thinc,在引擎盖下运行的轻量级深度学习库,通过指导你所有超参数的预期类型、多维数组来协助模型定义;它甚至有自定义数据类型,如Floats3d(浮点值的三维数组)和其他各种训练参数。Thinc也提供动态的错误查找支持。在你最喜欢的代码编辑器中增加了提示功能,你可以体验到前所未有的顺畅的编码体验!这可以节省你的时间和精力。这节省了通过文档和堆栈跟踪来找出错误的时间和精力,并产生了高效、无错误的代码。

5.无忧无虑的下载

NLTK的数据包括各种语料库、书、流行的包、运行测试的包、第三方数据包以及NLTK中的所有模块。虽然它是一个简单的用户界面,但是当人们看到它时,可能会发现它不堪一击,最终运行nltk.download('all') ,代表下载所有NLTK数据。这导致内存中充满了大约6GB的NLTK数据,而实际上人们每次只需要处理一个语料库和一些软件包。我看到大多数使用NLTK的NLP从业者都是这样做的。否则,人们会花很多时间来决定要下载什么。最糟糕的是,如果不下载NLTK数据,就无法执行任何NLP任务
。只需下载spaCy,它就能提供所有基本的管道组件。人们可以选择下载小型(sm)、中型(md)、大型(lg)或最近增加的基于转化器(trf)的语言模型。人们甚至可以从一个空白的语言模型开始,并开始自行训练整个管道。

nlp = spacy.blank('<language_name>')

6.对NLP更好的方法

这两个著名的软件包在进行NLP方面有一个非常不同的观点。考虑到同样的NLP管道的操作和输入,流经两者的内容是非常不同的。NLTK遵循一种基本的面向数据类型的方法,例如标记化的输出是一个字符串/句子的列表,标记是一个映射到其标签的字符串字典,等等。这意味着我们总是收到一个整数、字符串、列表或字典,并且必须做出判断,创建我们自己的数据结构并对其进行处理,尽管每个NLP任务都会遵循相同的步骤。

但是,spaCy采用的是面向对象的方法。它在文档对象、词汇和语言类上工作。每种语言都是一个类,由所有预先训练好的常用管道组件组成,如实体链接器和识别器、依赖性分析器、标记器、模式匹配器、词法分析器等,它们处理输入的文本,形成一个文档对象,由注释如is_stopwordnoun_chunkssentiment 和方法如sents() 。人们甚至可以使用document.similarity() 方法找到文档对象之间的相似性。词汇表数据结构与特定语言的词汇表相同,即它包含了定义管道语言的词向量。人们可以从Vocab对象中获得字符串、词库、向量等。这种方法有两个好处。第一,数据结构和工作流程是为NLP定制的,因此,即使是高级的NLP,也能更简单、更容易理解和操作。第二,这种方法遵守公认的面向对象的编程风格和标准,因此是最新的,并遵循最佳实践。

7.7.一切都在 "语境 "中!

我刚才谈到了词向量,这就是这一点的全部内容。词嵌入/向量是任何NLP任务的关键,因为它提供了上下文。对于机器来说,每个词都被视为一个字符串,存储在其内存中的某个位置。它不能单独理解其含义,也不能在输入文本的上下文中理解。这就是单词嵌入的作用。它们提供了一个有用的数字表示,使机器理解字符串的上下文。就这样,单纯的 "字符串 "对机器来说就变成了 "该特定文本中的一个词"。常见的预训练词向量有GloVe、FastText、Word2Vec的两种架构,即连续词袋(CBOW)和连续跳格模型、ELMo等。

说到NLTK,它天生就不支持词向量。人们不得不在库外寻找选择,比如使用Gensim,一个流行的话题建模库或上述任何一个嵌入的算法来创建理解上下文的管道。然而,spaCy的语言模型中已经有Word2Vec嵌入,这使得工作变得非常简单。它还提供了灵活性来训练我们自己的词嵌入和更新Vocab对象(因为它包含词向量)。它还提供了各种Tok2Vec选项作为附加功能。

8.功率2倍

一个NLP包如果有内置的可视化工具来加强理解和展示,就会变得更加强大。它有助于可视化解析树、实体链接等,有助于改善训练管道或统计模型,并能显著地修复错误,而这一点在没有图表的情况下是很难解释的。NLTK没有对可视化的任何支持。人们需要使用优秀的python内置绘图库,如Matplotlib、Seaborn、NetworkX、Bokeh、Holoviews等。此外,spaCy在其母体Explosion AI下有一个库,称为displaCy,用于依赖性解析,dispaCyENT用于命名实体识别。图1和图2显示了通过上述代码绘制的美丽的彩色图表。这些图可以进一步渲染成HTML,托管在网络应用程序上,下载成SVG,也可以在Jupyter笔记本中查看。

import spacy
nlp = spacy.load('en_core_web_sm')
doc = nlp(u"Starting with Natural Language Toolkit, abbreviated as NLTK, is the earliest NLP library developed which offers a wide range of software, datasets (known as corpora) and documentation across all platforms for NLP tasks and computational linguistics. The birth of NLTK dates back to 2001 when Steven Bird was teaching Computational Linguistics at the University of Pennsylvania and Edward Loper began working as a teaching assistant for the same.\n The most recent version v3 has support for state-of-the-art transformer models which powers the spaCy pipeline giving remarkable benchmarks. According to the most recent updates, spaCy has more than 23 million downloads and almost 21.2 thousand Github stars.")
spacy.displacy.serve(doc, style="ent")

Why SpaCy over NLTK?
图1: spaCy的命名实体识别器的dispaCy视觉化

import spacy
nlp = spacy.load('en_core_web_sm')
doc = nlp(u"According to the most recent updates, spaCy has more than 23 million downloads and almost 21.2 thousand Github stars.")
spacy.displacy.serve(doc, style="dep"))

Why SpaCy over NLTK?
图2: spaCy的依赖性分析器的可视化。

9.端到端的项目架构

我们都喜欢git。为什么我们喜欢它?因为它为我们提供了协作、版本控制、项目打包和部署的灵活性。现在,每个项目都有这些要求;不管是研究项目还是工业项目。NLTK没有任何数据以及管道打包和部署,也没有工作流程管理系统。 spaCy听取了我们的请求,带来了一个一站式的解决方案,使机器学习(ML)项目的专门开发和部署成为可能。最近发布的spaCy版本在NLP领域有了重大飞跃,引用他们的文档,"让你管理和分享不同用例和领域的端到端spaCy工作流,并协调训练、打包和服务你的定制管道。" 在开源版本控制库DVC的帮助下,人们可以跟踪数据和代码文件的所有变化。目前,它只支持一个工作流程,但在未来,我们可以期待一个项目的多个工作流程。它甚至允许你将数据托管在云数据库中,如谷歌云平台(GCP)、亚马逊网络服务(AWS)、微软Azure、Hadoop分布式文件系统(HDFS)、简单存储服务(S3)等。它自动缓存结果,避免重新运行,注重可重复性和CI/CD,这使它成为所有使用情况的完美解决方案。

10.一体化(几乎)!

看了前面所有的内容,我们就会明白为什么NLTK只能用于研究和教育目的。如果人们将NLTK用于工业用途,他们将面临挑战,因为它的速度慢,精度低,无法进行工作流程管理,而且有很多算法但没有最佳算法。虽然他们的网站说它不是用于研究目的,但最新版本允许声明式配置系统、可训练和定制管道、SOTA变压器支持以及在任何框架(如Tensorflow、Pytorch等)中创建自定义模型。由于现有的积极因素,如空白模型的创建、对训练词嵌入层的支持、多语言和多领域的支持、所有自然语言理解(NLU)管道工具的灵活定制、向NLP管道添加新组件的能力等,它为研究使用检查了大部分的盒子。不过,它还没有达到这个要求,因为spaCy并没有像NLTK那样提供各种算法和语料。无论如何,与NLTK相比,它仍然有优势。

NLTK--它何时能胜过SpaCy?

Why SpaCy over NLTK?

了解这一点对于做出明智的决定同样重要,因此我想谈谈NLTK在什么时候比SpaCy好。

首先,自然语言生成(NLG),包括聊天机器人和语言翻译,是spaCy无法完成的。NLTK有nltk.chat 模块,可以通过对句子的模式匹配来进行简单的问题回答。它也有用于机器翻译的包,在nltk.translate 。它有一些包可以帮助使用双语评估(BLEU)对NLG任务进行评估。其次,spaCy会逐渐消耗大量的内存。如果使用基于云的编码平台,例如Google Colab,这不会是一个问题,但是对于在个人电脑上运行,当数据非常庞大时,这可能是一个问题。最后,NLTK在过去20年中获得了经验、信任和研究支持,这是spaCy在市场上早期所不能比的。NLTK是世界上许多NLP从业者的最爱,因为它所提供的算法和数据种类繁多,数量庞大。

结束语

spaCy在其发布后的较短时间内,在许多NLP任务方面已经与NLTK并驾齐驱。OpenGenus的这篇文章列举了spaCy比NLTK更出色的10个方面。它还包括NLTK胜过spaCy的信息。

请随时在评论中提供建设性的反馈和建议。在评论中见 :)

参考资料

  1. 关于NLTK的更多信息可以在:用Python进行自然语言处理--用自然语言工具包分析文本作者:Steven Bird, Ewan Klein, and Edward Loper
  2. NLTK库的Github链接