用Python检测埃隆-马斯克的推文的情绪
通过翻阅埃隆的推文了解如何进行情感分析
几天前,我们做了一个关于Python的NLP介绍,得到了一些非常积极的反馈,因此我决定写一个我喜欢的关于NLP的用例,也就是情感分析。
虽然我们已经介绍了一些什么是情感分析以及如何使用Python,但我们将更详细地回顾这个主题,并使用实际数据和实际例子。我们将使用来自Twitter的文本数据,所以我相信这将是非常有趣的
像往常一样,你可以使用下面的jupyter笔记本跟随所有的步骤,或者你可以自己写代码。
情感分析
让我们先简单回顾一下什么是情感分析。情感分析可以识别对一个主题或信息(例如,一条推文)的态度。我们可以将文本中的情绪识别为正面、负面或中性。
情绪分析在现实世界中有广泛的应用,从营销活动的报告、用户反馈的评估和目录、评论、推文等。
为什么是Twitter,为什么是Musk?
推文是这种分析的甜头。每条推特都是一组有限的信息(目前最多280个字符),使其更容易处理。此外,Twitter拥有绝大多数的公共档案,与Facebook或其他类似的网站相反。
关键的一点是Twitter的API,它是完整和强大的,使我们很容易提取我们需要的数据。
那么问题来了,为什么是马斯克?虽然从理论上讲,你可以对任何个人资料,甚至任何推文的集合,甚至来自不同个人资料的推文应用同样的步骤,但我决定去找马斯克,因为,为什么不呢?他是推特上的超级明星之一,我认为看看他在那里谈些什么会很酷、很刺激。
现在我们把这个问题解决了,让我们开始吧。
要求
我们的项目需要一些库来处理推文、数据集、图表,以及进行实际的情感分析。
让我们在我们的笔记本上把它们设置好:
!pip3 install tweepy
!pip3 install textblob
!pip3 install pandas
!pip3 install matplotlib
!pip3 install wordcloud
设置Twitter
在我们开始写代码之前,我们需要确保我们有Twitter的API密钥来检索我们分析所需的推文。如果你还没有,请到apps.twitter.com,创建一个Twitter开发者的账户,这样你就必须申请这个权限并回答一些问题。
来自Twitter的批准过程可能需要24至48小时。之后,你会得到你的API密钥和访问令牌。
然后,连接到Twitter接收数据就超级简单了,只需导入tweepy库,登录,并按如下方式检索:
import tweepy
api_key = "AdvX3WxpD...5qnCT05AlS..."
api_secret_key = "MjhprKWg6rzUCg1jeY0JwTu...KuDwp3Sc2qvkULB7YKP4r..."
access_token = "10251182-Hx3MTRpSwb8gNPl...TvpX2DSn5HtZKEn67tJI..."
access_token_secret = "F3CpH4JgtXRfMlj5Jlsl...nniwgG1QzlkStwdiKws..."
# Create The Authenticate Object
authenticate = tweepy.OAuthHandler(api_key, api_secret_key)
# Set The Access Token & Access Token Secret
authenticate.set_access_token(access_token, access_token_secret)
# Create The API Object
api = tweepy.API(authenticate, wait_on_rate_limit = True)
如果一切顺利,你可以使用下面的代码来测试你的连接:
tweets = api.user_timeline(screen_name = "elonmusk", count = 5, lang = "en", tweet_mode = "extended")
for tweet in tweets:
print(f"- {tweet.full_text}")
############################################
# Output
############################################
- 👀
- RT @Tesla: Cybertruck at Giga Texas https://t.co/c1RuektPnN
- 🎸🎸 Austin Rocks!! 🎸 🎸
- @Model3Owners Same with Berlin
- @Model3Owners Limited production of Model Y this year, high volume next year
如果一切顺利,你可以看到埃隆-马斯克的最后5条推文。
数据准备
我们已经拥有了获得推文所需的一切,并首先开始着手处理这些推文。让我们下载一个更重要的数据集,比方说,200条推文:
tweets = api.user_timeline(screen_name = "elonmusk", count = 200, lang = "en", tweet_mode = "extended")
现在,200条推文并不是一个任意的选择,而是我们在不使用分页的情况下用这种方法可以下载的最大数量。
接下来,推文中会有一堆我们不需要的数据,所以让我们创建一个pandas DataFrame,只加载推文信息,这样工作起来会更容易:
import pandas as pd
df = pd.DataFrame([tweet.full_text for tweet in tweets], columns = ["tweet"])
df.head()
| 推文 | |
|---|---|
| 0 | 👀 |
| 1 | RT @Tesla:Cybertruck at Giga Texas https://t.... |
| 2 | 🎸🎸奥斯汀震撼!!🎸 🎸 |
| 3 | @Model3Owners 与柏林一样 |
| 4 | @Model3Owners 限量生产Y型车 |
最后,让我们通过删除不相关的信息(至少对我们的目的而言)来清理文本,如标签、提及、转发和链接:
import re
# Clean The Data
def cleantext(text):
text = re.sub(r"@[A-Za-z0-9]+", "", text) # Remove Mentions
text = re.sub(r"#", "", text) # Remove Hashtags Symbol
text = re.sub(r"RT[\s]+", "", text) # Remove Retweets
text = re.sub(r"https?:\/\/\S+", "", text) # Remove The Hyper Link
return text
# Clean The Text
df["tweet"] = df["tweet"].apply(cleantext)
df.head()
| 推文 | |
|---|---|
| 0 | 👀 |
| 1 | :在Giga Texas的Cybertruck |
| 2 | 🎸 🎸 奥斯汀摇滚乐!🎸 🎸 |
| 3 | 与柏林相同 |
| 4 | 今年Y型车的产量有限,高... |
我们的清理方法相当简单,因为它只使用正则表达式来剥离一些块,但你可以在这里尽情地花哨。
捕捉每条推文的主观性和极性
正如我们在Python的NLP介绍中所解释的,一个流行的文本分析库叫做textblob,当用来评估文本的情感时,它将输出两个值,主观性和极性。
极性是一个介于-1和1之间的值,-1表示非常消极,+1表示非常积极。主观性的范围在0和1之间,指的是人的意见、情感,甚至是判断。数字越大,文本的主观性就越强。
让我们把这些信息捕捉到我们的DataFrame中,以便以后分析:
from textblob import TextBlob
# Get The Subjectivity
def sentiment_analysis(ds):
sentiment = TextBlob(ds["tweet"]).sentiment
return pd.Series([sentiment.subjectivity, sentiment.polarity])
# Adding Subjectivity & Polarity
df[["subjectivity", "polarity"]] = df.apply(sentiment_analysis, axis=1)
df
| 鸣叫 | 主观性 | 极性 | |
|---|---|---|---|
| 0 | 👀 | 0.000000 | 0.000000 |
| 1 | :在Giga Texas的Cybertruck | 0.000000 | 0.000000 |
| 2 | 🎸🎸 Austin Rocks!🎸 🎸 | 0.000000 | 0.000000 |
| 3 | 与柏林相同 | 0.125000 | 0.000000 |
| 4 | 今年Y型车产量有限,高... | 0.227619 | 0.029524 |
| ... | ... | ... | ... |
| 195 | 将没有手柄 | 0.000000 | 0.000000 |
| 196 | 如果有关于我的丑闻,请告诉我。 | 0.000000 | 0.000000 |
| 197 | _sci 这条评论线是 🔥 | 0.000000 | 0.000000 |
| 198 | 不要藐视DeFi | 0.000000 | 0.000000 |
| 199 | 👀 | 0.000000 | 0.000000 |
我们的数据集中的第一条和最后一条推文并没有说什么,但让我们看看我们还能发现什么。
创建一个词云
词云在前段时间的博客和一些信息图表中很流行,它们对于试图了解文本中最相关或最频繁的词语仍然很重要,或者像本案例中的一系列推文。
让我们根据马斯克的推文生成一个,看看我们是否能找出他在说什么。
import matplotlib.pyplot as plt
from wordcloud import WordCloud
allwords = " ".join([twts for twts in df["tweet"]])
wordCloud = WordCloud(width = 1000, height = 1000, random_state = 21, max_font_size = 119).generate(allwords)
plt.figure(figsize=(20, 20), dpi=80)
plt.imshow(wordCloud, interpolation = "bilinear")
plt.axis("off")
plt.show()
生成的词云
现在通过这个词云,我们可以看到一些我们也应该清理掉的词和表达方式,但我们也看到一些重要的词,如 "特斯拉"、"火箭"、"年"、"很快"。
对推文的极性进行分类
正如我们所说的,极性设计了文本的中性、积极和消极的内涵,但将该值作为数字可能会引起混淆,所以让我们用一个新的列来对数据进行编目,以定义准备被用户使用的极性:
# Compute The Negative, Neutral, Positive Analysis
def analysis(score):
if score < 0:
return "Negative"
elif score == 0:
return "Neutral"
else:
return "Positive"
# Create a New Analysis Column
df["analysis"] = df["polarity"].apply(analysis)
# Print The Data
df
| 鸣叫 | 主观性 | 极性 | 分析 | |
|---|---|---|---|---|
| 0 | 👀 | 0.000000 | 0.000000 | 中立 |
| 1 | :在Giga Texas的Cybertruck | 0.000000 | 0.000000 | 中立 |
| 2 | 🎸🎸 Austin Rocks!🎸 🎸 | 0.000000 | 0.000000 | 中立 |
| 3 | 与柏林相同 | 0.125000 | 0.000000 | 中立 |
| 4 | 今年Y型车产量有限,高... | 0.227619 | 0.029524 | 正面 |
| ... | ... | ... | ... | ... |
| 195 | 将没有手柄 | 0.000000 | 0.000000 | 中立 |
| 196 | 如果有关于我的丑闻,请联系... | 0.000000 | 0.000000 | 中立 |
| 197 | _sci 这条评论线是🔥 | 0.000000 | 0.000000 | 中性 |
| 198 | 不要藐视DeFi | 0.000000 | 0.000000 | 中立 |
| 199 | 👀 | 0.000000 | 0.000000 | 中性 |
让我们提取一些带有全文的正面和负面推文,看看它们都是什么内容
positive_tweets = df[df['analysis'] == 'Positive']
negative_tweets = df[df['analysis'] == 'Negative']
print('positive tweets')
for i, row in positive_tweets[:5].iterrows():
print(' -' + row['tweet'])
print('negative tweets')
for i, row in negative_tweets[:5].iterrows():
print(' -' + row['tweet'])
输出
positive tweets
- Limited production of Model Y this year, high volume next year
- Yeah, should be fully mobile later this year, so you can move it anywhere or use it on an RV or truck in motion. We need a few more satellite launches to achieve compete coverage & some key software upgrades.
- This is accurate. Service uptime, bandwidth & latency are improving rapidly. Probably out of beta this summer.
- One of many reasons that we need to make life multiplanetary!
- Certainly one of the largest. A company whose name rhymes with Shmoogle is pretty far ahead. But I think we’re the leader in shallow-minded AI haha!
negative tweets
- Probably late July
- Tesla is building up collision repair capability to help address the grief that you went through, but usually insurance companies make you go their “approved” collision repair partners. Tesla Insurance will make it smooth sailing.
- Congrats to NIO. That is a tough milestone.
- Almost ready with FSD Beta V9.0. Step change improvement is massive, especially for weird corner cases & bad weather. Pure vision, no radar.
-A monkey is literally playing a video game telepathically using a brain chip!!
由于他的推文的性质,有些可能是错误的分类,有些我甚至不确定......推文脱离了背景,本身并不总是有很大的意义。
埃隆总体上是积极的还是消极的?
现在让我们试着找出埃隆的推文是有更多的积极或消极的内涵。为此,我们将以主观性和极性为轴心,用散点图绘制所有推文。
plt.figure(figsize=(10, 8))
for i in range(0, df.shape[0]):
plt.scatter(df["polarity"][i], df["subjectivity"][i], color = "Red")
plt.title("Sentiment Analysis") # Add The Graph Title
plt.xlabel("Polarity") # Add The X-Label
plt.ylabel("Subjectivity") # Add The Y-Label
plt.show() # Showing The Graph
生成的散点图
这不是最漂亮的图表,但如果你想加强它,我建议你阅读如何用Python和seaborn制作漂亮的图。
除了外观,这个图表对我们说了什么?简单地看一下,我们可以看到在极性的正面有更多的点,这意味着他的推文一般来说是正面多于负面。
另一个简单的方法,是确定正面推文与负面推文的比例。
len(positive_tweets) / len(negative_tweets)
################
# Output
################
6.666
由于这个数字是积极的,而且比例相当高,我们也可以得出结论,埃隆是一个积极的人。
结论
只有有限的一组推文,而且不用写很多代码,我们就可以对埃隆的推特账户中发生的事情做一些相当有趣的分析,我们可以得出结论,你也许应该关注他,因为他通常是一个积极和相当有趣的人。
这个项目对我来说非常有趣,我希望你喜欢它,我们将在未来探索更多的文本分析,扩大我们在这个领域的知识。
谢谢你的阅读!