Transformers 自然语言处理(四)(2)https://developer.aliyun.com/article/1514227
使用情感分析预测客户行为
此部分将在几个 Hugging Face transformer 模型上运行情感分析任务,以查看哪些模型产生了最佳结果,哪些模型我们简单地喜欢。
我们将使用 Hugging Face 的 DistilBERT 模型开始此过程。
使用 DistilBERT 进行情感分析
让我们使用 DistilBERT 运行情感分析任务,并看看我们如何使用结果来预测客户行为。
打开 SentimentAnalysis.ipynb
和Transformers安装和导入单元格:
!pip install -q transformers from transformers import pipeline
我们现在将创建一个名为 classify
的函数,它将使用我们发送给它的序列运行模型:
def classify(sequence,M): #DistilBertForSequenceClassification(default model) nlp_cls = pipeline('sentiment-analysis') if M==1: print(nlp_cls.model.config) return nlp_cls(sequence)
请注意,如果您将 M=1
发送给该函数,它将显示我们正在使用的 DistilBERT 6 层、12 个头模型的配置:
DistilBertConfig { "activation": "gelu", "architectures": [ "DistilBertForSequenceClassification" ], "attention_dropout": 0.1, "dim": 768, "dropout": 0.1, "finetuning_task": "sst-2", "hidden_dim": 3072, "id2label": { "0": "NEGATIVE", "1": "POSITIVE" }, "initializer_range": 0.02, "label2id": { "NEGATIVE": 0, "POSITIVE": 1 }, "max_position_embeddings": 512, "model_type": "distilbert", "n_heads": 12, "n_layers": 6, "output_past": true, "pad_token_id": 0, "qa_dropout": 0.1, "seq_classif_dropout": 0.2, "sinusoidal_pos_embds": false, "tie_weights_": true, "vocab_size": 30522 }
此 DistilBERT 模型的具体参数是标签定义。
现在我们创建一个序列列表(您可以添加更多),我们可以将其发送给 classify
函数:
seq=3 if seq==1: sequence="The battery on my Model9X phone doesn't last more than 6 hours and I'm unhappy about that." if seq==2: sequence="The battery on my Model9X phone doesn't last more than 6 hours and I'm unhappy about that. I was really mad! I bought a Moel10x and things seem to be better. I'm super satisfied now." if seq==3: sequence="The customer was very unhappy" if seq==4: sequence="The customer was very satisfied" print(sequence) M=0 #display model cofiguration=1, default=0 CS=classify(sequence,M) print(CS)
在这种情况下,seq=3
被激活以模拟我们需要考虑的客户问题。 输出为负面,这正是我们要寻找的示例:
[{'label': 'NEGATIVE', 'score': 0.9997098445892334}]
我们可以从这个结果中得出几个结论,以预测客户行为,编写一个函数来:
- 将预测存储在客户管理数据库中。
- 统计客户在某段时间内(周、月、年)投诉服务或产品的次数。 经常投诉的客户可能会转向竞争对手以获得更好的产品或服务。
- 检测在负面反馈信息中不断出现的产品和服务。 产品或服务可能存在缺陷,需要质量控制和改进。
您可以花几分钟运行其他序列或创建一些序列来探索 DistilBERT 模型。
我们现在将探索其他 Hugging Face transformers。
使用 Hugging Face 模型列表进行情感分析
本节将探索 Hugging Face 的Transformers模型列表,并输入一些样本以评估它们的结果。想法是测试多个模型,而不仅仅是一个,并查看哪个模型最适合您的给定项目需求。
我们将运行 Hugging Face 模型:huggingface.co/models
。
对于我们使用的每个模型,您可以在 Hugging Face 提供的文档中找到模型的描述:huggingface.co/transformers/
。
我们将测试几个模型。如果您实现它们,您可能会发现它们需要微调甚至是对您希望执行的 NLP 任务进行预训练。在这种情况下,对于 Hugging Face Transformers,您可以执行以下操作:
- 对于微调,您可以参考第三章,对 BERT 模型进行微调
- 对于预训练,您可以参考第四章,从头开始预训练 RoBERTa 模型
让我们首先浏览 Hugging Face 模型列表:huggingface.co/models
。
然后,在任务窗格中选择文本分类:
图 12.4:选择文本分类模型
将显示一系列用于文本分类的Transformers模型:
图 12.5:Hugging Face 预训练的文本分类模型
默认排序模式为排序:最多下载。
现在我们将搜索一些有趣的Transformers模型,我们可以在线测试。
我们将从 DistilBERT 开始。
DistilBERT 用于 SST
distilbert-base-uncased-finetuned-sst-2-english
模型在 SST 上进行了微调。
让我们试试一个需要对组成原理有良好理解的例子:
"尽管客户似乎不满意,但事实上她是满意的,只是当时在想其他事情,这给了一个错误的印象。"
这个句子对于Transformers来说很难分析,需要逻辑规则训练。
输出是一个假阴性:
图 12.6:复杂序列分类任务的输出
假阴性并不意味着模型工作不正确。我们可以选择另一个模型。然而,这可能意味着我们必须下载并训练它更长时间更好!
在撰写本书时,类似 BERT 的模型在 GLUE 和 SuperGLUE 排行榜上排名靠前。排名将不断变化,但Transformers的基本概念不会改变。
现在我们将尝试一个困难但不那么复杂的示例。
这个例子是真实项目的一个关键教训。当我们尝试估计客户投诉的次数时,我们将得到假阴性和假阳性。因此,对于未来几年,定期的人工干预仍将是必要的。
让我们试试一个 MiniLM 模型。
MiniLM-L12-H384-uncased
Microsoft/MiniLM-L12-H384-uncased 优化了老师的最后一个自注意力层的大小,以及对 BERT 模型的其他调整,以获得更好的性能。它有 12 层,12 个头部和 3300 万参数,并且比 BERT-base 快 2.7 倍。
让我们测试它对组成原则的理解能力:
尽管客户似乎不高兴,但事实上她很满意,只是在那时在想其他事情,这造成了误解。
输出很有趣,因为它产生了一个谨慎的分数(未决定):
图 12.7: 复杂句子情感分析
我们可以看到这个输出不是决定性的,因为它在0.5
左右。应该是积极的。
让我们尝试一个涉及含意的模型。
RoBERTa-large-mnli
一个多题材自然语言推理(MultiNLI)任务,cims.nyu.edu/~sbowman/multinli/
,可以帮助解决复杂句子的解释,当我们试图确定客户的意思时。推理任务必须确定一个序列是否导致下一个序列。
我们需要对输入进行格式化,并使用序列分割标记分割序列:
尽管客户似乎不高兴 事实上她很满意,只是当时在想其他事情,这造成了误解
结果很有趣,尽管保持中性:
图 12.8: 针对稍微积极的句子获得的中性结果
但是,这个结果没有错误。第二个序列不是从第一个序列推断出的。结果非常正确。
让我们以“积极情感”多语言 BERT-base 模型结束我们的实验。
BERT-base 多语言模型
让我们在一个超级酷的 BERT-base 模型上运行我们的最终实验:nlptown/bert-base-multilingual-uncased-sentiment
。
它设计得非常好。
让我们用友好和积极的英文句子来运行它:
图 12.9: 英文情感分析
让我们用法语尝试一下,“Ce modèle est super bien!”(“这个模型超级好!”,意思是“酷”):
图 12.10: 法语情感分析
Hugging Face 上这个模型的路径是nlptown/bert-base-multilingual-uncased-sentiment
。您可以在 Hugging Face 网站的搜索表单中找到它。其当前链接为huggingface.co/nlptown/bert-base-multilingual-uncased-sentiment?text=Ce+mod%C3%A8le+est+super+bien%21
。
您可以通过以下初始化代码在您的网站上实现它:
from transformers import AutoTokenizer, AutoModelForSequenceClassification tokenizer = AutoTokenizer.from_pretrained("nlptown/bert-base-multilingual-uncased-sentiment") model = AutoModelForSequenceClassification.from_pretrained("nlptown/bert-base-multilingual-uncased-sentiment")
这将需要一些时间和耐心,但结果可能会非常好!
您可以在您的网站上实施此转换器,以平均全球客户的满意度!您还可以将其用作持续反馈,以改善您的客户服务并预测客户的反应。
在我们离开之前,我们将看看 GPT-3 如何执行情感分析。
使用 GPT-3 进行情感分析
您需要一个 OpenAI 账户来运行本节的示例。教育界面不需要 API、开发或培训。您可以简单地输入一些推特,然后请求进行情感分析:
推特: 我觉得这部电影不那么令人兴奋,但不知怎么的我真的很享受看它!
情感: 积极
推特: 我以前从未吃过这样的辛辣食物,但觉得它超级好吃!
情感: 积极
输出是令人满意的。
现在我们将向 GPT-3 引擎提交一个困难的序列:
推特: 因为我们不得不考虑所有参数,所以很难找到我们在生活中真正喜欢的东西。
情感: 积极
输出是错误的!这个情感根本不是积极的。这句话显示了生活的困难。然而,“享受”这个词为 GPT-3 引入了偏见。
如果我们从序列中去除“享受”并用动词 是
替换,输出将是负面的:
推特: 因为我们不得不考虑所有参数,所以很难找到我们在生活中真正喜欢的东西。
情感: 消极
输出也是错误的!并不是因为生活难以理解,我们就可以得出这句话是负面的结论。正确的输出应该是中性的。然后我们可以要求 GPT-3 在流水线中执行另一个任务,例如解释为什么它很困难。
作为一个没有任务的用户运行 NLP 任务显示了工业 4.0(I4.0)的发展方向:更少的人为干预,更多的自动功能。 然而,我们知道某些情况下我们的新技能是必需的,比如在转换器产生意外结果时设计预处理功能。人类仍然是有用的!
在 第七章,GPT-3 引擎崛起的超人类转换器 的 运行 OpenAI GPT-3 任务 部分中描述了一种具有现成代码的推特分类示例。如果您愿意,您可以在该代码中实现本节的示例。
现在让我们看看我们如何仍然证明自己是有价值的资产。
在我们离开之前进行一些务实的 I4.0 思考
Hugging Face transformers 进行情感分析时包含了一句被判定为“中性”的句子。
但那是真的吗?
将这句话标记为“中性”让我感到不安。我很好奇 OpenAI GPT-3 能否做得更好。毕竟,GPT-3 是一个理论上可以做许多其未经过训练的事情的基础模型。
我再次检查了这句话:
虽然客户看起来不高兴,但实际上她却很满意,只是在那时在想其他事情,这给了一个错误的印象。
当我仔细阅读句子时,我能看到顾客是 she
。当我更深入地观察时,我理解到 she
实际上是 satisfied
。我决定不是盲目地尝试各种模型,直到找到一个有效的为止。一直尝试一个接一个的模型是没有生产力的。
我需要通过逻辑和实验来找到问题的根源。我不想依赖自动找到原因的算法。有时候我们需要使用我们的神经元!
问题可能是很难为机器识别 she
作为 customer
吗?就像我们在第十章中所做的那样,基于 BERT 的语义角色标注,让我们问问 SRL BERT。
Transformers 自然语言处理(四)(4)https://developer.aliyun.com/article/1514231