NLP 与 Google Cloud 自然语言 API
已发表: 2022-03-11自然语言处理(NLP)是机器学习和语言学的结合,已经成为人工智能领域研究最多的学科之一。 在过去的几年里,已经达到了许多新的里程碑,最新的是 OpenAI 的 GPT-2 模型,它能够从简短的输入中生成关于任何主题的现实和连贯的文章。
这种兴趣是由近年来推向市场的许多商业应用驱动的。 我们与使用 NLP 转录音频数据并理解我们的问题和命令的家庭助理交谈。 越来越多的公司将很大一部分客户沟通工作转移到自动化聊天机器人上。 在线市场使用它来识别虚假评论,媒体公司依靠 NLP 撰写新闻文章,招聘公司将简历与职位匹配,社交媒体巨头自动过滤仇恨内容,法律公司使用 NLP 分析合同。
过去,为此类任务训练和部署机器学习模型一直是一个复杂的过程,需要专家团队和昂贵的基础设施。 但对此类应用程序的高需求推动了大型供应商开发与 NLP 相关的服务,从而大大降低了工作量和基础设施成本。 云服务的平均成本多年来一直在下降,预计这一趋势将持续下去。
我将在本文中介绍的产品是 Google Cloud Services 的一部分,被称为“Google Natural Language API”和“Google AutoML Natural Language”。
谷歌自然语言 API
Google Natural Language API 是一组功能强大的 NLP 模型的易于使用的接口,这些模型已由 Google 预先训练以执行各种任务。 由于这些模型已经在巨大的文档语料库上进行了训练,因此只要它们用于不使用非常特殊语言的数据集,它们的性能通常会非常好。
通过 API 使用这些预训练模型的最大优势是不需要训练数据集。 API 允许用户立即开始进行预测,这在标记数据很少可用的情况下非常有价值。
自然语言 API 包含五种不同的服务:
- 语法分析
- 情绪分析
- 实体分析
- 实体情绪分析
- 文本分类
语法分析
对于给定的文本,Google 的语法分析将返回所有单词的细分,并为每个标记提供一组丰富的语言信息。 信息可以分为两部分:
词性:这部分包含有关每个标记的形态的信息。 对于每个单词,都会返回一个细粒度的分析,其中包含其类型(名词、动词等)、性别、语法大小写、时态、语法情绪、语法声音等等。
例如,对于输入句子“一台计算机曾经在国际象棋上打败了我,但在跆拳道上却比不上我”。 (Emo Philips) 词性分析是:
一种 | 标签: DET |
'计算机' | 标签:名词编号:单数 |
'一次' | 标签: ADV |
'打' | 标签:动词情绪:指示时态:过去 |
'我' | 标签:PRON 案例:宾语编号:单人:FIRST |
在 | 标签: ADP |
'棋' | 标签:名词编号:单数 |
',' | 标签: PUNCT |
'但' | 标签: CONJ |
'它' | 标签:PRON 案例:主格 性别:NEUTER 编号:SINGULAR 人:THIRD |
'曾是' | 标签:动词情绪:指示数:单人:第三时态:过去 |
'不' | 标签: DET |
'匹配' | 标签:名词编号:单数 |
'为了' | 标签: ADP |
'踢' | 标签:名词编号:单数 |
'拳击' | 标签:名词编号:单数 |
'。' | 标签: PUNCT |
依赖树:返回的第二部分称为依赖树,它描述了每个句子的句法结构。 下面的肯尼迪名言图表显示了这样的依赖树。 对于每个单词,箭头表示它修改了哪些单词。
常用的 Python 库 nltk 和 spaCy 包含类似的功能。 所有三个选项的分析质量始终很高,但 Google Natural Language API 更易于使用。 上面的分析可以用很少的代码行来获得(参见下面的例子)。 然而,虽然 spaCy 和 nltk 是开源的,因此是免费的,但在一定数量的免费请求之后,使用 Google Natural Language API 需要付费(请参阅费用部分)。
除英语外,句法分析还支持十种其他语言:中文(简体)、中文(繁体)、法语、德语、意大利语、日语、韩语、葡萄牙语、俄语和西班牙语。
情绪分析
语法分析服务主要用于在管道的早期创建特征,然后将这些特征输入到机器学习模型中。 相反,情绪分析服务可以开箱即用。
Google 的情绪分析将在提供的文本中提供普遍的情绪意见。 API 返回两个值:“分数”描述文本的情感倾向,从 -1(负面)到 +1(正面),0 表示中性。
“大小”衡量情绪的强度。
让我们看一些例子:
输入句子 | 情绪结果 | 解释 |
去伦敦的火车四点出发 | 得分:0.0 幅度:0.0 | 完全中性的陈述,完全不包含任何情绪。 |
这篇博文不错。 | 分数:0.7 量级:0.7 | 一种积极的情绪,但表达得不是很强烈。 |
这篇博文不错。 这很有帮助。 作者很了不起。 | 得分:0.7 量级:2.3 | 相同的情绪,但表达得更强烈。 |
这篇博文非常好。 这个作者通常是一个糟糕的作家,但在这里他很幸运。 | 得分:0.0 幅度:1.6 | 幅度向我们表明,本文中表达了情绪,但情绪表明它们是混合的,没有明确的正面或负面。 |
谷歌的情绪分析模型是在一个非常大的数据集上训练的。 不幸的是,没有关于其详细结构的信息。 我对它的真实性能很好奇,所以我在大型电影评论数据集的一部分上对其进行了测试,该数据集由斯坦福大学的科学家于 2011 年创建。
我从测试集中随机选择了 500 条正面和 500 条负面电影评论,并将预测的情绪与实际评论标签进行了比较。 混淆矩阵如下所示:
积极情绪 | 负面情绪 | |
好评 | 470 | 30 |
差评 | 29 | 471 |
如表所示,该模型在大约 94% 的情况下对好电影和坏电影评论都是正确的。 对于没有对给定问题进行任何微调的开箱即用解决方案,这并不是一个糟糕的性能。
注意:情感分析可用于与语法分析相同的语言,但俄语除外。
实体分析
实体分析是从给定文本中检测已知实体(如公众人物或地标)的过程。 实体检测对于各种分类和主题建模任务非常有帮助。
Google Natural Language API 提供有关每个检测到的实体的一些基本信息,甚至提供指向相应 Wikipedia 文章(如果存在)的链接。 此外,计算显着性分数。 实体的此分数提供了有关该实体对整个文档文本的重要性或中心性的信息。 接近 0 的分数不太显着,而接近 1.0 的分数非常显着。
当我们使用这个例句向 API 发送请求时: “Robert DeNiro 在 2011 年 12 月的圣诞节前夕在好莱坞与 Martin Scorsese 进行了交谈。” 我们收到以下结果:
检测到的实体 | 附加信息 |
罗伯特·德尼罗 | 类型:人物显着性:0.5869118 wikipedia_url:https://en.wikipedia.org/wiki/Robert_De_Niro |
好莱坞 | 类型:位置显着性:0.17918482 wikipedia_url:https://en.wikipedia.org/wiki/Hollywood |
马丁斯科塞斯 | 类型:位置显着性:0.17712952 wikipedia_url:https://en.wikipedia.org/wiki/Martin_Scorsese |
平安夜 | 类型:人物显着性:0.056773853 wikipedia_url:https://en.wikipedia.org/wiki/Christmas |
2011 年 12 月 | 类型:日期年份:2011 月份:12 显着性:0.0 wikipedia_url:- |
2011 | 类型:NUMBER 显着性:0.0 wikipedia_url:- |
如您所见,所有实体都被正确识别和分类,除了 2011 出现了两次。 除了示例输出中的字段之外,实体分析 API 还将检测组织、艺术品、消费品、电话号码、地址和价格。
实体情绪分析
如果有用于实体检测和情感分析的模型,自然会更进一步,将它们结合起来检测文本中对不同实体的普遍情感。
情感分析 API 查找文档中的所有情感显示并聚合它们,而实体情感分析尝试查找文档的不同部分与已识别实体之间的依赖关系,然后将这些文本段中的情感归因于相应的实体。
例如自以为是的文字: “作者是一个可怕的作家。 另一方面,读者非常聪明。” 导致结果:
实体 | 情绪 |
作者 | 显着性:0.8773350715637207 情绪:幅度:1.899999976158142 得分:-0.8999999761581421 |
读者 | 显着性:0.08653714507818222 情绪:幅度:0.8999999761581421 得分:0.8999999761581421 |
到目前为止,实体情绪分析仅适用于英语、日语和西班牙语。
文本分类
最后,Google 自然语言 API 带有一个即插即用的文本分类模型。
该模型经过训练,可以将输入文档分类为一大组类别。 类别是结构化的层次结构,例如“爱好与休闲”类别有几个子类别,其中之一是“爱好与休闲/户外” ,它本身具有“爱好与休闲/户外/钓鱼”等子类别。

