使用 Python 進行情感分析入門
情感分析是根據資料的情感(如積極、消極和中性)自動標記資料的過程。情感分析使公司能夠大規模分析資料、發現洞見並自動化流程。
過去,情感分析僅限於具有自然語言處理經驗的研究人員、機器學習工程師或資料科學家。然而,近年來,人工智慧社群已經構建了出色的工具來普及機器學習的運用。如今,你只需幾行程式碼,甚至無需任何機器學習經驗,就可以使用情感分析!🤯
在本指南中,你將學到使用 Python 進行情感分析入門所需的一切,包括:
讓我們開始吧!🚀
1. 什麼是情感分析?
情感分析是一種自然語言處理技術,用於識別給定文字的情感極性。情感分析有多種形式,但最廣泛使用的技術之一是將資料標記為積極、消極和中性。例如,讓我們看看這些提到 @VerizonSupport 的推文:
“親愛的 @verizonsupport,你們在達拉斯的服務簡直是 💩……我用了你們十多年了,這是你們歷史最低水平。我說的是完全沒網。” → 會被標記為“消極”。
“@verizonsupport 我給你發了私信” → 會被標記為“中性”。
“感謝 @verizonsupport 的 michelle 等人,他們幫助我解決了手機沒收到的問題。訂單已成功取消,今天在商場的蘋果店訂購了自取。” → 會被標記為“積極”。
情感分析允許大規模、即時地處理資料。例如,你想分析數千條推文、產品評論或支援工單嗎?你無需手動整理這些資料,而是可以使用情感分析來自動了解人們對特定話題的看法,為資料驅動的決策獲取洞見,並自動化業務流程。
情感分析被廣泛應用於各種場景,例如:
- 分析社交媒體提及,以瞭解人們如何談論你的品牌與競爭對手。
- 分析調查和產品評論的反饋,以快速瞭解客戶喜歡和不喜歡你產品的哪些方面。
- 即時分析傳入的支援工單,以檢測憤怒的客戶並採取相應措施,防止客戶流失。
2. 如何使用 Python 和預訓練的情感分析模型
既然我們已經介紹了什麼是情感分析,我們就可以開始玩轉一些情感分析模型了!🎉
在 Hugging Face Hub 上,我們正在構建最大的公開可用的模型和資料集集合,以普及機器學習 🚀。在 Hub 中,你可以找到超過 27,000 個由 AI 社群共享的模型,它們在情感分析、目標檢測、文字生成、語音識別等任務上都達到了最先進的效能。Hub 是免費使用的,並且大多數模型都有一個可以在瀏覽器中直接測試的小部件!
Hub 上有超過 215 個公開可用的情感分析模型,並且將它們與 Python 整合只需 5 行程式碼:
pip install -q transformers
from transformers import pipeline
sentiment_pipeline = pipeline("sentiment-analysis")
data = ["I love you", "I hate you"]
sentiment_pipeline(data)
此程式碼片段使用 pipeline 類 從 Hub 中可用的模型進行預測。它使用情感分析的預設模型來分析文字列表 `data`,並輸出以下結果:
[{'label': 'POSITIVE', 'score': 0.9998},
{'label': 'NEGATIVE', 'score': 0.9991}]
你可以透過提供模型的名稱來使用更適合你的語言或用例的特定情感分析模型。例如,如果你想要一個用於推文的情感分析模型,你可以指定模型 ID:
specific_model = pipeline(model="finiteautomata/bertweet-base-sentiment-analysis")
specific_model(data)
你可以使用這個 Colab notebook 用你自己的資料測試這些模型。
- Twitter-roberta-base-sentiment 是一個在約 5800 萬條推文上訓練的 roBERTa 模型,並針對情感分析進行了微調。微調是指採用一個預訓練的大型語言模型(例如本例中的 roBERTa),然後用額外的訓練資料對其進行調整,使其能夠執行第二個類似的任務(例如情感分析)。
- Bert-base-multilingual-uncased-sentiment 是一個針對六種語言的產品評論進行情感分析微調的模型:英語、荷蘭語、德語、法語、西班牙語和義大利語。
- Distilbert-base-uncased-emotion 是一個為檢測文字中的情緒而微調的模型,包括悲傷、喜悅、愛、憤怒、恐懼和驚訝。
你是否有興趣用西班牙語、法語、義大利語或德語等語言進行情感分析?在 Hub 上,你會找到許多針對不同用例和約 28 種語言微調的模型。你可以在此處檢視情感分析模型的完整列表,並在左側根據你感興趣的語言進行篩選。
3. 構建你自己的情感分析模型
使用 Hub 上公開可用的預訓練模型是立即開始進行情感分析的好方法。這些模型使用 Transformer 等深度學習架構,在情感分析和其他機器學習任務上達到了最先進的效能。然而,你可以用自己的資料微調模型,以進一步改善情感分析結果,並在你的特定用例中獲得額外的準確性提升。
在本節中,我們將介紹兩種如何用你自己的資料和標準微調情感分析模型的方法。第一種方法使用 🤗Transformers 的 Trainer API,這是一個擁有 5 萬顆星和超過 1000 名貢獻者的開源庫,需要更多的編碼和經驗。第二種方法更簡單直接,它使用 AutoNLP,這是一個無需程式碼或機器學習經驗即可自動訓練、評估和部署最先進 NLP 模型的工具。
讓我們深入瞭解!
a. 使用 Python 微調模型
在本教程中,你將使用 IMDB 資料集來微調一個用於情感分析的 DistilBERT 模型。
IMDB 資料集 包含 25,000 條用於訓練模型的帶情感標籤的電影評論和 25,000 條用於測試的電影評論。DistilBERT 是 BERT 的一個更小、更快、更經濟的版本。它比 BERT 小 40%,執行速度快 60%,同時保留了 BERT 超過 95% 的效能。你將使用 IMDB 資料集微調一個 DistilBERT 模型,使其能夠對電影評論是積極還是消極進行分類。一旦訓練好模型,你就可以用它來分析新資料了!⚡️
我們建立了這個 notebook,以便你可以在 Google Colab 中跟隨本教程進行操作。
1. 啟用 GPU 並安裝依賴項
第一步,讓我們將 Google Colab 設定為使用 GPU(而不是 CPU),以便更快地訓練模型。你可以透過進入選單,點選“執行時” > “更改執行時型別”,然後選擇“GPU”作為硬體加速器來完成此操作。完成後,你應該透過執行以下程式碼來檢查 GPU 是否在我們的 notebook 中可用:
import torch
torch.cuda.is_available()
然後,安裝本教程中將要使用的庫:
!pip install datasets transformers huggingface_hub
你還應該安裝 `git-lfs` 以在我們的模型倉庫中使用 git:
!apt-get install git-lfs
2. 預處理資料
你需要資料來微調 DistilBERT 進行情感分析。所以,讓我們使用 🤗Datasets 庫來下載和預處理 IMDB 資料集,以便你可以用這些資料來訓練你的模型:
from datasets import load_dataset
imdb = load_dataset("imdb")
IMDB 是一個巨大的資料集,所以讓我們建立更小的資料集以實現更快的訓練和測試:
small_train_dataset = imdb["train"].shuffle(seed=42).select([i for i in list(range(3000))])
small_test_dataset = imdb["test"].shuffle(seed=42).select([i for i in list(range(300))])
為了預處理我們的資料,你將使用 DistilBERT tokenizer:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")
接下來,你將透過使用 map 方法為我們資料集的兩個部分(訓練集和測試集)準備模型的文字輸入:
def preprocess_function(examples):
return tokenizer(examples["text"], truncation=True)
tokenized_train = small_train_dataset.map(preprocess_function, batched=True)
tokenized_test = small_test_dataset.map(preprocess_function, batched=True)
為了加速訓練,讓我們使用一個 data_collator 將你的訓練樣本轉換為 PyTorch 張量,並用適量的填充將它們連線起來。
from transformers import DataCollatorWithPadding
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
3. 訓練模型
預處理完成後,你就可以開始訓練你的模型了 🚀
你將丟棄 DistilBERT 模型的預訓練頭,並用一個為情感分析微調的分類頭替換它。這使你能夠將 DistilBERT 的知識轉移到你的自定義模型中 🔥
為了訓練,你將使用 Trainer API,它專門為微調 Transformers🤗 模型(如 DistilBERT、BERT 和 RoBERTa)而最佳化。
首先,讓我們將 DistilBERT 定義為你的基礎模型:
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased", num_labels=2)
然後,讓我們定義你將用來評估你的微調模型效果的指標(準確率和 f1 分數):
import numpy as np
from datasets import load_metric
def compute_metrics(eval_pred):
load_accuracy = load_metric("accuracy")
load_f1 = load_metric("f1")
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
accuracy = load_accuracy.compute(predictions=predictions, references=labels)["accuracy"]
f1 = load_f1.compute(predictions=predictions, references=labels)["f1"]
return {"accuracy": accuracy, "f1": f1}
接下來,讓我們登入到你的 Hugging Face 賬戶,以便你可以管理你的模型倉庫。`notebook_login` 將在你的 notebook 中啟動一個小部件,你需要在其中新增你的 Hugging Face token。
from huggingface_hub import notebook_login
notebook_login()
你快要成功了!在訓練我們的模型之前,你需要定義訓練引數,並用你到目前為止構建的所有物件定義一個 Trainer:
from transformers import TrainingArguments, Trainer
repo_name = "finetuning-sentiment-model-3000-samples"
training_args = TrainingArguments(
output_dir=repo_name,
learning_rate=2e-5,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
num_train_epochs=2,
weight_decay=0.01,
save_strategy="epoch",
push_to_hub=True,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_train,
eval_dataset=tokenized_test,
tokenizer=tokenizer,
data_collator=data_collator,
compute_metrics=compute_metrics,
)
現在,是時候在情感分析資料集上微調模型了!🙌 你只需呼叫 Trainer 的 `train()` 方法:
trainer.train()
瞧!你為情感分析微調了一個 DistilBERT 模型!🎉
訓練時間取決於你使用的硬體和資料集中的樣本數量。在我們的例子中,使用 GPU 並用 3,000 個樣本微調模型,花費了近 10 分鐘。用於訓練模型的樣本越多,模型就越準確,但訓練速度可能會顯著減慢。
接下來,讓我們計算評估指標,看看你的模型效果如何:
trainer.evaluate()
在我們的例子中,我們得到了 88% 的準確率和 89% 的 f1 分數。對於一個僅用 3,000 個樣本訓練的情感分析模型來說,相當不錯!
4. 使用模型分析新資料
現在你已經訓練了一個情感分析模型,讓我們用它來分析新資料並獲得 🤖 預測!這釋放了機器學習的力量;使用模型大規模、即時地自動分析資料 ⚡️
首先,讓我們將模型上傳到 Hub:
trainer.push_to_hub()
現在你已經將模型推送到 Hub,你可以使用 pipeline class 來分析兩條新的電影評論,看看你的模型如何用僅僅兩行程式碼預測它們的情感 🤯
from transformers import pipeline
sentiment_model = pipeline(model="federicopascual/finetuning-sentiment-model-3000-samples")
sentiment_model(["I love this move", "This movie sucks!"])
以下是我們的模型的預測結果:
[{'label': 'LABEL_1', 'score': 0.9558},
{'label': 'LABEL_0', 'score': 0.9413}]
在 IMDB 資料集中,`Label 1` 表示積極,`Label 0` 表示消極。相當不錯!🔥
b. 使用 AutoNLP 訓練情感模型
AutoNLP 是一個無需程式碼即可訓練最先進機器學習模型的工具。它提供了一個友好且易於使用的使用者介面,你只需上傳資料即可訓練自定義模型。AutoNLP 會自動用你的資料微調各種預訓練模型,負責超引數調整,併為你的用例找到最佳模型。所有使用 AutoNLP 訓練的模型都會被部署並準備好用於生產。
使用 AutoNLP 訓練情感分析模型非常簡單,只需點選幾下即可完成 🤯。讓我們來試試吧!
第一步,讓我們獲取一些資料!你將使用 Sentiment140,一個流行的情感分析資料集,由帶有 3 種情感標籤的 Twitter 訊息組成:0(消極),2(中性),和 4(積極)。該資料集相當大;它包含 1,600,000 條推文。由於你不需要這麼多資料來初步體驗 AutoNLP 並訓練你的第一個模型,我們準備了一個包含 3,000 個樣本的 Sentiment140 資料集的小版本,你可以從這裡下載。資料集看起來是這樣的:
接下來,讓我們在 AutoNLP 上建立一個新專案來訓練 5 個候選模型。
然後,上傳資料集並對映文字列和目標列。
新增資料集後,轉到“Trainings”選項卡並接受定價以開始訓練你的模型。AutoNLP 的定價可以低至每個模型 10 美元。
幾分鐘後,AutoNLP 訓練完所有模型,並顯示了所有模型的效能指標。
最佳模型的準確率達到了 77.87% 🔥 對於一個僅用 3,000 個樣本訓練的推文情感分析模型來說,相當不錯!
所有這些模型都會自動上傳到 Hub 並部署用於生產。你可以使用這些模型中的任何一個,透過使用 pipeline class 立即開始分析新資料,如本文前面部分所示。
4. 使用情感分析和 Python 分析推文
在最後一部分,你將把本文中學到的知識付諸實踐,完成一個有趣的小專案:用情感分析來分析關於 NFT 的推文!
首先,你將使用 Tweepy,一個易於使用的 Python 庫,透過 Twitter API 獲取提及 #NFTs 的推文。然後,你將使用一個來自 🤗Hub 的情感分析模型來分析這些推文。最後,你將建立一些視覺化圖表來探索結果並發現一些有趣的洞見。
你可以使用這個 notebook 來跟隨本教程。讓我們開始吧!
1. 安裝依賴項
首先,讓我們安裝本教程中將要使用的所有庫:
!pip install -q transformers tweepy wordcloud matplotlib
2. 設定 Twitter API 憑證
接下來,你將設定與 Twitter API 互動的憑證。首先,你需要在 Twitter 上註冊一個開發者賬戶。然後,你必須建立一個新專案並連線一個應用程式以獲取 API 金鑰和令牌。你可以按照這個分步指南來獲取你的憑證。
一旦你有了 API 金鑰和令牌,讓我們用 Tweepy 建立一個與 Twitter API 互動的包裝器:
import tweepy
# Add Twitter API key and secret
consumer_key = "XXXXXX"
consumer_secret = "XXXXXX"
# Handling authentication with Twitter
auth = tweepy.AppAuthHandler(consumer_key, consumer_secret)
# Create a wrapper for the Twitter API
api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
3. 使用 Tweepy 搜尋推文
此時,你已準備好開始使用 Twitter API 收集推文了 🎉。你將使用 Tweepy Cursor 來提取 1,000 條提及 #NFTs 的推文:
# Helper function for handling pagination in our search and handle rate limits
def limit_handled(cursor):
while True:
try:
yield cursor.next()
except tweepy.RateLimitError:
print('Reached rate limite. Sleeping for >15 minutes')
time.sleep(15 * 61)
except StopIteration:
break
# Define the term you will be using for searching tweets
query = '#NFTs'
query = query + ' -filter:retweets'
# Define how many tweets to get from the Twitter API
count = 1000
# Let's search for tweets using Tweepy
search = limit_handled(tweepy.Cursor(api.search,
q=query,
tweet_mode='extended',
lang='en',
result_type="recent").items(count))
4. 對推文進行情感分析
現在,你可以將新學到的技能付諸實踐,對你的資料進行情感分析了!🎉
你將使用 Hub 上一個為推文情感分析微調的模型。與本文其他部分一樣,你將使用 pipeline class 來用此模型進行預測:
from transformers import pipeline
# Set up the inference pipeline using a model from the 🤗 Hub
sentiment_analysis = pipeline(model="finiteautomata/bertweet-base-sentiment-analysis")
# Let's run the sentiment analysis on each tweet
tweets = []
for tweet in search:
try:
content = tweet.full_text
sentiment = sentiment_analysis(content)
tweets.append({'tweet': content, 'sentiment': sentiment[0]['label']})
except:
pass
5. 探索情感分析結果
人們在 Twitter 上是如何談論 NFT 的?他們的看法大多是積極的還是消極的?讓我們探索情感分析的結果來找出答案!
首先,讓我們將結果載入到一個 dataframe 中,看看每種情感標籤下的推文示例:
import pandas as pd
# Load the data in a dataframe
df = pd.DataFrame(tweets)
pd.set_option('display.max_colwidth', None)
# Show a tweet for each sentiment
display(df[df["sentiment"] == 'POS'].head(1))
display(df[df["sentiment"] == 'NEU'].head(1))
display(df[df["sentiment"] == 'NEG'].head(1))
輸出
Tweet: @NFTGalIery Warm, exquisite and elegant palette of charming beauty Its price is 2401 ETH. \nhttps://#/Ej3BfVOAqc\n#NFTs #NFTartists #art #Bitcoin #Crypto #OpenSeaNFT #Ethereum #BTC Sentiment: POS
Tweet: How much our followers made on #Crypto in December:\n#DAPPRadar airdrop — $200\nFree #VPAD tokens — $800\n#GasDAO airdrop — up to $1000\nStarSharks_SSS IDO — $3500\nCeloLaunch IDO — $3000\n12 Binance XMas #NFTs — $360 \nTOTAL PROFIT: $8500+\n\nJoin and earn with us https://#/fS30uj6SYx Sentiment: NEU
Tweet: Stupid guy #2\nhttps://#/8yKzYjCYIl\n\n#NFT #NFTs #nftcollector #rarible https://#/O4V19gMmVk Sentiment: NEG
然後,讓我們看看每種情感有多少條推文,並可視化這些結果:
# Let's count the number of tweets by sentiments
sentiment_counts = df.groupby(['sentiment']).size()
print(sentiment_counts)
# Let's visualize the sentiments
fig = plt.figure(figsize=(6,6), dpi=100)
ax = plt.subplot(111)
sentiment_counts.plot.pie(ax=ax, autopct='%1.1f%%', startangle=270, fontsize=12, label="")
有趣的是,大多數關於 NFT 的推文都是積極的(56.1%),幾乎沒有消極的。
(2.0%):
最後,讓我們透過建立一個詞雲來看看每種情感中哪些詞語比較突出:
from wordcloud import WordCloud
from wordcloud import STOPWORDS
# Wordcloud with positive tweets
positive_tweets = df['tweet'][df["sentiment"] == 'POS']
stop_words = ["https", "co", "RT"] + list(STOPWORDS)
positive_wordcloud = WordCloud(max_font_size=50, max_words=100, background_color="white", stopwords = stop_words).generate(str(positive_tweets))
plt.figure()
plt.title("Positive Tweets - Wordcloud")
plt.imshow(positive_wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
# Wordcloud with negative tweets
negative_tweets = df['tweet'][df["sentiment"] == 'NEG']
stop_words = ["https", "co", "RT"] + list(STOPWORDS)
negative_wordcloud = WordCloud(max_font_size=50, max_words=100, background_color="white", stopwords = stop_words).generate(str(negative_tweets))
plt.figure()
plt.title("Negative Tweets - Wordcloud")
plt.imshow(negative_wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
與積極推文相關的一些詞語包括 Discord、Ethereum、Join、Mars4 和 Shroom。
相比之下,與消極推文相關的詞語包括:cookies chaos、Solana 和 OpenseaNFT。
就是這樣!僅用幾行 Python 程式碼,你就能夠收集推文,用情感分析進行分析,並建立一些很酷的視覺化來分析結果!很酷,對吧?
5. 總結
使用 Python 進行情感分析從未如此簡單!像 🤗Transformers 和 🤗Hub 這樣的工具讓所有開發者都能接觸到情感分析。你只需幾行程式碼就可以使用開源、預訓練的模型進行情感分析 🔥
你想用自己的資料訓練一個自定義的情感分析模型嗎?小菜一碟!你可以使用 Trainer API 來微調一個模型,在大型語言模型的基礎上構建並獲得最先進的結果。如果你想要更簡單的方法,可以使用 AutoNLP,只需上傳資料即可訓練自定義機器學習模型。
如果你有任何問題,Hugging Face 社群可以幫助回答和/或從中受益,請在 Hugging Face 論壇中提問。另外,加入我們的 Discord 伺服器,與我們以及 Hugging Face 社群進行交流。