SetFitABSA: 基于 SetFit 的少样本、方面级情感分析
SetFitABSA 是一種可以有效從文本中檢測方面級情感的技術(shù)。
方面級情感分析 (Aspect-Based Sentiment Analysis,ABSA) 是一種檢測文本中特定方面的情感的任務(wù)。例如,在“這款手機(jī)的屏幕很棒,但電池太小”一句中,分別有“屏幕”和“電池”兩個(gè)方面,它們的情感極性分別是正面和負(fù)面。
ABSA 應(yīng)用頗為廣泛,有了它我們可以通過分析顧客對產(chǎn)品或服務(wù)的多方面反饋,并從中提取出有價(jià)值的見解。然而,ABSA 要求在樣本標(biāo)注時(shí)對訓(xùn)練樣本中涉及的各個(gè)方面進(jìn)行詞元級的識別,因此為 ABSA 標(biāo)注訓(xùn)練數(shù)據(jù)成為了一件繁瑣的任務(wù)。
為了緩解這一問題,英特爾實(shí)驗(yàn)室和 Hugging Face 聯(lián)袂推出了 SetFitABSA,以用于少樣本場景下的特定領(lǐng)域 ABSA 模型訓(xùn)練。實(shí)驗(yàn)表明,SetFitABSA 性能相當(dāng)不錯(cuò),其在少樣本場景下表現(xiàn)甚至優(yōu)于 Llama2 和 T5 等大型生成模型。
與基于 LLM 的方法相比,SetFitABSA 有兩個(gè)獨(dú)特優(yōu)勢:
?? 無需提示: 在使用基于 LLM 的少樣本上下文學(xué)習(xí)時(shí),提示的作用非常關(guān)鍵,因此一般需要精心設(shè)計(jì),這一要求使得最終效果對用詞十分敏感且非常依賴用戶的專業(yè)知識,因此整個(gè)方案會(huì)比較脆弱。SetFitABSA 直接從少量帶標(biāo)簽的文本示例中生成豐富的嵌入,因此可完全無需提示。
?? 快速訓(xùn)練: SetFitABSA 僅需少量的已標(biāo)注訓(xùn)練樣本。此外,其訓(xùn)練數(shù)據(jù)格式非常簡單,無需專門的標(biāo)注工具,因此數(shù)據(jù)標(biāo)注過程簡單而快速。
本文,我們將解釋 SetFitABSA 的工作原理以及如何使用 SetFit 庫 訓(xùn)練你自己的模型。我們開始吧!
工作原理與流程
SetFitABSA 的三段式訓(xùn)練流程
SetFitABSA 主要分三步。第一步從文本中提取候選方面; 第二步從候選方面中篩選出真正的方面,這一步主要由一個(gè)候選方面分類器來完成; 最后一步對每個(gè)方面判斷其情感極性。其中,第二步和第三步均基于 SetFit 模型。
訓(xùn)練
1. 候選方面提取
這里我們假設(shè): 方面一般指的是產(chǎn)品和服務(wù)的特性,因此其主要是名詞或復(fù)合名詞 (即幾個(gè)相鄰名詞組成的字符串)。我們使用 spaCy 從少樣本訓(xùn)練集的句子中提取并標(biāo)注出名詞/復(fù)合名詞。由于并非所有提取的名詞/復(fù)合名詞都是方面,因此我們叫它們 候選方面。
2. 方面/非方面分類
有了候選方面后,我們還需要訓(xùn)練一個(gè)模型,以便能夠區(qū)分這些候選方面中哪些是真正的方面。為此,我們需要一些帶有方面/無方面標(biāo)簽的訓(xùn)練樣本。如果候選方面存在于訓(xùn)練集中我們即視其為 True ,否則視其為 False :
- 訓(xùn)練樣本: “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, .]
- 訓(xùn)練集標(biāo)簽,其格式為 BIO: [B-ASP, O, O, O, O、O、B-ASP、I-ASP、O、O、O、O、O、.]
- 根據(jù)訓(xùn)練集標(biāo)簽,生成方面/非方面標(biāo)簽: [Waiters, are, n’t, friendly, but, the, cream, pasta, is, out, of, this, world, .]
至此,我們對所有候選方面進(jìn)行了標(biāo)注,下一步就是如何訓(xùn)練方面分類模型?也就是說,我們?nèi)绾问褂?SetFit 這一句子分類框架來對詞元進(jìn)行分類?我們使用的方法是: 將每個(gè)候選方面與其所在的句子串接起來,我們使用以下模板創(chuàng)建訓(xùn)練樣本:
候選方面:所在句子
將該模板應(yīng)用于上面的例子,我們會(huì)生成 3 個(gè)訓(xùn)練樣本 - 其中 2 個(gè)標(biāo)簽為 True ,1 個(gè)標(biāo)簽為 False :
| 文本 | 標(biāo)簽 |
|---|---|
| Waiters:Waiters aren't friendly but the cream pasta is out of this world. | 1 |
| cream pasta:Waiters aren't friendly but the cream pasta is out of this world. | 1 |
| world:Waiters aren't friendly but the cream pasta is out of this world. | 0 |
| ... | ... |
生成訓(xùn)練樣本后,我們就可以借助 SetFit 的強(qiáng)大功能僅用少許樣本訓(xùn)練一個(gè)特定領(lǐng)域的二元分類器,以從輸入文本評論中提取出方面。這是我們第一個(gè)微調(diào) SetFit 模型。
3. 情感極性分類
一旦系統(tǒng)從文本中提取到方面,它需要判斷每個(gè)方面的情感極性 (如積極、消極或中性)。為此,我們需要第二個(gè) SetFit 模型,其訓(xùn)練方式與上面相似,如下例所示:
- 訓(xùn)練樣本: “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, .]
- 標(biāo)簽: [NEG, O, O, O, O, O, POS, POS, O, O, O, O, O, .]
| 文本 | 標(biāo)簽 |
|---|---|
| Waiters:Waiters aren't friendly but the cream pasta is out of this world. | NEG |
| cream pasta:Waiters aren't friendly but the cream pasta is out of this world. | POS |
| ... | ... |
注意,與方面提取模型不同,這里訓(xùn)練集中就不用包含非方面樣本了,因?yàn)槿蝿?wù)是對真正的方面進(jìn)行情感極性分類。
推理
推理時(shí),我們首先使用 spaCy 對輸入句子進(jìn)行候選方面提取,并用模板 aspect_candidate:test_sentence 生成推理樣本。接下來,用方面/非方面分類器過濾掉非方面。最后,過濾出的方面會(huì)被送到情感極性分類器,該分類器預(yù)測每個(gè)方面的情感極性。
因此,我們的系統(tǒng)可以接收普通文本作為輸入,并輸出文本中的方面及其對應(yīng)的情感:
模型輸入:
"their dinner specials are fantastic."
模型輸出:
[{'span': 'dinner specials', 'polarity': 'positive'}]
基準(zhǔn)測試
我們將 SetFitABSA 與 AWS AI 實(shí)驗(yàn)室 和 Salesforce AI 研究院 的最新成果進(jìn)行比較,這兩項(xiàng)工作主要采用了對 T5 和 GPT2 進(jìn)行提示微調(diào)的方法以實(shí)現(xiàn)方面級情感分析。為了對我們的工作進(jìn)行全面測評,我們還將我們的模型與基于上下文學(xué)習(xí)的 Llama-2-chat 進(jìn)行了比較。
我們采用的測評數(shù)據(jù)集是 2014 年語義評估挑戰(zhàn)賽 (SemEval14) 中的 Laptop14 和 Restaurant14 ABSA 數(shù)據(jù)集。測評任務(wù)選擇的是術(shù)語提取中間任務(wù) (SB1) 及完整 ABSA 任務(wù) (包括方面提取及情感極性預(yù)測,即 SB1+SB2)。
模型尺寸比較
| 模型 | 尺寸 (參數(shù)量) |
|---|---|
| Llama-2-chat | 7B |
| T5-base | 220M |
| GPT2-base | 124M |
| GPT2-medium | 355M |
| SetFit (MPNet) | 2x 110M |
請注意,SB1 任務(wù)使用的 SetFitABSA 的參數(shù)量為 110M; SB2 任務(wù)再加上一個(gè) 110M 的模型。因此 SB1+SB2 時(shí), SetFitABSA 的總參數(shù)量為 220M。
性能比較
我們看到,當(dāng)訓(xùn)練樣本較少時(shí),SetFitABSA 有明顯優(yōu)勢,盡管它比 T5 小 2 倍,比 GPT2-medium 小 3 倍。即便是與 64 倍參數(shù)量的 Llama 2 相比,SetFitABSA 也能獲得相當(dāng)或更好的效果。
SetFitABSA vs GPT2
SetFitABSA vs T5
請注意,為公平起見,在比較 SetFitABSA 與各基線 (GPT2、T5 等) 時(shí),我們使用了相同的數(shù)據(jù)集劃分。
SetFitABSA vs Llama2
我們注意到,增加 Llama2 提示中的上下文樣本的數(shù)目并不能改善效果。這種現(xiàn)象 之前也在 ChatGPT 中發(fā)現(xiàn)過,我們認(rèn)為后續(xù)值得深入調(diào)查一下。
訓(xùn)練你自己的模型
SetFitABSA 是 SetFit 框架的一個(gè)功能。要訓(xùn)??練 ABSA 模型,首先需要安裝包含 absa 功能的 setfit :
python -m pip install -U "setfit[absa]"
此外,我們必須安裝 en_core_web_lg 版的 spaCy 模型:
python -m spacy download en_core_web_lg
接著開始準(zhǔn)備訓(xùn)練數(shù)據(jù)集。訓(xùn)練集是一個(gè) Dataset 對象,其包含 text 、 span 、 label 、 ordinal 四列:
- text: 含有方面的完整句子或文本。
- span: 句子中包含的方面。可以是一個(gè)單詞或多個(gè)單詞,如 “food”。
- label: 每個(gè) span (即方面) 的情感極性標(biāo)簽,如 “positive”。這些標(biāo)簽的名稱是在標(biāo)注時(shí)確定的。
- ordinal: 如果某一方面在文本中出現(xiàn)了多次,則該列表示其在文本中出現(xiàn)的次序。這個(gè)值通常是 0,因?yàn)槊總€(gè)方面通常在對應(yīng)文本中只出現(xiàn)一次。
舉個(gè)例子,訓(xùn)練文本 “Restaurant with wonderful food but worst service I ever seen” 中包含兩個(gè)方面,因此其在訓(xùn)練集表中占據(jù)兩行,如下:
| text | span | label | ordinal |
|---|---|---|---|
| Restaurant with wonderful food but worst service I ever seen | food | positive | 0 |
| Restaurant with wonderful food but worst service I ever seen | service | negative | 0 |
| ... | ... | ... | ... |
一旦準(zhǔn)備好訓(xùn)練數(shù)據(jù)集,我們就可以創(chuàng)建一個(gè) ABSA 訓(xùn)練器并運(yùn)行訓(xùn)練。SetFit 模型的訓(xùn)練效率相當(dāng)高,但由于 SetFitABSA 涉及兩個(gè)依次訓(xùn)練的模型,因此建議使用 GPU 進(jìn)行訓(xùn)練,以縮短訓(xùn)練時(shí)間。例如,以下訓(xùn)練腳本在免費(fèi)的 Google Colab T4 GPU 上僅需約 10 分鐘就可以完成 SetFitABSA 模型的訓(xùn)練。
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()
好了!自此,我們成功訓(xùn)得一個(gè)特定領(lǐng)域的 ABSA 模型。我們可以將訓(xùn)得的模型保存到硬盤或?qū)⑵渖蟼鞯?Hugging Face Hub。請記住,該模型包含兩個(gè)子模型,因此每個(gè)子模型都需有自己的路徑:
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"
)
現(xiàn)在我們使用訓(xùn)得的模型進(jìn)行推理。首先加載模型:
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"
)
然后,使用模型的預(yù)測 API 進(jìn)行推理。輸入一個(gè)字符串列表,其中每個(gè)字符串代表一個(gè)評論文本:
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'}]
# ]
有關(guān)訓(xùn)練選項(xiàng)、如何保存和加載模型以及如何推理等更多詳細(xì)信息,請參閱 SetFit 文檔。
參考文獻(xiàn)
- 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
英文原文: https://hf.co/blog/setfit-absa
原文作者: Ronen Laperdon,Tom Aarsen,Lewis Tunstall,Daniel Korat,Oren Pereg,Moshe Wasserblat
譯者: Matrix Yao (姚偉峰),英特爾深度學(xué)習(xí)工程師,工作方向?yàn)?transformer-family 模型在各模態(tài)數(shù)據(jù)上的應(yīng)用及大規(guī)模模型的訓(xùn)練推理。
總結(jié)
以上是生活随笔為你收集整理的SetFitABSA: 基于 SetFit 的少样本、方面级情感分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【新手友好】用Pyspark和Graph
- 下一篇: Vue3 Diff算法之最长递增子序列,