SetFitABSA:使用 SetFit 进行少样本方面级情感分析
SetFitABSA 是一种高效的技术,用于检测文本中特定方面的情感。
方面级情感分析 (ABSA) 是检测文本中特定方面情感的任务。例如,在句子“这部手机屏幕很好,但电池太小了”中,方面词是“屏幕”和“电池”,对它们的情感极性分别是积极和消极。
ABSA 被组织广泛使用,通过分析客户对各个领域产品或服务的反馈来提取有价值的见解。然而,为 ABSA 标注训练数据是一项繁琐的任务,因为手动识别训练样本中的方面具有细粒度(token 级别)的特点。
Intel Labs 和 Hugging Face 很高兴推出 SetFitABSA,这是一个用于少样本训练领域特定 ABSA 模型的框架;SetFitABSA 在少样本场景中具有竞争力,甚至优于 Llama2 和 T5 等生成模型。
与基于 LLM 的方法相比,SetFitABSA 具有两个独特的优势:
🗣 无需提示: 使用 LLM 进行少样本上下文学习需要手工制作的提示,这使得结果脆弱、对措辞敏感并取决于用户专业知识。SetFitABSA 通过直接从少量标记文本示例生成丰富的嵌入,完全省去了提示。
🏎 训练速度快: SetFitABSA 只需要少量标记的训练样本;此外,它使用简单的训练数据格式,无需专门的标记工具。这使得数据标记过程快速简便。
在这篇博文中,我们将解释 SetFitABSA 的工作原理以及如何使用 SetFit 库训练您自己的模型。让我们深入了解!
它是如何工作的?
SetFitABSA 的三阶段训练过程
SetFitABSA 包含三个步骤。第一步从文本中提取方面候选词,第二步通过将方面候选词分类为方面或非方面来产生方面,最后一步将情感极性与每个提取的方面关联起来。第二步和第三步基于 SetFit 模型。
训练
1. 方面候选词提取
在这项工作中,我们假设方面(通常是产品和服务的特征)主要是名词或名词复合词(连续名词串)。我们使用 spaCy 从(少样本)训练集中的句子中进行分词并提取名词/名词复合词。由于并非所有提取的名词/名词复合词都是方面,我们将它们称为方面候选词。
2. 方面/非方面分类
现在我们有了方面候选词,我们需要训练一个模型来区分是方面的名词和非方面的名词。为此,我们需要带有方面/非方面标签的训练样本。这通过将训练集中的方面视为 `True` 方面来完成,而其他不重叠的候选方面则被视为非方面,因此标记为 `False`。
- 训练句子:“服务员不友好,但是奶油意面好吃到爆。”
- 分词: [服务员, 不, 友好, 但, 是, 奶油, 意面, 好吃, 到, 爆, .]
- 提取的方面候选词: [服务员, 不, 友好, 但, 是, 奶油, 意面, 好吃, 到, 爆, .]
- 训练集中的黄金标签,采用 BIO 格式: [B-ASP, O, O, O, O, O, B-ASP, I-ASP, O, O, O, O, O, .]
- 生成的方面/非方面标签: [服务员, 不, 友好, 但, 是, 奶油, 意面, 好吃, 到, 爆, .]
现在我们已经标记了所有方面候选词,如何使用它们来训练候选方面分类模型呢?换句话说,我们如何使用 SetFit(一个句子分类框架)来分类单个 token 呢?这就是诀窍:每个方面候选词都与整个训练句子连接起来,使用以下模板创建一个训练实例:
aspect_candidate:training_sentence
将模板应用于上述示例将生成 3 个训练实例——两个带有 `True` 标签,表示方面训练实例,一个带有 `False` 标签,表示非方面训练实例。
文本 | 标签 |
---|---|
服务员:服务员不友好,但是奶油意面好吃到爆。 | 1 |
奶油意面:服务员不友好,但是奶油意面好吃到爆。 | 1 |
爆:服务员不友好,但是奶油意面好吃到爆。 | 0 |
... | ... |
生成训练实例后,我们就可以利用 SetFit 的强大功能来训练一个少样本领域特定的二元分类器,从输入文本评论中提取方面。这将是我们第一个微调的 SetFit 模型。
3. 情感极性分类
系统从文本中提取方面后,需要为每个方面关联一个情感极性(例如,积极、消极或中性)。为此,我们使用第二个 SetFit 模型,并以与方面提取模型类似的方式进行训练,如下例所示:
- 训练句子:“服务员不友好,但是奶油意面好吃到爆。”
- 分词: [服务员, 不, 友好, 但, 是, 奶油, 意面, 好吃, 到, 爆, .]
- 来自训练集的黄金标签: [消极, O, O, O, O, O, 积极, 积极, O, O, O, O, O, .]
文本 | 标签 |
---|---|
服务员:服务员不友好,但是奶油意面好吃到爆。 | 消极 |
奶油意面:服务员不友好,但是奶油意面好吃到爆。 | 积极 |
... | ... |
请注意,与方面提取模型不同,我们不在此训练集中包含非方面,因为目标是分类对真实方面的情感极性。
运行推理
在推理时,测试句子通过 spaCy 方面候选词提取阶段,生成使用模板 `aspect_candidate:test_sentence` 的测试实例。接下来,非方面词由方面/非方面分类器进行过滤。最后,提取的方面词被输入情感极性分类器,该分类器预测每个方面词的情感极性。
实际上,这意味着模型可以接收普通文本作为输入,并输出方面词及其情感。
模型输入
"their dinner specials are fantastic."
模型输出
[{'span': 'dinner specials', 'polarity': 'positive'}]
基准测试
SetFitABSA 与 AWS AI Labs 和 Salesforce AI Research 最新的最先进工作进行了基准测试,这些工作使用提示对 T5 和 GPT2 进行微调。为了获得更全面的图像,我们还将我们的模型与使用上下文学习的 Llama-2-chat 模型进行了比较。我们使用了语义评估挑战赛 2014 (SemEval14) 中流行的 Laptop14 和 Restaurant14 ABSA 数据集。SetFitABSA 在方面词提取的中间任务 (SB1) 和方面提取及其情感极性预测的完整 ABSA 任务 (SB1+SB2) 上都进行了评估。
模型大小比较
模型 | 大小 (参数) |
---|---|
Llama-2-chat | 7B |
T5-base | 220M |
GPT2-base | 124M |
GPT2-medium | 3.55亿 |
SetFit (MPNet) | 2x 110M |
请注意,对于 SB1 任务,SetFitABSA 为 110M 参数,对于 SB2 为 110M 参数,对于 SB1+SB2,SetFitABSA 包含 220M 参数。
性能比较
我们发现,当训练实例数量较少时,SetFitABSA 具有明显的优势,尽管其大小是 T5 的两倍,是 GPT2-medium 的三倍。即使与比其大 64 倍的 Llama 2 相比,其性能也旗鼓相当或更优。
SetFitABSA 对比 GPT2
SetFitABSA 对比 T5
请注意,为了公平比较,我们对 SetFitABSA 与各种基线(GPT2、T5 等)使用的完全相同的数据集分割进行了比较。
SetFitABSA 对比 Llama2
我们注意到,增加 Llama2 的上下文训练样本数量并未导致性能提高。这种现象之前在 ChatGPT 中也有所体现,我们认为这应该进一步调查。
训练您自己的模型
SetFitABSA 是 SetFit 框架的一部分。要训练 ABSA 模型,首先安装启用 `absa` 选项的 `setfit`:
python -m pip install -U "setfit[absa]"
此外,我们必须安装 `en_core_web_lg` spaCy 模型:
python -m spacy download en_core_web_lg
我们继续准备训练集。训练集的格式是一个 `Dataset`,包含 `text`、`span`、`label`、`ordinal` 列:
- text:包含方面词的完整句子或文本。
- span:完整句子中的一个方面词。可以是多个词。例如:“食物”。
- label:与方面 span 对应的(极性)标签。例如:“积极”。在标记收集到的训练数据时,标签名称可以随意选择。
- ordinal:如果方面 span 在文本中多次出现,则此序数表示这些出现位置的索引。通常这只是 0,因为每个方面通常只在输入文本中出现一次。
例如,训练文本“Restaurant with wonderful food but worst service I ever seen”包含两个方面,因此将向训练集表中添加两行:
文本 | 跨度 | 标签 | 序数 |
---|---|---|---|
餐厅食物很棒但服务是我见过最差的 | 食物 | 正面 | 0 |
餐厅食物很棒但服务是我见过最差的 | 服务 | 负面 | 0 |
... | ... | ... | ... |
一旦我们准备好训练数据集,我们就可以创建一个 ABSA 训练器并执行训练。SetFit 模型的训练效率相当高,但由于 SetFitABSA 涉及两个模型顺序训练,建议使用 GPU 进行训练以缩短训练时间。例如,以下训练脚本使用免费的 Google Colab T4 GPU 在大约 10 分钟内训练一个完整的 SetFitABSA 模型。
from datasets import load_dataset
from setfit import AbsaTrainer, AbsaModel
# Create a training dataset as above
# For convenience we will use an already prepared dataset here
train_dataset = load_dataset("tomaarsen/setfit-absa-semeval-restaurants", split="train[:128]")
# Create a model with a chosen sentence transformer from the Hub
model = AbsaModel.from_pretrained("sentence-transformers/paraphrase-mpnet-base-v2")
# Create a trainer:
trainer = AbsaTrainer(model, train_dataset=train_dataset)
# Execute training:
trainer.train()
就是这样!我们已经训练了一个领域特定的 ABSA 模型。我们可以将我们训练好的模型保存到磁盘或上传到 Hugging Face Hub。请记住,该模型包含两个子模型,因此每个子模型都有自己的路径。
model.save_pretrained(
"models/setfit-absa-model-aspect",
"models/setfit-absa-model-polarity"
)
# or
model.push_to_hub(
"tomaarsen/setfit-absa-paraphrase-mpnet-base-v2-restaurants-aspect",
"tomaarsen/setfit-absa-paraphrase-mpnet-base-v2-restaurants-polarity"
)
现在我们可以使用我们训练好的模型进行推理。我们首先加载模型。
from setfit import AbsaModel
model = AbsaModel.from_pretrained(
"tomaarsen/setfit-absa-paraphrase-mpnet-base-v2-restaurants-aspect",
"tomaarsen/setfit-absa-paraphrase-mpnet-base-v2-restaurants-polarity"
)
然后,我们使用预测 API 运行推理。输入是一个字符串列表,每个字符串代表一个文本评论。
preds = model.predict([
"Best pizza outside of Italy and really tasty.",
"The food variations are great and the prices are absolutely fair.",
"Unfortunately, you have to expect some waiting time and get a note with a waiting number if it should be very full."
])
print(preds)
# [
# [{'span': 'pizza', 'polarity': 'positive'}],
# [{'span': 'food variations', 'polarity': 'positive'}, {'span': 'prices', 'polarity': 'positive'}],
# [{'span': 'waiting time', 'polarity': 'neutral'}, {'span': 'waiting number', 'polarity': 'neutral'}]
# ]
有关训练选项、模型保存和加载以及推理的更多详细信息,请参阅 SetFit 文档。
参考文献
- Maria Pontiki、Dimitris Galanis、John Pavlopoulos、Harris Papageorgiou、Ion Androutsopoulos 和 Suresh Manandhar。2014年。SemEval-2014 任务 4:方面级情感分析。载于第8届语义评估国际研讨会 (SemEval 2014) 会议论文集,第27-35页。
- Siddharth Varia, Shuai Wang, Kishaloy Halder, Robert Vacareanu, Miguel Ballesteros, Yassine Benajiba, Neha Anna John, Rishita Anubhai, Smaranda Muresan, Dan Roth, 2023 "Instruction Tuning for Few-Shot Aspect-Based Sentiment Analysis". https://arxiv.org/abs/2210.06629
- Ehsan Hosseini-Asl, Wenhao Liu, Caiming Xiong, 2022. "A Generative Language Model for Few-shot Aspect-Based Sentiment Analysis". https://arxiv.org/abs/2204.05356
- Lewis Tunstall, Nils Reimers, Unso Eun Seo Jo, Luke Bates, Daniel Korat, Moshe Wasserblat, Oren Pereg, 2022. "Efficient Few-Shot Learning Without Prompts". https://arxiv.org/abs/2209.11055