ESRE系列(三):如何部署自然语言处理 (NLP):情感分析示例

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 本文将带您完成一个示例,让您使用情感分析 NLP 模型来评估评论(文本)字段包含的是积极还是消极情感。通过使用可公开获得的模型,我们将会向您展示如何将此模型部署到 Elasticsearch 中,以及如何在采集管道中使用此模型来将客户评价分类为积极或消极。

作者 David Kyle


1691654103792-6b335d47-f63e-4d4c-88a6-61c07ca09b41.png

作为自然语言处理 (NLP) 系列博文中的一部分,本文将带您完成一个示例,让您使用情感分析 NLP 模型来评估评论(文本)字段包含的是积极还是消极情感。通过使用可公开获得的模型,我们将会向您展示如何将此模型部署到 Elasticsearch 中,以及如何在采集管道中使用此模型来将客户评价分类为积极或消极。


情感分析是二元分类的一种,需要预测字段是两个值中的哪一个。预测时通常会有一个介于 0 和 1 之间的可能性分数,分数越接近 1,表示所预测结果的置信度越高。这种 NLP 分析很实用,可以应用到很多数据集(例如产品评价或客户反馈)中。


我们这里想分类的客户评价来自2015 Yelp Dataset Challenge(2015 年 Yelp 数据集挑战)中的一个公开数据集。这个数据集采集自 Yelp Review 网站(国外知名点评网站),是测试情感分析的绝佳资源。在这个示例中,我们将会使用常见情感分析 NLP 模型来评估 Yelp 评价数据集中的一个样本,并利用此模型将评论标注为积极或消极。我们希望看到积极和消极评价的百分比。



向 Elasticsearch 部署情感分析模型

第一步是安装来自 Hugging Face 的模型,需要用到我们在 NER 示例中所构建的 Eland Docker 代理:

docker run -it --rm elastic/eland \
    eland_import_hub_model \
      --url $ELASTICSEARCH_URL \
      --hub-model-id distilbert-base-uncased-finetuned-sst-2-english \
      --task-type text_classification \
      --start


这一次,将--task-type设为text_classification,并将--start选项传递给 Eland 脚本,这样模型就会自动部署,而无需在 Model Management UI 中启动它。


部署完毕后,在 Kibana 控制台中尝试完成这些示例:

POST _ml/trained_models/distilbert-base-uncased-finetuned-sst-2-english/deployment/_infer
{
  "docs": [
    {
      "text_field": "The movie was awesome!"
    }
  ]
}


您应该会看到下面的结果:

{
  "predicted_value" : "POSITIVE",
  "prediction_probability" : 0.9998643924765398
}


您也可以尝试这个示例:

POST _ml/trained_models/distilbert-base-uncased-finetuned-sst-2-english/deployment/_infer
{
  "docs": [
    {
      "text_field": "The cat was sick on the bed"
    }
  ]
}


您应该会看到下面的结果:

{
  "predicted_value" : "NEGATIVE",
  "prediction_probability" : 0.9992468477843378
}



分析 Yelp 评价

如在简介部分所提到的,我们将会使用 Yelp 评价的一个子集(可在 Hugging Face 上获得),该子集中的内容已被手动标注了情感。这能够让我们将结果与已标注的索引进行对比。我们将会使用Kibana 的文件上传功能来上传此数据集的一个样本,以便使用推理处理器来进行处理。


在 Kibana 控制台中,我们可以创建一个采集管道(操作方法请见上一篇博文《如何部署自然语言处理 (NLP):命名实体识别 (NER) 示例》);因为这次是用于情感分析,故而称之为 sentiment。评价位于名为 review 的字段中。与之前一样,我们将会定义一个 field_map,以将 review 映射到模型所期望的字段中。来自于 NER 管道的同一 on_failure 处理程序已设置完毕:

PUT _ingest/pipeline/sentiment
{
  "processors": [
    {
      "inference": {
        "model_id": "distilbert-base-uncased-finetuned-sst-2-english",
        "field_map": {
          "review": "text_field"
        }
      }
    }
  ],
  "on_failure": [
    {
      "set": {
        "description": "Index document to 'failed-<index>'",
        "field": "_index",
        "value": "failed-{{{_index}}}"
      }
    },
    {
      "set": {
        "description": "Set error message",
        "field": "ingest.failure",
        "value": "{{_ingest.on_failure_message}}"
      }
    }
  ]
}


这些评价文档存储在 Elasticsearch 索引yelp-reviews中。使用重新索引 API 来推动评价数据流经情感分析管道。鉴于重建索引需要一些时间来处理所有文档并对它们进行推断,因此,可以通过调用带有wait_for_completion=false标志的 API 在后台重建索引。使用任务管理 API来检查进度。

POST _reindex?wait_for_completion=false
{
  "source": {
    "index": "yelp-reviews"
  },
  "dest": {
    "index": "yelp-reviews-with-sentiment",
    "pipeline": "sentiment"
  }
}


上述命令会返回一个任务 ID。我们可以通过以下方式监控任务的进度:

The above returns a task id. We can monitor progress of the task with:


或者,也可以通过观察模型统计 UI 中Inference count(推理计数)的增加来跟踪进度。

1691654111461-5face7ec-b126-4b02-9d95-191d2310cea8.png


