Apache Spark自然语言处理库入手!(免费使用)
Apache Spark是一个通用的集群计算框架,支持分布式SQL、流媒体、图形处理和机器学习。而Spark生态系统还有一个Spark 自然语言处理库,可以在GitHub上获取它,或者从快速入门教程开始。
John Snow Labs NLP库是在Apache 2.0许可下编写,在Scala中不依赖于其他NLP或ML库。它扩展了Spark ML管道API。由此你将受益于:
1.无与伦比的运行时性能。因为处理将直接在Spark DataFrame上完成,无需复制,并充分利用Spark的缓存,执行计划和优化的二进制数据格式。
2.现有Spark库的无摩擦使用,包括分布式主题建模、字嵌入、n-gram计算、字符串距离计算等等。
3.通过使用统一的API跨越自然语言理解、机器学习和数据科学管道的深度学习部分,提高了生产率。
一个创始团队表示,“在John Snow Labs NLP的帮助下,我们实现了承诺,使客户能够利用最新的开源技术和数据科学方面的学术突破,所有这一切都在高性能的企业级代码库中实现。此外,John Snow Labs NLP涵盖了广泛的高效自然语言理解工具,用于文本挖掘、问题解答、聊天机器人、事实抽取、主题建模或搜索、运行的规模和性能在目前还没有可用。”
该框架提供了注解者的概念,并带出了以下内容:
分词器
标准化者
词干分析器
Lemmatizer
实体提取器
日期提取器
一部分的语音标记
命名实体识别
句子边界检测
情绪分析
拼写检查器
此外,由于与Spark ML的紧密集成,在构建NLP管道时,还可以立即使用更多的功能。这包括词语嵌入、主题建模、停止删除词,各种特征工程特性(tf-idf,n-gram,相似性度量等)以及在机器学习工作流程中使用NLP注释作为特征。
现在虚拟团队已经建立了很多依赖于自然语言理解的商业软件。有关于spaCy、CoreNLP、OpenNL、Mallet、GATE、Weka、UIMA、nltk、gensim、Negex、word2vec、GloVe等的一些实践经验。
性能
需要处理的三个顶级要求中的第一个就是运行时的性能。这个问题在很大程度上是一个解决了的问题,因为spaCy的出现和它的公共基准反映了一个经过深思熟虑和精心策划的折中方案。但是,当在其上构建Spark应用程序时,你可能仍然会得到不合理的吞吐量。
要理解原因,就要考虑到NLP管道始终是一个更大的数据处理管道的一部分:例如,问题回答包括加载训练、数据、转换、应用NLP注释器、构建特征、训练价值提取模型、评估结果(训练/测试分割或交叉验证)和超参数估计。
将数据处理框架(Spark)从NLP框架中分离出来,意味着大部分处理时间都将花费在序列化和复制字符串上。
TensorFrames是一个很好的并行处理,它极大地提高了在Spark数据框上运行TensorFlow工作流的性能。以下这张图片是Tim Hunter对于TensorFrames出色的概述:
Spark和TensorFlow都对性能和规模进行了优化。但是,由于DataFrames存在于JVM中,TensorFlow则在Python进程中运行,因此两个框架之间的任何集成都意味着每个对象都必须被序列化,经过两种方式进行进程间通信,并且至少复制两次。 TensorFrames的公共基准测试报告,通过在JVM进程中复制数据(使用GPU时会更多),就可以实现4倍的加速。
在Spark中使用spaCy时,我们看到了相同的问题:Spark对于加载和转换数据进行了高度优化,但是运行NLP管道需要复制除Tungsten优化格式以外的所有数据,将其序列化,将其推送到Python进程,运行NLP管道(这一点闪电般快),然后将结果重新序列化回JVM进程。这自然会降低你从Spark的缓存或执行计划程序中获得的任何性能优势,因为至少需要两倍的内存,并且不能通过扩展来提高性能。使用CoreNLP消除了复制到另一个进程的步骤,但仍然需要复制数据帧中的所有文本,并将结果复制回来。
因此,首要业务是直接在优化的数据框架上进行分析,正如Spark ML已经做到的:
生态系统
第二个核心要求是现有的Spark库的无重复使用。
一开始考虑构建一个Spark NLP库的时候,首先要求Databricks指出谁已经建立了一个。以下是典型的代码示例:
所有这些阶段都在一个可配置、可序列化和可测试的管道内运行。也可以在数据框上运行,而不需要任何数据拷贝(与spark-corenlp不同)。
这意味着John Snow Labs NLP库具有完全分布式的,进行了严格测试和优化的主题建模、单词嵌入、n-gram生成。我们不必要专门的去构建他们。
最重要的是,这意味着你的NLP和ML管道现在是统一的。上面的代码示例是典型的,从某种意义上说,不只是用一个NLP来生成特征,然后用训练决策树,一个更复杂的示例还将应用命名实体识别,通过POS标签和共识解析进行筛选,训练一个随机森林,同时考虑到其他来源的基于NLP的特征和结构化特征,并使用网格搜索进行超参数优化。无论何时需要测试、复制、序列化或发布这样的管道时,能够使用统一的API支付股息,这甚至会超出性能和重用的好处。
企业级
第三个核心要求是交付一个关键任务的企业级NLP库。如今,许多最受欢迎的NLP软件包都有学术根源,这表现在设计权衡方面,有利于在运行性能上简化原型,与简单的抽象的极简主义API相比,选择范围更广,以及对可扩展性、错误处理、节约内存消耗和代码重用的淡化。
John Snow Labs NLP库是用Scala编写的。它包括Scala和Python API。同时,它不依赖任何其他NLP或ML库。对于每种类型的注释器,都进行学术文献回顾,以查找最新的状态,进行团队讨论并决定要实施哪种算法。实现的评估有三个标准:
准确性 - 如果它具有次级算法或模型,那么在一个好的框架中并没有意义。
性能 - 运行时间应该比任何公共基准都要好。没有人应该放弃准确性,因为注释器的运行速度不够快,无法处理流式用例,或者在集群设置中不能很好地进行扩展。
训练性或可配置性 - NLP是一个固有的领域的特定问题。
该库已经在企业项目中使用 ,这意味着第一级的bug、重构、意外的瓶颈和序列化问题已经得到解决。单元测试覆盖范围和参考文档的水平使我们能够很容易地开放源代码。
John Snow Labs是领导和赞助Spark NLP库开发的公司。该公司提供商业支持、赔偿和咨询。这为库提供了长期的财政支持。
参与
如果你需要使用NLP进行当前项目,请访问John Snow Labs NLP for Apache Spark主页或快速入门指南,并尝试一下。