SetFitABSA 使用SetFit进行少样本基于方面的情感分析

SetFitABSA 运用SetFit进行基于方面的情感分析的少样本方法

SetFitABSA 是一种有效的技术,用于检测文本中特定方面的情感。

Aspect-Based Sentiment Analysis (ABSA) 是检测文本中特定方面的情感的任务。例如,在句子“这部手机屏幕很棒,但电池太小”中,方面术语是“屏幕”和“电池”,它们的情感极性分别为正面和负面。

ABSA被广泛用于组织通过分析用户对产品或服务的方面的反馈来提取有价值的见解。然而,由于训练样本中手动识别方面的细粒度(标记级别)的特点,为ABSA标记训练数据是一项繁琐的任务。

英特尔实验室和Hugging Face很高兴地推出SetFitABSA,这是一个用于领域特定ABSA模型的几次训练的框架;在几次训练的情况下,SetFitABSA竞争力强,并且甚至比Llama2和T5等生成模型表现更好。

与基于LLM的方法相比,SetFitABSA有两个独特的优势:

🗣无需提示:LLM上的几次训练需要手工制作的提示语,这使结果脆弱、对措辞敏感并且依赖于用户的专业知识。SetFitABSA通过直接从少量标记的文本示例生成丰富的嵌入来完全放弃提示。

🏎训练速度快:SetFitABSA仅需要少量标记的训练样本;此外,它使用简单的训练数据格式,消除了对专门标记工具的需求。这使得数据标注过程快速简便。

在本博文中,我们将解释SetFitABSA的工作原理,以及如何使用SetFit库训练自己的模型。让我们开始吧!

工作原理

SetFitABSA的三阶段训练过程

SetFitABSA由三个步骤组成。第一步从文本中提取方面候选项,第二步通过将方面候选项分类为方面或非方面来产生方面,最后一步将情感极性与每个提取的方面相关联。步骤二和三基于SetFit模型。

训练

1. 方面候选项提取

在这项工作中,我们假设通常是产品和服务的特征的方面大部分是名词或名词复合词(连续名词字符串)。我们使用spaCy对(几次训练的)训练集中的句子进行分词和名词/名词复合词提取。由于并非所有提取的名词/名词复合词都是方面,我们将其称为方面候选项。

2. 方面/非方面分类

现在我们有了方面候选项,我们需要训练一个模型来区分哪些名词是方面,哪些名词是非方面。为此,我们需要具有方面/非方面标签的训练样本。通过将训练集中的方面视为真实的方面,而将其他不重叠的候选方面视为非方面,并标记为False来完成此任务:

  • 训练句子:“Waiters aren’t friendly but the cream pasta is out of this world.”
  • 分词后: [Waiters, are, n’t, friendly, but, the, cream, pasta, is, out, of, this, world, .]
  • 提取的方面候选项: [Waiters, are, n’t, friendly, but, the, cream, pasta, is, out, of, this, world, .]
  • 从训练集中生成的标签,以BIO格式为例: [B-ASP, O, O, O, O, O, B-ASP, I-ASP, O, O, O, O, O, .]
  • 生成的方面/非方面标签: [Waiters, are, n’t, friendly, but, the, cream, pasta, is, out, of, this, world, .]

我们现在标记了所有的方面候选项,那么我们如何使用它来训练候选方面分类模型呢?换句话说,我们如何使用SetFit,一个句子分类框架,来对单个令牌进行分类?这就是诀窍:将每个方面候选项与整个训练句子连接起来,使用以下模板创建训练实例:

aspect_candidate:training_sentence

将该模板应用于上面的示例将生成3个训练实例 – 其中两个具有表示方面训练实例的True标签,一个具有表示非方面训练实例的False标签:

生成训练实例后,我们可以利用SetFit的强大功能来训练一种少样本领域特定的二分类器,以从输入的文本评论中提取方面。这将是我们第一个微调后的SetFit模型。

3. 情感极性分类

一旦系统从文本中提取出方面,它需要将每个方面与一个情感极性(例如积极、消极或中立)相关联。为此,我们使用第二个SetFit模型,并以类似的方式对其进行训练,如下例所示:

  • 训练句子: “服务员不友好,但奶油意面好得不得了。”
  • 分词: [服务员,不是,友好,但是,奶油,意面,好得,不得了,。]
  • 训练集中的金标签: [消极, O, O, O, O, POS, POS, O, O, O, O, O, O,。]

