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 构建在其他几个 NLP 库之上,包括 Franc 和 Brain.js。 它为 NLP 的许多组件提供了一个不错的界面,如分类、情感分析、词干提取、命名实体识别和自然语言生成。 它还支持相当多的语言,如果你计划使用英语以外的语言,这将很有帮助。 总之,这是一个很棒的通用工具,具有一个简化的界面,可用于其他几个很棒的工具。 在你需要更强大或更灵活的东西之前,这可能会在你的应用程序中走很长一段路。

Java 工具

OpenNLP

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

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遇到更多障碍,是否会导致更少的人使用Java进行数据科学。我知道我几乎所有在这个领域的工作现在都是用Python完成的,或者用Node处理一些轻量级任务。当然,仍然有一些C、Java和其他语言在后端以及处理非常大的数据集。

回复,作者是clhermansen

因为我深入参与了整个JVM领域,所以当我需要快速完成一些可以依赖于Java工具的事情时,我使用Groovy。但出于某种原因,这种方法并没有像Python那样成为访问强大工具链的便捷框架。我认为这方面的证据非常明显——比较一下有多少项目愿意用C语言编写一些高性能工具链,以便可以从Python调用,以及有多少项目愿意用Java编写一些高性能工具链,以便可以从Groovy调用……

Kotlin可以作为利用Java代码库的另一种方式。我想Scala已经这样做了吧?

回复,作者是barkerd427

Creative Commons License本作品采用知识共享署名-相同方式共享4.0国际许可协议进行许可。
© . All rights reserved.