SetFitABSA:使用 SetFit 進行少樣本方面級情感分析

釋出日期:2023年12月6日
在 GitHub 上更新

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 LabsSalesforce 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

社群

註冊登入 以評論

© . This site is unofficial and not affiliated with Hugging Face, Inc.