已重建索引的文档现在包含了推理结果。例如,其中一个分析文档如下面所示:

{
    "review": "The food is good. Unfortunately the service is very hit or miss. The main issue seems to be with the kitchen, the waiters and waitresses are often very apologetic for the long waits and it's pretty obvious that some of them avoid the tables after taking the initial order to avoid hearing complaints.",
    "ml": {
        "inference": {
            "predicted_value": "NEGATIVE",
            "prediction_probability": 0.9985209630712552,
            "model_id": "distilbert-base-uncased-finetuned-sst-2-english"
        }
    },
    "timestamp": "2022-02-02T15:10:38.195345345Z"
}


预测值是“消极”,鉴于服务质量差,这个结果很合理。



对消极评价的数量进行可视化

多大比例的评价是消极的?与手动标注的情感相比,我们的模型表现如何?我们可以构建一个简单的可视化来跟踪来自模型推断和手动标注的积极和消极评价。通过基于 ml.inference.predicted_value field 创建可视化,报告两种方法的对比情况,可以看到有大约 44% 的评价被视为是积极的,其中被情感分析模型错误标注的比例为 4.59%。

1691654111852-01a35099-7dcc-4153-88dd-bcff67c6e292.png



立即试用

NLP 是 Elastic Stack 8.0 中的一项重要新功能,它为我们展开了一幅令人兴奋的路线图。目前阿里云检索分析服务Elasticsearch版已经支持8.5版本,您可以开通产品立即尝试以上示例内容,数据节点规格建议4C8G以上。详情了解:https://www.aliyun.com/product/bigdata/elasticsearch


  • 配套实验

基于 Elasticsearch 向量检索的以文搜图

通过简易快速的阿里云相关组件和开源模型部署,通过1小时的动手实操,搭建基于Elasticsearch向量检索的以文搜图的搜索服务原型。


  • 活动推荐

《Elasticsearch 训练营:搜文本搜位置搜图片,1小时玩转Elasticsearch》

由浅入深带您上手实操【基础检索】,搭建高频业务场景应用;进阶体验【向量检索】,构建基于算法模型的向量检索应用,晋升Elasticsearch搜索实战派,超多参营好礼等你拿~

新建项目 (58).png


Reference



Elasticsearch 技术社区钉钉交流群

相关文章
|
2月前
|
自然语言处理 算法 Python
自然语言处理(NLP)在文本分析中的应用:从「被动收集」到「主动分析」
【10月更文挑战第9天】自然语言处理(NLP)在文本分析中的应用:从「被动收集」到「主动分析」
50 4
|
2月前
|
机器学习/深度学习 存储 人工智能
大数据中自然语言处理 (NLP)
【10月更文挑战第19天】
156 60
|
1月前
|
机器学习/深度学习 自然语言处理 PyTorch
从零开始构建nlp情感分析模型!
本教程介绍了如何使用PyTorch和Hugging Face的Transformers库构建一个情感分析模型。主要内容包括导入所需库、读取训练数据集、加载预训练的BERT模型和分词器、定义情感数据集类、划分训练集和验证集、创建数据加载器、设置训练参数、训练模型、评估模型性能以及定义和测试预测函数。通过这些步骤,可以实现一个简单而有效的情感分析模型。
102 2
|
1月前
|
人工智能 自然语言处理 语音技术
利用Python进行自然语言处理(NLP)
利用Python进行自然语言处理(NLP)
41 1
|
2月前
|
人工智能 自然语言处理 语音技术
利用Python进行自然语言处理(NLP)
利用Python进行自然语言处理(NLP)
29 3
|
27天前
|
机器学习/深度学习 自然语言处理 算法
自然语言处理中的情感分析技术
自然语言处理中的情感分析技术
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术在自然语言处理中的应用与挑战
【10月更文挑战第3天】本文将探讨AI技术在自然语言处理(NLP)领域的应用及其面临的挑战。我们将分析NLP的基本原理,介绍AI技术如何推动NLP的发展,并讨论当前的挑战和未来的趋势。通过本文,读者将了解AI技术在NLP中的重要性,以及如何利用这些技术解决实际问题。
|
3月前
|
机器学习/深度学习 数据采集 自然语言处理
深度学习在自然语言处理中的应用与挑战
本文探讨了深度学习技术在自然语言处理(NLP)领域的应用,包括机器翻译、情感分析和文本生成等方面。同时,讨论了数据质量、模型复杂性和伦理问题等挑战,并提出了未来的研究方向和解决方案。通过综合分析,本文旨在为NLP领域的研究人员和从业者提供有价值的参考。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
探索AI在自然语言处理中的创新应用
【10月更文挑战第7天】本文将深入探讨人工智能在自然语言处理领域的最新进展,揭示AI技术如何改变我们与机器的互动方式,并展示通过实际代码示例实现的具体应用。
42 1
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术在自然语言处理中的应用
随着人工智能技术的不断发展,自然语言处理(NLP)已经成为了一个重要的应用领域。本文将介绍一些常见的NLP任务和算法,并通过代码示例来展示如何实现这些任务。我们将讨论文本分类、情感分析、命名实体识别等常见任务,并使用Python和相关库来实现这些任务。最后,我们将探讨NLP在未来的发展趋势和挑战。