译者 | 布加迪
审校 | 重楼
本文介绍了如何利用Hugging Face预训练语言模型对推文隐藏的情绪进行分类。
Hugging Face上有各种基于Transformer的语言模型,专门用于处理语言理解和语言生成任务,包括但不限于:
- 文本分类
- 命名实体识别(NER)
- 文本生成
- 问题回答
- 摘要
- 翻译
文本分类任务的一个特殊又很常见的案例是情绪分析,其目的是识别给定文本的情绪。“最简单”的一类情绪分析语言模型经过训练后,确定输入文本(比如客户对产品的评价)是积极的还是消极的,或者是积极的、消极的还是中立的。这两个具体问题分别被表述为二元分类任务或多类分类任务。
还有一些语言模型虽然仍可以归为情绪分析模型,但经过训练后,可以将文本分类为几种情绪,比如愤怒、快乐和悲伤等。
这篇基于Python的教程侧重于加载和阐明使用一个Hugging Face预训练模型来分类与输入文本相关的主要情绪。我们将使用在Hugging Face中心上公开可用的情绪数据集。这个数据集含有成千上万条用英语写的推文消息。
加载数据集
我们将运行以下指令,加载情绪数据集中的训练数据:
!pip install datasets
from datasets import load_dataset
all_data = load_dataset("jeffnyman/emotions")
train_data = all_data["train"]
下面是train_data变量中训练子集所包含内容的摘要:
Dataset({
features: ['text', 'label'],
num_rows: 16000
})
情绪数据集中的训练内容含有16000个与推文消息相关的实例。每个实例有两个特征:一个输入特征含有实际的消息文本,一个输出特征或标签含有其相关的情绪(用数字标识符标识)。
0:悲伤
1:快乐
2:喜爱
3:愤怒
4:恐惧
5:惊喜
比如说,训练内容中的第一个标记实例被归类为“悲伤”情绪:
train_data [0]
输出:
{'text': 'i didnt feel humiliated', 'label': 0}
加载语言模型
一旦我们加载了数据,下一步就是从Hugging Face加载一个合适的预训练语言模型,用于我们的目标情绪检测任务。使用Hugging Face的Transformer库加载和使用语言模型有两种主要方法:
- 管道提供了一个非常高的抽象级别,可以准备加载语言模型,并立即对其执行推理,只需很少的代码行,不过代价是几乎没什么可配置性。
- 自动类提供了较低层次的抽象,需要更多的编码技能,但在调整模型参数以及定制文本预处理步骤(如标记化)方面提供了更大的灵活性。
为了方便起见,本教程侧重于使用管道来加载模型。管道要求起码指定语言任务的类型,并指定要加载的模型名(可选)。由于情绪检测是文本分类问题的一种非常特殊的形式,因此在加载模型时使用的任务参数应该是“text-classification”。
from transformers import pipeline
classifier = pipeline("text-classification",
model="j-hartmann/emotion-english-distilroberta-base")
另一方面,强烈建议用“model”参数指定Hugging Face中心中一个特定模型的名称,该模型能够解决我们的特定情绪检测任务。否则,默认情况下,我们可能会为这个特定的6类分类问题加载一个没有经过数据训练的文本分类模型。
你可能会问自己:“我怎么知道使用哪个模型名称?”。答案很简单:在Hugging Face网站上搜索一番,找到合适的模型,或者根据特定数据集(比如情绪数据)训练的模型。
下一步是开始进行预测。管道使得这个推理过程非常简单,只需要调用我们新实例化的管道变量,并将输入文本作为参数来传递:
example_tweet = "I love hugging face transformers!"
prediction = classifier(example_tweet)
print(prediction)
结果,我们得到一个预测标签和一个置信度分数:这个分数越接近1,所做的预测就越“可靠”。
[{'label': 'joy', 'score': 0.9825918674468994}]
所以,我们的输入例子“I love hugging face transformers!”明确地传达了一种喜悦的情绪。
你可以将多个输入文本传递给管道以同时执行几个预测,如下所示:
example_tweets = ["I love hugging face transformers!", "I really like coffee
but it's too bitter..."]
prediction = classifier(example_tweets)
print(prediction)
这个例子中的第二个输入对于模型执行自信分类更具挑战性:
[{'label': 'joy', 'score': 0.9825918674468994}, {'label': 'sadness', 'score':
0.38266682624816895}]
最后,我们还可以从数据集传递一批实例,比如之前加载的“情绪”数据。这个例子将前10个训练输入传递给我们的语言模型管道,对它们的情绪进行分类,然后输出一个含有每个预测标签的列表,将他们的置信度分数放在一边:
train_batch = train_data[:10]["text"]
predictions = classifier(train_batch)
labels = [x['label'] for x in predictions]
print(labels)
输出:
['sadness', 'sadness', 'anger', 'joy', 'anger', 'sadness', 'surprise',
'fear', 'joy', 'joy']
为了比较,下面是这10个训练实例的原始标签:
print(train_data[:10]["label"])
输出:
[0, 0, 3, 2, 3, 0, 5, 4, 1, 2]
如果观察每个数字标识符所关联的情绪,我们可以看到,10个预测中有7个与这10个实例的实际标签相匹配。
你已知道如何使用Hugging Face transformer模型来检测文本情绪,何不探究预训练的语言模型可以提供帮助的其他用例和语言任务呢?
原文标题:Using Hugging Face Transformers for Emotion Detection in Text,作者:Iván Palomares Carrascosa