Press "Enter" to skip to content

使用Python入门情感分析

情感分析是根据数据的情感自动进行标记的自动化过程,如积极、消极和中性。情感分析使公司能够在大规模上分析数据、发现洞察力并自动化流程。

过去,情感分析通常只限于研究人员、机器学习工程师或具有自然语言处理经验的数据科学家。然而,近年来,人工智能社区已经构建了让大众能够访问机器学习的出色工具。现在,你可以使用几行代码进行情感分析,而无需任何机器学习经验!🤯

在本指南中,您将学到使用Python进行情感分析的一切,包括:

  1. 什么是情感分析?
  2. 如何使用预训练的情感分析模型进行Python编程
  3. 如何构建自己的情感分析模型
  4. 如何使用情感分析分析推文

让我们开始吧!🚀

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社区交流。

Leave a Reply

Your email address will not be published. Required fields are marked *