《哪吒2》数据分析实践——情感分析篇(国家三等奖项目开源)

        今年与朋友一起参与了全国市场调研分析大赛并获得国家三等奖,本人在团队中主要负责《哪吒2》电影的爬虫、情感分析、情感预测、相关性分析及岭回归分析、延伸热门电影预测的模块,以此开源供大家一起学习交流。

二、情感分析篇

        由于爬虫篇已经收集了各大网站的影评数据,但不知道观众具体的对这部电影的情感是怎么样的,因此本文使用snownlp库进行影评数据的情感分析。

        简要介绍一下snownlp,这个库是一个专门为中文文本处理设计的情感分析模型,基于“朴素贝叶斯算法”和“条件随机场(CRF)”等模型进行情感分析,由于代码中已经有分词的功能,因此不需要额外使用json进行分词处理,主要公式如下:

S=\frac{\sum_{i=1}^{n}w_{i}s_{i}}{\sum_{i=1}^{n}w_{i}}

其中,S为情感得分,w_{i}为情感词重量,s_{i}为情感词对应的评分,n为情感词总数。

        因为SnowNLP模型本身的训练语料库大多为电商数据,对影评内容得分预测的效果不佳。所以,本人在github上查找到了一个三百万条的影评训练语料库,里面进行了正向与负向的词性标注:三百万影评训练集(感恩),使用此语料库进行训练,并将《哪吒2》所有影评数据放入模型中求解情感得分,整理放入excel表格中,部分数据如下图,从左至右分别是评星、时间、影评、情感得分(列名分别为:star、date、sentence、sentiment_score):

由此图可见,求出的情感得分都比较符合影评的情感。所有的训练集、数据、结果等文件都放在本人的github中(稍后更新)。接下来让我们看看代码部分。

        由于是使用别人整理出来的训练语料库,我们只需要将训练集文件放在snownlp库里的文件中即可。进入python文件夹中的sit-packages里,找到snownlp,这个就是下载的snownlp库,打开sentiment,即打开情感得分功能文件,将新的训练文件复制进去替代原来的训练文件,注意,命名一定要是:sentiment.marshal.3,这样即可在代码中直接使用snownlp库了(这里我不想删除原来的训练集,所以就将原来的命名为origin-sentiment.marshal.3了):

最后,只需使用下面的代码,引库,sentence列即为影评内容列,输出得分结果即可:

from snownlp import SnowNLP
import pandas as pd
df = pd.read_excel('E:\desktop\汇总.xlsx')

# 计算情感得分
df['sentiment_score'] = df['sentence'].apply(lambda x: SnowNLP(x).sentiments)

# 保存结果
df.to_excel('E:\desktop\output_with_sentiment.xlsx', index=False)

        为了更清晰地展现情感的正负向,得到情感得分后,本人将得分大于0.5的归为正向情感得分,得分小于0.5的归为负向情感得分,绘制折线图,为了方便,将上面的得分代码与可视化代码合二为一,代码及结果图如下:

from snownlp import SnowNLP
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rc("font",family='SimHei')
matplotlib.rcParams['axes.unicode_minus'] =False

df = pd.read_excel('汇总.xlsx')

# 计算情感得分
df['sentiment_score'] = df['sentence'].apply(lambda x: SnowNLP(x).sentiments)

# 保存结果
df.to_excel('E:\desktop\output_with_sentiment.xlsx', index=False)

df['sentiment_label'] = df['sentiment_score'].apply(lambda x: 'positive' if x > 0.5 else 'negative')
daily_sentiment_counts = df.groupby(['date', 'sentiment_label']).size().unstack(fill_value=0)

# 绘制每日正向和负向情感的折线图
plt.figure(figsize=(12, 6))
plt.plot(daily_sentiment_counts.index, daily_sentiment_counts['positive'], label='正向情感', marker='o', color='green')
plt.plot(daily_sentiment_counts.index, daily_sentiment_counts['negative'], label='负向情感', marker='o', color='red')

# 设置图表标题和轴标签
plt.title('每日正向与负向情感数量趋势', fontsize=20)
plt.xlabel('日期', fontsize=16)
plt.ylabel('情感数量', fontsize=16)

# 优化横坐标日期显示
plt.xticks(rotation=45, fontsize=16)

# 添加图例
plt.legend(fontsize=13)

# 显示图表
plt.tight_layout()
plt.show()

由结果图可知,各平台的情感得分均以正向的为主。本次情感得分的部分介绍到这,后续还会更新本人负责的其他模块,欢迎各位一起讨论交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值