使用 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 社区进行交流。