作者 David Kyle
作为自然语言处理 (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(推理计数)的增加来跟踪进度。
已重建索引的文档现在包含了推理结果。例如,其中一个分析文档如下面所示:
{ "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 中的一项重要新功能,它为我们展开了一幅令人兴奋的路线图。目前阿里云检索分析服务Elasticsearch版已经支持8.5版本,您可以开通产品立即尝试以上示例内容,数据节点规格建议4C8G以上。详情了解:https://www.aliyun.com/product/bigdata/elasticsearch
- 配套实验
通过简易快速的阿里云相关组件和开源模型部署,通过1小时的动手实操,搭建基于Elasticsearch向量检索的以文搜图的搜索服务原型。
- 活动推荐
《Elasticsearch 训练营:搜文本搜位置搜图片,1小时玩转Elasticsearch》:
由浅入深带您上手实操【基础检索】,搭建高频业务场景应用;进阶体验【向量检索】,构建基于算法模型的向量检索应用,晋升Elasticsearch搜索实战派,超多参营好礼等你拿~
Reference:
Elasticsearch 技术社区钉钉交流群