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