请注意,与方面提取模型相反,我们在此训练集中不包括非方面,因为目标是对真实方面的情感极性进行分类。

运行推理

在推理时,测试句子通过spaCy方面候选项提取阶段,生成使用模板aspect_candidate:test_sentence的测试实例。接下来,通过方面/非方面分类器过滤非方面。最后,将提取出的方面输入到情感极性分类器中,预测每个方面的情感极性。

实际上,这意味着该模型可以接收普通文本作为输入,并输出方面及其情感:

模型输入:

"他们的晚餐特别好。"

模型输出:

[{'span': '晚餐特别好', 'polarity': '积极'}]

基准测试

SetFitABSA与最近由AWS AI实验室Salesforce AI研究进行微调的T5和GPT2的最新工作进行了基准测试。为了获得更完整的画面,我们还将我们的模型与使用上下文学习的Llama-2-chat模型进行了比较。我们使用Semantic Evaluation Challenge 2014 (SemEval14)的流行的Laptop14和Restaurant14 ABSA 数据集来进行评估。SetFitABSA在方面术语提取(SB1)的中间任务和方面提取以及其情感极性预测(SB1+SB2)的完整ABSA任务上进行了评估。

模型大小比较

请注意,对于SB1任务,SetFitABSA是110M参数,对于SB2任务,它是110M参数,对于SB1+SB2任务,SetFitABSA包含220M参数。

性能比较

尽管SetFitABSA的规模比T5小2倍且比GPT2-medium小3倍,但在训练实例数量较少时,SetFitABSA表现出明显的优势。即使与Llama 2相比(体积大64倍),性能也相当或更好。

SetFitABSA vs GPT2

SetFitABSA vs T5

请注意,为了公平比较,我们使用了与各个基线模型(GPT2,T5等)使用的相同数据集拆分来进行SetFitABSA的比较。

SetFitABSA vs 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

然后,我们准备训练集。训练集的格式是一个具有textspanlabelordinal列的Dataset

  • text:包含方面的完整句子或文本。
  • span:来自完整句子的一个方面。可以是多个单词。例如:“食物”。
  • label:与方面范围相对应的(极性)标签。例如:“积极”。在标记收集的训练数据时,标签名称可以任意选择。
  • ordinal:如果方面范围在文本中出现多次,则此序数表示这些出现的索引。通常,这只是0,因为每个方面在输入文本中通常只出现一次。

例如,训练文本“餐厅的食物很好,但服务是我见过的最差的”,包含两个方面,所以将为训练集表格添加两行:

一旦我们准备好训练数据集,我们可以创建一个ABSA训练器并执行训练。SetFit模型的训练效率相对较高,但由于SetFitABSA涉及顺序训练两个模型,建议使用GPU进行训练以保持训练时间较低。例如,以下训练脚本在免费的Google Colab T4 GPU上约花费10分钟训练了一个完整的SetFitABSA模型。

from datasets import load_datasetfrom setfit import AbsaTrainer, AbsaModel# 创建上述的训练数据集# 为了方便起见,我们将使用一个已经准备好的数据集train_dataset = load_dataset("tomaarsen/setfit-absa-semeval-restaurants", split="train[:128]")# 创建一个带有所选句子变换器的模型 from the Hub model = AbsaModel.from_pretrained("sentence-transformers/paraphrase-mpnet-base-v2")# 创建一个训练器:trainer = AbsaTrainer(model, train_dataset=train_dataset)# 执行训练:trainer.train()

就是这样!我们已经训练了一个领域特定的ABSA模型。我们可以将训练好的模型保存到磁盘或上传到Hugging Face hub。请注意,该模型包含两个子模型,因此每个子模型都有自己的路径:

model.save_pretrained(    "models/setfit-absa-model-aspect",     "models/setfit-absa-model-polarity")# 或者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")

然后,我们使用predict API进行推断。输入是一个字符串列表,每个字符串代表一个文本评论:

preds = model.predict([
    "最好吃的披萨非意大利之外莫属,口感真不错。",
    "菜品的种类非常多样,价格绝对公道。",
    "不幸的是,你必须预计花一些等待时间并拿到等候号码牌,如果非常拥挤的话。"])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, and Suresh Manandhar. 2014. SemEval-2014 task 4: Aspect based sentiment analysis. In Proceedings of the 8th International Workshop on Semantic Evaluation (SemEval 2014), pages 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