12 个自然语言处理开源工具

了解一下十几个可用于您的下一个 NLP 应用程序的选项。
349 位读者喜欢这个。
Chat bubbles

自然语言处理 (NLP) 技术为我们生活中的所有聊天机器人、语音助手、预测文本和其他语音/文本应用程序提供支持,并且在过去几年中得到了显著发展。市面上有各种各样的开源 NLP 工具,因此我决定调查一下情况,以帮助您规划下一个基于语音或文本的应用程序。

在本次评测中,我专注于使用我熟悉的语言的工具,即使我对所有工具都不熟悉。(无论如何,在我不熟悉的语言中,我没有找到很多不错的工具选择。) 也就是说,由于各种原因,我排除了我熟悉的三种语言的工具。

我没有包含的最明显的语言可能是 R,但我发现的大多数库一年多都没有更新了。这并不总是意味着它们没有得到很好的维护,但我认为它们应该更频繁地获得更新,以便与同一领域的其他工具竞争。我还选择了最有可能在生产场景中使用的语言和工具(而不是学术界和研究领域),而且我主要将 R 用作研究和发现工具。

我还惊讶地发现 Scala 库相当停滞不前。自从我上次使用 Scala 以来已经有几年了,那时它非常流行。大多数库自那时以来都没有更新,或者只有少量更新。

最后,我排除了 C++。这主要是因为我已经很多年没有用 C++ 编写代码了,而且我工作过的组织也没有将 C++ 用于 NLP 或任何数据科学工作。

Python 工具

自然语言工具包 (NLTK)

很容易论证,在所有我调查的工具中,自然语言工具包 (NLTK) 是功能最全的工具。它实现了您可能需要的 NLP 的几乎所有组件,例如分类、分词、词干提取、标记、解析和语义推理。并且每个组件通常有不止一种实现方式,因此您可以选择您想要使用的确切算法或方法。它还支持多种语言。但是,它以字符串的形式表示所有数据,这对于简单的构造来说很好,但使得使用某些高级功能变得困难。文档也很密集,但是有很多文档,以及一本很棒的书。与其他工具相比,该库也比较慢。总的来说,对于需要特定算法组合的实验、探索和应用程序来说,这是一个很棒的工具包。

SpaCy

SpaCy 可能是 NLTK 的主要竞争对手。在大多数情况下,它速度更快,但每个 NLP 组件只有一个实现。此外,它将所有内容表示为对象而不是字符串,这简化了构建应用程序的界面。这也有助于它与其他许多框架和数据科学工具集成,因此一旦您更好地了解您的文本数据,您就可以做更多的事情。但是,SpaCy 不像 NLTK 那样支持那么多语言。它确实有一个简单的界面,具有简化的选择集和出色的文档,以及用于语言处理和分析的各个组件的多个神经模型。总的来说,对于需要在生产环境中具有高性能且不需要特定算法的新应用程序来说,这是一个很棒的工具。

TextBlob

TextBlob 有点像是 NLTK 的扩展。您可以通过 TextBlob 以简化的方式访问 NLTK 的许多功能,并且 TextBlob 还包括来自 Pattern 库的功能。如果您刚刚入门,这可能是一个在学习时使用的好工具,并且它可以用于不需要过度高性能的生产应用程序。总的来说,TextBlob 无处不在,非常适合小型项目。

Textacy

这个工具可能是我用过的任何库中名称最好的。大声说几遍“Textacy”,同时强调“ex”并拉长“cy”。它不仅说起来很棒,而且也是一个很棒的工具。它使用 SpaCy 作为其核心 NLP 功能,但它处理处理前后的大量工作。如果您计划使用 SpaCy,您不妨使用 Textacy,这样您可以轻松导入多种类型的数据,而无需编写额外的辅助代码。

PyTorch-NLP

PyTorch-NLP 发布才一年多一点,但它已经获得了庞大的社区。它是快速原型设计的绝佳工具。它还经常使用最新的研究进行更新,并且顶级公司和研究人员发布了许多其他工具来完成各种惊人的处理,例如图像转换。总的来说,PyTorch 的目标是研究人员,但它也可以用于原型设计和使用最先进算法的初始生产工作负载。在其基础上创建的库也可能值得研究。

Node 工具

Retext

Retextunified 集体的一部分。Unified 是一个接口,允许多个工具和插件有效地集成和协同工作。Retext 是 unified 工具使用的三种语法之一;其他两种是用于 markdown 的 Remark 和用于 HTML 的 Rehype。这是一个非常有趣的想法,我很高兴看到这个社区发展壮大。Retext 没有公开其许多底层技术,而是使用插件来实现您可能旨在通过 NLP 实现的结果。使用简单的插件可以轻松完成诸如拼写检查、修复排版、检测情绪或确保文本可读性等操作。总的来说,如果您只是需要完成某项工作而无需了解底层过程中的所有内容,那么这是一个出色的工具和社区。

Compromise

