基于豆瓣评价的文本分析 ——以《流浪地球》为例

基于豆瓣评价的文本分析

——以《流浪地球》为例

项目背景
在电影行业飞速发展的当今,电影已经成为了非常普遍的娱乐选择,中国电影最近几年也是突飞猛进,越来越多的人走进电影院。而信息媒体的发展也使得所有人都拥有了随时随地与世界各地的人讨论电影的机会,电影无疑已经进入了全民关注,全民讨论时代。
但是随着越来越多的电影上映,越来越大的阅片量,大家对电影质量和制作水平的要求也越来越高。电影出品方想要斩获高票房,就要把握好消费者的喜好,制作出符合市场期待的电影。
在国内,豆瓣、淘票票、猫眼三家网站都有自己所属平台的评分功能,俨然形成了国内的“电影评分三巨头”。电影评分网站上蕴含了大量的电影评论、排行、评分等信息,是消费者择片困难时的重要参考依据,也是电影出品方了解用户喜好的有效途径。
一份科学的电影消费者数据分析报告,是预测票房的重要依据之一,也能够帮助出品方规划未来电影拍摄计划,对出品方投资有着重要意义。所以,如何分析消费者喜好信息是电影出品方非常关注的事情。

一.了解影评数据并明确项目目标

项目目标
本项目通过Python对主流电影评分网站豆瓣网上关于《流浪地球》评论用户的基本信息、影评内容等数据进行处理,对这些影评数据进行简单的文本分析,帮助出品方了解用户偏好。对不同类别的用户进行特征分析,比较不同类别用户的价值。
分析流程如下:

项目流程
在这里插入图片描述

二.对影评数据进行预处理

任务描述
数据预处理的目的是提高数据质量,便于后续进行分析。通过观察数据,发现网络获取的原始影评数据存在异常值,需要进行修正清洗,另外由于我们对评论内容处理时需要找出关键词进行分析,所以需要对评论数据进行分词、去除停用词,以便后面分析时进行词频统计和绘制词云图。

任务分析
对“流浪地球”评论数据进行预处理可以分为以下4个步骤:
(1)读取评论数据
(2)读取停用词库,并进行切片、返回列表
(3)对评论数据进行分词
(4)去除停用词

主流技术
本项目主要涉及技术为jieba,jieba是python写成的一个分词开源库,专门用于中文分词,将待分词的内容与分词词库进行比对,通过图结构和动态规划方法找到最大概率的词组。除了分词,jieba还提供增加自定义中文单词的功能。

Jieba库支持三种分词模式:
1.精确模式:把文本精确地切分开,不存在冗余单词;
2.全模式:把文本中所有可能的词语都扫描出来,有冗余;
3.搜索引擎模式:在精确模式基础上,对长词再次切分。
这里我们使用精确模式,将文本进行精确的切分开,不存在冗余单词。

读取评论数据
原始数据存储为excel格式,所以需要将数据从Excel表格中读入python。除了可使用xlrd库或者xlwt库进行对excel表格的读写操作外, 也可使用pandas库进行excel的操作,且pandas操作更加简介方便。这里运用pandas库中的read_excel()读取表格,并形成一个480×7的数据框。读入过程如代码所示:

#读入原始数据
data = pd.read_excel(r"D:\Wandering_Earth\/流浪地球.xlsx")

三.读取停用词库并对数据进行处理

停用词是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉某些字或词,这些字或词即被称为Stop Words(停用词)。这些停用词都是人工输入、非自动化生成的,生成后的停用词会形成一个停用词表。但是,并没有一个明确的停用词表能够适用于所有的工具。
通常意义上,停用词大致为如下两类:

1、应用十分广泛,在Internet上随处可见。比如“Web”一词几乎在每个网站上均会出现,对这样的词搜索引擎无法保证能够给出真正相关的搜索结果,难以帮助缩小搜索范围,同时还会降低搜索的效率;
2、在文本中出现频率很高,但实际意义又不大的词,包括语气助词、副词、介词、连接词等,通常自身并无明确的意义,只有将其放入一个完整的句子中才有一定作用,如常见的“的”、“在”等。

这里,我们使用已有的停用词库。此停用词库为文本形式,而我们在去除停用词时,停用词库应该为列表形式,因此,读入停用词库后需对词库进行切片和列表转换。停用词库文本中每行一个停用词,方便了我们进行切分。Str.split()函数很有效的帮助我们解决了这个问题,通过指定分隔符对字符串进行切分,并且返回值为字符串列表。由此,我们可以通过换行符(\n)作为分隔符,对文本进行切分,得到一个停用词列表。如代码所示:

#读入停用词库并进行切片和列表转换
with open(r"D:\Wandering_Earth\stoplist.txt",'r',encoding='utf-8') as f:
    stoplist = f.read()
stoplist = stoplist.split() + ['\n','',' ']

四.对评论数据进行分词、去除停用词

