如何部署 NLP:情感分析示例

illustration-industries-retail.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 控制台中,我们可以创建一个采集管道(操作方法请见上一篇博文);因为这次是用于情感分析,故而称之为 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(推理计数)的增加来跟踪进度。

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

{
    "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%。

立即试用

NLP 是 Elastic Stack 8.0 中的一项重要新功能,它为我们展开了一幅令人兴奋的路线图。在 Elastic Cloud 中构建集群,即可发现新功能,紧跟最新发展动态。请立即注册以开始 14 天免费试用,并尝试一下这篇博文中的示例。

如果您想进一步了解 NLP,请阅读以下文章: