情感分析是根据数据的情感自动进行标记的自动化过程,如积极、消极和中性。情感分析使公司能够在大规模上分析数据、发现洞察力并自动化流程。
过去,情感分析通常只限于研究人员、机器学习工程师或具有自然语言处理经验的数据科学家。然而,近年来,人工智能社区已经构建了让大众能够访问机器学习的出色工具。现在,你可以使用几行代码进行情感分析,而无需任何机器学习经验!🤯
在本指南中,您将学到使用Python进行情感分析的一切,包括:
- 什么是情感分析?
- 如何使用预训练的情感分析模型进行Python编程
- 如何构建自己的情感分析模型
- 如何使用情感分析分析推文
让我们开始吧!🚀
1. 什么是情感分析?
情感分析是一种自然语言处理技术,用于识别给定文本的极性。情感分析有不同的变体,但最常用的技术之一是将数据标记为积极、消极和中性。例如,让我们看一下这些提到 @VerizonSupport 的推文:
-
“dear @verizonsupport your service is straight 💩 in dallas.. been with y’all over a decade and this is all time low for y’all. i’m talking no internet at all.” → 会被标记为 “消极”。
-
“@verizonsupport ive sent you a dm” → 会被标记为 “中性”。
-
“thanks to michelle et al at @verizonsupport who helped push my no-show-phone problem along. order canceled successfully and ordered this for pickup today at the apple store in the mall.” → 会被标记为 “积极”。
情感分析允许以大规模和实时方式处理数据。例如,您想要分析成千上万条推文、产品评论或支持票吗?您可以使用情感分析自动理解人们如何谈论特定主题,获取数据驱动决策的洞察力并自动化业务流程,而不是手动整理这些数据。
情感分析在各种应用中被广泛使用,例如:
- 分析社交媒体提及,了解人们如何谈论您的品牌与竞争对手。
- 分析调查和产品评论的反馈,快速了解客户对产品的喜好和不喜欢。
- 实时分析传入的支持票据,检测愤怒的客户并根据情况采取措施以防止流失。
2. 如何使用预训练的情感分析模型进行Python编程
现在我们已经了解了情感分析是什么,我们可以开始使用一些情感分析模型了!🎉
在 Hugging Face Hub 上,我们正在构建最大的可公开获取的模型和数据集集合,以实现机器学习的大众化🚀。在 Hub 上,您可以找到超过 27,000 个由 AI 社区共享的模型,这些模型在情感分析、目标检测、文本生成、语音识别等任务上具有最先进的性能。Hub 是免费使用的,大多数模型都有一个小部件,可以直接在您的浏览器上测试它们!
Hub 上有超过 215 个公开可用的情感分析模型,只需要 5 行代码即可将它们与 Python 集成:
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笔记本使用您自己的数据来测试这些模型:
以下是一些我们推荐检查的用于情感分析的流行模型:
- Twitter-roberta-base-sentiment 是一个在约5800万条推文上训练并针对情感分析进行微调的roBERTa模型。微调是指将预训练的大型语言模型(例如在本例中的roBERTa)与附加的训练数据一起微调,以使其执行第二个类似的任务(例如情感分析)。
- Bert-base-multilingual-uncased-sentiment 是一个在六种语言(英语、荷兰语、德语、法语、西班牙语和意大利语)的产品评论上进行情感分析微调的模型。
- Distilbert-base-uncased-emotion 是一个在文本中进行情绪检测微调的模型,包括悲伤、喜悦、爱、愤怒、恐惧和惊讶。
您是否有兴趣在西班牙语、法语、意大利语或德语等语言中进行情感分析?在Hub上,您将找到许多针对不同用例和约28种语言进行微调的模型。您可以在此处查看完整的情感分析模型列表,并根据您感兴趣的语言进行过滤。
3. 构建自己的情感分析模型
使用Hub上公开可用的预训练模型是立即开始进行情感分析的好方法。这些模型使用了诸如transformers等深度学习架构,在情感分析和其他机器学习任务上实现了最先进的性能。然而,您可以使用自己的数据微调模型,以进一步提高情感分析结果,并在您特定的用例中获得额外的准确性提升。
在本节中,我们将介绍两种使用您自己的数据和标准微调模型的方法。第一种方法使用🤗Transformers的Trainer API,这是一个拥有50000颗星星和1000多位贡献者的开源库,需要一些编码和经验。第二种方法更简单直接,使用AutoNLP,这是一个无需代码或机器学习经验即可自动训练、评估和部署最先进的NLP模型的工具。
让我们开始吧!
a. 使用Python微调模型
在本教程中,您将使用IMDB数据集对DistilBERT模型进行情感分析微调。
IMDB数据集包含25000条标记有情感的电影评论,用于训练模型,以及25000条用于测试模型的电影评论。DistilBERT是BERT的一个更小、更快、更便宜的版本。它比BERT小40%,运行速度比BERT快60%,同时保留了BERT性能的95%以上。您将使用IMDB数据集对DistilBERT模型进行微调,使其能够将电影评论分类为积极或消极。训练完模型后,您将使用它来分析新的数据!⚡️
我们创建了这个笔记本,以便您可以在本教程中通过Google Colab使用它。
1. 激活GPU并安装依赖项
作为第一步,让我们设置Google Colab使用GPU(而不是CPU)来加速训练模型。您可以通过转到菜单,点击“Runtime”>“更改运行时类型”,然后选择“GPU”作为硬件加速器来实现。一旦您这样做了,您应该通过运行以下代码检查GPU是否可用于我们的笔记本:
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分词器:
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,该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
将在您的笔记本中启动一个小部件,您需要在其中添加您的Hugging Face令牌:
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和3000个样本对模型进行微调大约需要10分钟。使用更多样本来训练模型,模型的准确性将会更高,但训练时间可能会显著延长。
接下来,让我们计算评估指标,看看你的模型有多好:
trainer.evaluate()
在我们的案例中,我们获得了88%的准确率和89%的f1得分。对于一个只用3000个样本训练的情感分析模型来说,相当不错!
4. 使用模型分析新数据
既然你已经训练了一个情感分析模型,让我们使用它来分析新数据并获得🤖预测!这就是机器学习的威力所在:使用模型自动分析大规模、实时的数据⚡️
首先,让我们将模型上传到Hub:
trainer.push_to_hub()
现在你已经将模型推送到了Hub,你可以使用它的pipeline类来分析两个新的电影评论,并用只有两行代码的方式查看你的模型对情感的预测🤯:
from transformers import pipeline
sentiment_model = pipeline(model="federicopascual/finetuning-sentiment-model-3000-samples")
sentiment_model(["我喜欢这部电影", "这部电影太烂了!"])
这是我们模型的预测结果:
[{'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种情感(0表示消极,2表示中性,4表示积极)的Twitter消息的流行情感分析数据集。该数据集非常庞大,包含160万条推文。由于你不需要这么多数据来熟悉AutoNLP并训练你的第一个模型,我们准备了一个包含3000个样本的Sentiment140数据集的较小版本,你可以从这里下载。数据集的样式如下:
Sentiment 140 数据集
接下来,在AutoNLP上创建一个新项目,训练5个候选模型:
在AutoNLP上创建新项目
然后,上传数据集并映射文本列和目标列:
向AutoNLP添加数据集
添加数据集后,转到“训练”选项卡并接受定价以开始训练模型。AutoNLP的定价可以低至每个模型10美元:
向AutoNLP添加数据集
几分钟后,AutoNLP已经训练了所有模型,并展示了它们的性能指标:
AutoNLP训练的情感分析模型
最佳模型的准确率为77.87%🔥,对于仅使用3000个样本训练的推文情感分析模型来说,相当不错!
所有这些模型都自动上传到了Hub并部署用于生产。你可以使用其中任何一个模型,通过使用pipeline类来立即开始分析新数据,就像前面的部分展示的那样。
4. 使用情感分析和Python分析推文
在本文的最后一部分,你将把你在前面学到的内容付诸实践,完成一个有趣的小项目:使用情感分析来分析关于 NFT 的推文!
首先,你将使用Tweepy这个易于使用的Python库,使用Twitter API获取提到#NFTs的推文。然后,你将使用🤗Hub中的情感分析模型来分析这些推文。最后,你将创建一些可视化图表来探索结果并找到一些有趣的见解。
您可以使用这个笔记本来跟随本教程。让我们开始吧!
1. 安装依赖
首先,让我们安装本教程中将使用的所有库:
!pip install -q transformers tweepy wordcloud matplotlib
2. 设置 Twitter API 凭据
接下来,您将设置用于与 Twitter API 交互的凭据。首先,您需要在 Twitter 上注册一个开发者帐户。然后,您需要创建一个新的项目并连接一个应用程序,以获取 API 密钥和令牌。您可以按照这个逐步指南来获取您的凭据。
获得 API 密钥和令牌之后,让我们使用 Tweepy 创建一个与 Twitter API 交互的包装器:
import tweepy
# 添加 Twitter API 密钥和密钥
consumer_key = "XXXXXX"
consumer_secret = "XXXXXX"
# 使用 Twitter 进行身份验证
auth = tweepy.AppAuthHandler(consumer_key, consumer_secret)
# 创建一个用于 Twitter API 的包装器
api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
3. 使用 Tweepy 搜索推文
此时,您已经准备好开始使用 Twitter API 收集推文🎉。您将使用 Tweepy Cursor 提取包含 #NFTs 的 1000 条推文:
# 用于处理搜索的分页和速率限制的辅助函数
def limit_handled(cursor):
while True:
try:
yield cursor.next()
except tweepy.RateLimitError:
print('已达到速率限制。等待超过 15 分钟')
time.sleep(15 * 61)
except StopIteration:
break
# 定义用于搜索推文的术语
query = '#NFTs'
query = query + ' -filter:retweets'
# 定义从 Twitter API 获取多少条推文
count = 1000
# 使用 Tweepy 搜索推文
search = limit_handled(tweepy.Cursor(api.search,
q=query,
tweet_mode='extended',
lang='en',
result_type="recent").items(count))
4. 对推文运行情感分析
现在,您可以将我们的新技能付诸实践,并对您的数据运行情感分析!🎉
您将使用 Hub 上可用的一个模型,该模型经过了推文情感分析的微调。与本文其他部分一样,您将使用 pipeline 类来使用此模型进行预测:
from transformers import pipeline
# 使用 🤗 Hub 上的一个模型设置推理管道
sentiment_analysis = pipeline(model="finiteautomata/bertweet-base-sentiment-analysis")
# 让我们对每个推文进行情感分析
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 上如何谈论 NFTs?他们主要是积极还是消极?让我们探索情感分析的结果来找出答案!
首先,让我们将结果加载到一个数据框中,并查看每种情感标签的推文示例:
import pandas as pd
# 将数据加载到数据框中
df = pd.DataFrame(tweets)
pd.set_option('display.max_colwidth', None)
# 显示每种情感的一个推文
display(df[df["sentiment"] == 'POS'].head(1))
display(df[df["sentiment"] == 'NEU'].head(1))
display(df[df["sentiment"] == 'NEG'].head(1))
输出:
推文:@NFTGalIery 温暖、精致、优雅的迷人美丽调色板 它的价格是 2401 ETH。\nhttps://t.co/Ej3BfVOAqc\n#NFTs #NFTartists #art #Bitcoin #Crypto #OpenSeaNFT #Ethereum #BTC 情感:POS
推文:12 月份我们的关注者在 #Crypto 上赚了多少钱:\n#DAPPRadar 空投 — $200\n免费 #VPAD 代币 — $800\n#GasDAO 空投 — 高达 $1000\nStarSharks_SSS IDO — $3500\nCeloLaunch IDO — $3000\n12 个币安圣诞 #NFTs — $360 \n总利润:$8500+\n\n加入我们一起赚钱 https://t.co/fS30uj6SYx 情感:NEU
推文:愚蠢的家伙 #2\nhttps://t.co/8yKzYjCYIl\n\n#NFT #NFTs #nftcollector #rarible https://t.co/O4V19gMmVk 情感:NEG
接下来,让我们看一下每种情感的推文数量,并可视化这些结果:
# 让我们通过情感计算推文的数量
sentiment_counts = df.groupby(['sentiment']).size()
print(sentiment_counts)
# 让我们可视化情感
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%):
NFT推文的情感分析结果
最后,让我们通过创建词云来查看每种情感中突出的词汇:
from wordcloud import WordCloud
from wordcloud import STOPWORDS
# 积极推文的词云
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("积极推文 - 词云")
plt.imshow(positive_wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
# 消极推文的词云
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("消极推文 - 词云")
plt.imshow(negative_wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
一些与积极推文相关的词汇包括Discord(聊天平台)、以太坊(一种加密货币)、加入、Mars4和Shroom(一种NFT平台):
积极推文的词云
相反,与消极推文相关的词汇包括:cookies chaos(混乱的Cookie)、Solana(一种加密货币)和OpenseaNFT(一种NFT平台):
消极推文的词云
就是这样!只需几行Python代码,您就能够收集推文,进行情感分析并创建一些很酷的可视化图表来分析结果!非常酷,对吧?
5. 总结
使用Python进行情感分析从未如此简单!诸如🤗Transformers和🤗Hub之类的工具使情感分析对所有开发人员都可访问。您可以仅使用几行代码就可以使用开源的预训练模型进行情感分析🔥
您想使用自己的数据训练一个自定义的情感分析模型吗?轻而易举!您可以使用Trainer API微调模型,建立在大型语言模型之上,并获得最先进的结果。如果您希望更简单一些,您可以使用AutoNLP通过简单上传数据来训练自定义的机器学习模型。
如果您有问题,Hugging Face社区可以帮助您回答问题,或从中受益,请在Hugging Face论坛上提问。此外,加入我们的Discord服务器与我们和Hugging Face社区交流。