分词
分词是文本信息处理的基础环节,是将一个单词序列切分成一个一个单词的过程。准确的分词可以极大的提高计算机对文本信息的是被和理解能力。相反,不准确的分词将会产生大量的噪声,严重干扰计算机的识别理解能力,并对这些信息的后续处理工作产生较大的影响。
对于一段英文文本,例如“China is a great country”,如果希望提取其中的单词,只需要使用split()函数即可。然而,对于一段中文文本,例如,“中国是一个伟大的国家”,获得其中的单词十分困难,因为英文文本可以通过空格或者标点符号分隔,而中文单词之间缺少分隔符,这是中文及类似语言独有的“分词”问题。上例中,分词能够将“中国是一个伟大的国家”分为“中国”、“是”、“一个”、“伟大”、“的”、“国家”等一系列词语。jieba分词开源库能很好的进行中文分词。本项目对的分词方法如代码所示:

#分词
data_cut = data['content'].apply(jieba.lcut)

去除停用词
因为之前我们已经将停用词库做成了一个列表,这里只需要去除停用词即可取得需要的影评关键词。

#去除停用词
data_new = data_cut.apply(lambda x:[i for i in x if i not in stoplist])

五.词频统计

由于本项目的目标是对电影《流浪地球》的影评进行分析,类似“推荐”,“还行”,“力荐”等评论虽然表达了对电影的情感倾向,但是实际上无法根据这些评论提取出观影者对此影片的集体感官。评论中只有出现明确的名词,如电影细节,演员及特效等名词时,评论才有意义,因此需要对分词后的词语进行词频统计。

利用_flatten()函数将列表展评,转换为Series之后利用value_counts()方法进行特征统计描述。如代码所示:

#词频统计
pd.Series(_flatten(list(data_new))).value_counts()

六. 绘制词云图

进行词频统计后,可绘制词云查看统计效果,词云会将文本中出现频率较高的“关键词”予以视觉上的突出。可使用wordcloud模块的WordCloud绘制词云。
首先从原文件中提取出评分(scores)与评论(contents)两列,利用pd.pivot_table()方法以scores列为索引创建透视表。如代码所示:

# 创建透视表
evaluate = pd.pivot_table(data[['scores','content']],index='scores',aggfunc = np.sum)


# 绘制词云图
good = evaluate.iloc[3:5]
not_bad = evaluate.iloc[2:3]
terrible = evaluate.iloc[0:2]
def word_cloud(Data=None):
    data_cut = Data.apply(jieba.lcut)  
    data_new = data_cut.apply(lambda x: [i for i in x if i not in stoplist])  
    total = pd.Series(_flatten(list(data_new))).value_counts()
    plt.figure(figsize=(10,10))
    mask = plt.imread('rec.jpg')
    wc = WordCloud(font_path='C:/Windows/Fonts/simkai.ttf',mask=mask,background_color='white')
    wc.fit_words(total)
    plt.imshow(wc)
plt.axis('off')