Compromise 当然不是最复杂的工具。如果您正在寻找最先进的算法或最完整的系统,这可能不是适合您的工具。但是,如果您想要一个具有广泛功能并且可以在客户端运行的高性能工具,您应该了解一下 Compromise。总的来说,它的名字很贴切,因为它的创建者在功能和准确性方面做出了妥协,专注于一个更小的软件包,其中包含更具体的功能,这些功能受益于用户更多地了解使用环境。

Natural

Natural 包括您可能在通用 NLP 库中期望的大多数功能。它主要关注英语,但也贡献了一些其他语言,并且社区对其他贡献持开放态度。它支持分词、词干提取、分类、语音、词频-逆文档频率、WordNet、字符串相似性和一些屈折变化。它可能最类似于 NLTK,因为它试图在一个软件包中包含所有内容,但它更容易使用,并且不一定专注于研究。总的来说,这是一个相当完整的库,但它仍在积极开发中,可能需要额外的底层实现知识才能充分发挥作用。

Nlp.js

Nlp.js 构建于包括 Franc 和 Brain.js 在内的其他几个 NLP 库之上。它为 NLP 的许多组件(如分类、情感分析、词干提取、命名实体识别和自然语言生成)提供了友好的界面。它还支持相当多的语言,如果您计划使用英语以外的语言,这将很有帮助。总的来说,这是一个很棒的通用工具,具有通往其他几个出色工具的简化界面。在您需要更强大或更灵活的东西之前,这可能会在您的应用程序中取得长足的进步。

Java 工具

OpenNLP

OpenNLP 由 Apache 基金会托管,因此很容易将其集成到其他 Apache 项目中,例如 Apache Flink、Apache NiFi 和 Apache Spark。它是一个通用的 NLP 工具,涵盖了 NLP 的所有常见处理组件,并且可以从命令行或作为库在应用程序中使用。它还广泛支持多种语言。总的来说,如果您使用 Java,OpenNLP 是一个功能强大的工具,具有许多功能,并且可以用于生产工作负载。

StanfordNLP

Stanford CoreNLP 是一组工具,提供统计 NLP、深度学习 NLP 和基于规则的 NLP 功能。已经创建了许多其他编程语言绑定,因此可以在 Java 之外使用此工具。它是由一家精英研究机构创建的非常强大的工具,但它可能不是生产工作负载的最佳选择。该工具采用双重许可,并为商业目的提供特殊许可。总的来说,对于研究和实验来说,这是一个很棒的工具,但在生产系统中可能会产生额外的成本。Python 实现可能也比 Java 版本更能引起许多读者的兴趣。此外,Coursera 上一位斯坦福大学教授讲授了最好的机器学习课程之一。查看一下以及其他很棒的资源。

CogCompNLP

CogCompNLP 由伊利诺伊大学开发,也有一个具有类似功能的 Python 库。它可以用于本地或远程系统处理文本,这可以消除本地设备的巨大负担。它提供诸如分词、词性标记、组块、命名实体标记、词形还原、依存关系和成分句法分析以及语义角色标记等处理功能。总的来说,对于研究来说,这是一个很棒的工具,它有很多您可以探索的组件。我不确定它是否非常适合生产工作负载,但如果您计划使用 Java,则值得一试。 


您最喜欢的 NLP 开源工具和库是什么?请在评论中分享 - 尤其是如果有什么我没有包括在内的工具。

标签
Dan Barker
网站:http://danbarker.codes 电子邮件:dan@danbarker.codes

3 条评论

Dan,这是一篇非常有用的文章。非常感谢你的撰写!

我发现自己在各种 Java 和 JVM 项目(尤其是在 JNLP、Netbeans、Groovy 和 Grails 中)过渡到 Java 11 及更高版本时遇到了过渡性问题。看看您的任何 Java NLP 解决方案是否也遇到了类似的难题将会很有趣。

非常感谢!这方面的 Java 领域真的很有趣。几年前它非常活跃,现在很多工作似乎都在转向公司,而不是纯粹的开源。我认为这减缓了那里的进展,与此同时,Python 已成为数据科学的首选语言。我想知道更多的绊脚石是否会导致更少的 Java 用于数据科学。我知道我几乎所有在该领域的工作现在都是用 Python 或 Node 完成的,用于更轻量级的东西。显然仍然有一些 C 和 Java 以及其他语言在后端和处理真正的大型数据集。

回复 作者:clhermansen

因为我深深地投入到整个 JVM 领域,所以当我需要做一些快速而粗略的可以依赖于基于 Java 的工具的事情时,我使用 Groovy。但无论出于何种原因,这种方法并没有像 Python 那样作为访问强大工具链的便捷框架而真正流行起来。我认为这方面的证据非常清楚 - 比较一下有多少项目愿意用 C 编写一些高性能工具链以便可以从 Python 调用它,与有多少项目愿意用 Java 编写一些高性能工具链以便可以从 Groovy 调用它……

Kotlin 可以作为利用 Java 代码库的另一种替代方法。我猜 Scala 已经有了?

回复 作者:barkerd427

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.