这是尼康相机广告中的示例文字:
“D3500 的大型 24.2 MP DX 格式传感器可以捕捉到细节丰富的照片和全高清电影——即使在光线不足的情况下也能拍摄。 结合尼克尔镜头的渲染能力,您可以开始创作具有平滑背景模糊的艺术肖像。 轻松。”
Google API 返回结果:
类别 | 信心 |
艺术与娱乐/视觉艺术与设计/摄影与数字艺术 | 0.95 |
爱好与休闲 | 0.94 |
计算机与电子产品/消费类电子产品/相机与摄影设备 | 0.85 |
所有这三个类别都是有意义的,即使我们直观地将第三个条目排名高于第二个条目。 但是,必须考虑到这个输入段只是完整相机广告文档的一小部分,并且分类模型的性能随着文本长度的增加而提高。
经过大量的文档尝试后,我发现分类模型的结果在大多数情况下都是有意义的。 尽管如此,与来自 Google Natural Language API 的所有其他模型一样,分类器作为黑盒解决方案提供,API 用户无法修改甚至微调。 特别是在文本分类的情况下,绝大多数公司都会有自己的文本类别,不同于谷歌模型的类别,因此,自然语言 API 文本分类服务可能不适用于大多数用户。
分类模型的另一个限制是它只适用于英语文本。
如何使用自然语言 API
Google 自然语言 API 的主要优势在于其易用性。 不需要机器学习技能,几乎不需要编码技能。 在 Google Cloud 网站上,您可以找到用于调用多种语言的 API 的代码片段。
例如,调用情感分析 API 的 Python 代码如下:
from google.cloud import language_v1 from google.cloud.language_v1 import enums import six def sample_analyze_sentiment(content): client = language_v1.LanguageServiceClient() if isinstance(content, six.binary_type): content = content.decode('utf-8') type_ = enums.Document.Type.PLAIN_TEXT document = {'type': type_, 'content': content} response = client.analyze_sentiment(document) sentiment = response.document_sentiment print('Score: {}'.format(sentiment.score)) print('Magnitude: {}'.format(sentiment.magnitude))
其他 API 功能以类似的方式调用,只需将client.analyze_sentiment
更改为适当的函数即可。
谷歌自然语言 API 的总成本
Google 按请求向其用户收取自然语言 API 的所有服务的费用。 这样做的好处是任何部署服务器都没有固定成本。 缺点是它对于非常大的数据集可能会变得昂贵。
此表显示价格(每 1,000 个请求)取决于每月请求的数量:
如果文档的字符数超过 1,000 个,则将其计为多次请求。 例如,如果您要分析 10,000 个文档(每个文档有 1,500 个字符)的情绪,您需要支付 20,000 个请求的费用。 由于前 5,000 个是免费的,因此总成本将达到 15 美元。 分析一百万份相同大小的文档将花费 1,995 美元。
方便,但不灵活
Google Natural Language API 是一个非常方便的快速、开箱即用解决方案的选项。 需要很少的技术知识,也不需要了解底层的机器学习模型。
主要缺点是其不灵活和无法访问模型。 模型无法针对特定任务或数据集进行调整。
在现实环境中,大多数任务可能需要比标准化自然语言 API 函数提供的更量身定制的解决方案。
对于这种场景,Google AutoML Natural Language 更适合。
谷歌 AutoML 自然语言
如果 Natural Language API 对于您的业务目的不够灵活,那么 AutoML Natural Language 可能是正确的服务。 AutoML 是一种新的谷歌云服务(仍处于测试阶段),使用户能够创建定制的机器学习模型。 与 Natural Language API 相比,AutoML 模型将根据用户数据进行训练,因此适合特定任务。
当自然语言 API 中可用的预定义类别过于通用或不适用于您的特定用例或知识领域时,用于对内容进行分类的自定义机器学习模型非常有用。
AutoML 服务需要用户付出更多努力,主要是因为您必须提供数据集来训练模型。 但是,模型的训练和评估是完全自动化的,不需要机器学习知识。 使用 Google Cloud 控制台,无需编写任何代码即可完成整个过程。 当然,如果您想自动执行这些步骤,则支持所有常见的编程语言。
Google AutoML 自然语言可以做什么?
AutoML 服务涵盖三个用例。 所有这些用例目前仅支持英语。
1. AutoML 文本分类
虽然 Natural Language API 的文本分类器是预训练的,因此具有一组固定的文本类别,但 AutoML 文本分类使用您在训练数据集中提供的类别构建定制的机器学习模型。
2. AutoML 情感分析
正如我们所见,Natural Language API 的情感分析在电影评论等一般用例中效果很好。 因为情感模型是在非常通用的语料库上训练的,所以对于使用大量特定领域语言的文档,性能可能会下降。 在这些情况下,AutoML 情感分析允许您训练针对您的域定制的情感模型。
3. AutoML 实体提取
在许多业务环境中,存在自然语言 API 无法识别的特定领域实体(法律合同、医疗文档)。 如果您有标记实体的数据集,则可以使用 AutoML 训练自定义模型实体提取器。 如果数据集足够大,经过训练的实体提取模型也将能够检测到以前看不见的实体。
如何使用 AutoML 自然语言
使用三个 AutoML 是一个四步过程,并且对于所有三种方法都非常相似:
数据集准备
数据集必须采用特定格式(CSV 或 JSON),并且需要存储在存储桶中。 对于分类和情感模型,数据集仅包含两列,文本和标签。 对于实体提取模型,数据集需要文本以及文本中所有实体的位置。模型训练
模型训练是完全自动的。 如果没有另外给出说明,那么 AutoML 会自动将训练集拆分为训练集、测试集和验证集。 这种分割也可以由用户决定,但这是影响模型训练的唯一方法。 其余的培训以黑盒方式完全自动化。评估
训练完成后,AutoML 将显示精度和召回分数以及混淆矩阵。 不幸的是,完全没有关于模型本身的信息,因此很难确定模型性能不佳的原因。预言
一旦您对模型的性能感到满意,只需单击几下即可方便地部署模型。 部署过程只需几分钟。
AutoML 模型性能
训练过程相当缓慢,可能是因为底层模型非常大。 我训练了一个包含 15,000 个样本和 10 个类别的小型测试分类任务,训练耗时数小时。 一个具有更大数据集的真实示例花了我几天时间。
虽然谷歌没有公布所用模型的任何细节,但我猜测谷歌的 BERT 模型用于对每项任务进行小幅调整。 微调像 BERT 这样的大型模型是一个计算成本很高的过程,尤其是在执行大量交叉验证时。
我在一个真实示例中针对我自己开发的基于 BERT 的模型测试了 AutoML 分类模型。 令人惊讶的是,当使用相同的数据进行训练时,AutoML 模型的表现明显比我自己的模型差。 AutoML 达到了 84% 的准确率,而我的模型达到了 89%。
这意味着虽然使用 AutoML 可能非常方便,但对于性能关键任务来说,花时间自己开发模型是有意义的。
AutoML 定价
每 1,000 条文本记录 5 美元的预测 AutoML 定价比自然语言 API 贵得多。 此外,对于模型训练,AutoML 每小时收费 3 美元。 虽然一开始这可以忽略不计,但对于需要频繁再培训的用例,这可能会增加很多,尤其是因为培训似乎很慢。
让我们使用与自然语言 API 相同的示例:
您想分析 10,000 个文档的情绪,每个文档有 1,500 个字符,因此您需要支付 20,000 个请求的费用。 假设训练模型需要 20 个小时,花费 48 美元。 预测不会花费您任何费用,因为前 30,000 个请求是免费的。 对于像这样的小型数据集,AutoML 非常经济。
但是,如果您的数据集更大,并且您需要预测一百万个相同大小的情绪,则将花费 9,850 美元,这相当昂贵。 对于像这样的大型数据集,开发自己的模型而不使用 AutoML 自行部署是有意义的。
Google 自然语言 API 与 AutoML 自然语言
Google AutoML Natural Language 比 Natural Language API 强大得多,因为它允许用户训练为其特定数据集和域定制的模型。
它易于使用,不需要机器学习知识。 两个缺点是更高的成本和提供高质量数据集的必要性,该数据集需要训练表现良好的模型。
AutoML beta 目前仅支持三个 NLP 任务(分类、情感分析、实体提取)并且仅支持英语文档。 当这项服务完全发布时,我希望随着时间的推移会添加其他语言和 NLP 任务。