word_cloud(Data=good['content'])    # 好评词云
word_cloud(Data=not_bad['content']   # 中评词云
word_cloud(Data=terrible['content'])   # 差评词云


分别得到词云图如下:

图6-1 好评词云图
好评词云图

图6-2 中评词云图
中评词云图

图6-3差评词云图
在这里插入图片描述

从好评与差评的关键信息展示上可以看得出该影片是中国难得的科幻类型的影片,讲述了人类带着地球流浪的事情,好评主要包含特效以及中国元素,差评主要集中在剧情等因素。

七.时间分析

进行时间分析之前,需对豆瓣评分有如下了解:豆瓣评分在电影没上映前即可评分,但不会显示出来,需在上映后评分人数达到指定数量,才会显示出来。

用户发表短评数量随日期的变化分析
times列数据是用户评论发表时间,如“2019-02-05 00:24:35”,既有年月日,也有时分秒,十分详尽,利于进行时间分析。该时间数据为字符串格式,需先进行字符串分割处理。通过进行时间分析,可以发现该电影在不同时间段或时间点的热度分布情况。如代码所示,我们首先分析了用户发表短评数量随日期的变化情况。

# 用户发表短评数量随日期的变化情况
dates = data['times'].apply(lambda x: x.split(' ')[0])
dates = dates.value_counts().sort_index()
plt.figure(figsize=(10,4))
plt.plot(range(len(dates)), dates)
plt.xticks(range(len(dates)), dates.index,rotation=60)
plt.title('用户发表短评数量随日期的变化情况')
plt.ylabel("用户发表短评数量")
plt.show()

用户发表短评数量随日期的变化分布图
用户发表短评数量随日期的变化分布图
由上图我们可以看到,2019年2月5日之后的折线图呈长尾分布,持续3个月。在电影刚上映阶段,其热度是最高的,高评论量在一定程度上说明电影本身带给人们的求影响。在电影行业中,一般情况下,映后的口碑与最终的票房动力成正相关,即口碑越好的影片,长尾效应越明显,有一定比例的观众会因为购票网站评分较高而去选择观看一部影片。目前《流浪地球》的豆瓣评分是7.9,曾冲击到8.6的高分,实属是一个不错的影片。在图中,我们也可以看到在影片上映前,就有较多的评论量,这说明此影片在上映前就受到了较大的关注。

八.用户发表短评数量随时刻的变化分析

要进行时刻分析,需取出时间数据中表时刻的字段。所以这一步与5.1不同,需将时间数据从字符串列转化为日期列,才可取出所需数据。Pandas是处理时间序列的利器,有强大的日期数据处理功能,继承和使用了datatime64格式,可以按日期筛选数据、按日期显示数据,按日期统计数据。在这里,运用了.hour取出时刻数据。具体分析过程如代码所示:

# 用户发表短评数量随时刻的变化情况
time = pd.to_datetime(data['times']).apply(lambda x: x.hour)
time = time.value_counts().sort_index()
plt.figure(figsize=(10,4))
plt.plot(range(len(time)), time)
plt.xticks(range(len(time)), time.index)
plt.title('用户发表短评数量随时刻的变化情况')
plt.ylabel("用户发表短评数量")
plt.xlabel("时刻")
plt.show()

在这里插入图片描述
从上图中,我们可以看到,在24小时中,都有用户在发表短评,但更多的分布在晚上21:00之后,这个时间段处于下班时间,人们具有充足的时间去观看影片,并发表评论,这与实际相符合。

九.评分随日期变化分析

评分在一定程度上反映了电影的口碑,表现该电影的需求热度。有相当大比例的观众会因为购票网站评分较高而去选择观看一部影片,所以在电影行业中,一般情况下,映后的口碑与最终的票房动力成正相关。分析用户对该电影的评分是十分有必要的。在这里,我们是分析评分随日期变化情况,处理方法如代码所示:

# 评分随日期变化的情况
data['times'] = data['times'].apply(lambda x: x.split(' ')[0])
new = pd.DataFrame(0,index=data['times'].drop_duplicates().sort_values(),columns=data['scores'].drop_duplicates().sort_values())
for i, j in zip(data['times'], data['scores']):
    new.loc[i, j] += 1
new = new.iloc[:, :-1]
#可视化
plt.figure(figsize=(10,4))
plt.plot(new)#,label = "10.0","20.0","30.0","40.0","50.0")
plt.title('评分随日期变化的情况')
plt.xticks(rotation=90)
plt.legend(["10.0","20.0","30.0","40.0","50.0"],loc="best")
plt.show()

在这里插入图片描述
按时间统计各个星级的打分数量,得到了评分随日期变化的情况分布,如上图。我们已经知道,10分对应1星,20分对应2星,以此类推。可以看到自《流浪地球》于2019年2月5日上映以来,3星一直是大众的主流评分,而4星、5星在5到10号之间也占有极大比重。另外,我们可以看到,在电影上映前的部分折线图中,4星、5星十分突出,这说明大家一开始对电影的期望值很高,这一方面是刘慈欣小说本身所带有的IP效应,另一方面是自《战狼》系列后大家对吴京抱有极大的期待。但在上映后3星却成为了主流评分,应是看完电影后有点失望,所以评分才会低于预期。

https://blog.csdn.net/weixin_46726459

  • 14
    点赞
  • 152
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
很好的问题!下面是使用Python的数据可视化和分析库对豆瓣电影《流浪地球》影评进行分析和可视化的基本步骤: 1. 导入必要的库:首先,需要导入Pandas、Matplotlib和Seaborn库。 ``` python import pandas as pd import matplotlib.pyplot as plt import seaborn as sns ``` 2. 加载数据:使用Pandas的read_csv函数从CSV文件中加载数据。 ``` python data = pd.read_csv('data.csv') ``` 3. 数据清洗:根据需要,可以对数据进行清洗和预处理。例如,可以删除不需要的列或行,处理缺失值等等。 ``` python data = data.drop(['id', 'user_url'], axis=1) data = data.dropna() ``` 4. 数据分析:使用Pandas和Seaborn等库进行数据分析。例如,可以计算评分的平均值、中位数和标准差,并使用Seaborn创建箱线图和直方图。 ``` python mean_rating = data['rating'].mean() median_rating = data['rating'].median() std_rating = data['rating'].std() sns.boxplot(x='rating', data=data) plt.title('Boxplot of Ratings') plt.show() sns.histplot(x='rating', data=data, bins=10) plt.title('Histogram of Ratings') plt.show() ``` 5. 数据可视化:使用Matplotlib和Seaborn等库创建数据可视化。例如,可以使用Seaborn创建散点图和条形图,显示评分和评论数之间的关系。 ``` python sns.scatterplot(x='rating', y='comment_count', data=data) plt.title('Scatterplot of Ratings and Comment Counts') plt.show() sns.barplot(x='rating', y='comment_count', data=data) plt.title('Barplot of Ratings and Comment Counts') plt.show() ``` 这些是基本的数据可视化和分析步骤,可以根据需要进行自定义和扩展。希望这些信息能对你有所帮助!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值