上一篇用python分析豆瓣短評(píng)(一)講了通過編寫爬蟲代碼獲取豆瓣電影短評(píng)數(shù)據(jù)谢谦。本文則利用pandas、matplotlib庫對(duì)爬取的數(shù)據(jù)進(jìn)行簡(jiǎn)單分析愿阐。
完整代碼:
電影短評(píng)數(shù)據(jù)分析
一微服、從mongoDB中獲取數(shù)據(jù)并清洗
數(shù)據(jù)清洗主要是清除mongoDB自動(dòng)生成的_id字段,處理缺失值數(shù)據(jù)并轉(zhuǎn)換數(shù)據(jù)類型缨历,代碼為:
def getData(self):
'''
從mongoDB中提取數(shù)據(jù)
:return: 電影評(píng)論的DataFrame數(shù)據(jù)
'''
try:
client = MongoClient()
db = client[self.database]
col = db[self.movie_name]
df = DataFrame(list(col.find()))
print('連接mongoDB成功以蕴!')
return df
except Exception:
print('尚未啟動(dòng)mongoDB服務(wù)糙麦。請(qǐng)?zhí)崆伴_啟mongoDB服務(wù)!')
def getCleanData(self):
'''
對(duì)從mongoDB中獲取的原始數(shù)據(jù)進(jìn)行清洗:剔除多余字段丛肮;轉(zhuǎn)換數(shù)據(jù)類型赡磅;添加評(píng)分分?jǐn)?shù)值列
:return:
'''
df = self.getData()
del df['_id'] # 刪除mongodb自動(dòng)生成對(duì)_id字段
# 處理評(píng)分(rating)字段空字符串及缺失值
df.rating = df.rating.str.split(',', expand=True).replace('', np.nan)
grades = self.grades
# 添加分?jǐn)?shù)值列
df['score'] = df['rating'].apply(lambda x: grades[x] if x in grades else 0)
# 轉(zhuǎn)換數(shù)據(jù)類型
df['pub_time'] = pd.to_datetime(df['pub_time']) # 將pub_time(評(píng)論發(fā)布日期)轉(zhuǎn)換為日期格式
df['vote'] = pd.to_numeric(df['vote']) # 將vote(有用數(shù))轉(zhuǎn)換為數(shù)據(jù)格式
print('共獲取%d條評(píng)論信息.' % len(df))
return df
二、電影評(píng)分情況
為了能夠正常顯示中文宝与,需要提前進(jìn)行字體設(shè)置
from pylon import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
統(tǒng)計(jì)不同打分的數(shù)量焚廊,得到評(píng)分的分布情況:
這是豆瓣網(wǎng)頁上的評(píng)分分布結(jié)果:
可以看到榜聂,500個(gè)樣本的打分分布與整體的分布基本一致搞疗,而且5星最多,大量4星须肆,分布形狀成F型匿乃,這是大好片的分布形狀。(關(guān)于豆瓣評(píng)分形狀介紹豌汇,可以看這里:從豆瓣評(píng)分的形狀辨別電影質(zhì)量幢炸。
不過比較以上兩組評(píng)分分布也會(huì)發(fā)現(xiàn),在采集的熱門短評(píng)數(shù)據(jù)中拒贱,評(píng)價(jià)為3星及以下的比例(32%)高于全網(wǎng)數(shù)據(jù)(18%)宛徊,導(dǎo)致按照樣本數(shù)據(jù)計(jì)算的電影得分更低。鑒于豆瓣是以評(píng)論獲得的“有用”數(shù)作為衡量熱門的指標(biāo)逻澳,說明還是有相當(dāng)數(shù)量的用戶不太認(rèn)可這部電影闸天。稍后我們可以再次對(duì)采集的數(shù)據(jù)進(jìn)行分組并繪制詞云,看看不同評(píng)分的用戶有著怎樣的評(píng)語斜做。
三苞氮、評(píng)分與時(shí)間的關(guān)系
利用評(píng)論發(fā)表時(shí)間與打分?jǐn)?shù)據(jù),計(jì)算出單位時(shí)間內(nèi)的平均分瓤逼,并得到分?jǐn)?shù)隨時(shí)間的變化圖笼吟。
由于《你的名字“云欤》從最早在日本上映到樣本數(shù)據(jù)截止日期已經(jīng)有超過一年半的時(shí)間贷帮,因此選擇以“月”作為時(shí)間單位計(jì)算平均分:
new_col = 'month'
data[new_col] = data['pub_time'].apply(lambda x: datetime.strftime(x, '%Y-%m'))
rating_by_time = data['score'].groupby(by=data[new_col]).mean()*2 #原始數(shù)據(jù)是5分制,這里改成10分制
使用matplotlib庫繪制折線圖:
fig, ax = plt.subplots()
ax.plot(rating_by_time,linestyle='--',marker='o')
ax.axes.set_xticklabels(rating_by_time.index.values,rotation=45)
ax.set_title(title)
得到分?jǐn)?shù)變化圖:
四诱告、評(píng)論里都說了什么
之前提到撵枢,在樣本數(shù)據(jù)中3星及以下的評(píng)論也占有近1/3的比例,因此以3星為界,將評(píng)論文本分為兩組诲侮,分別繪制詞云圖镀虐。
先分組
goodRating=data[data['score']>3] #評(píng)分大于3星的為好評(píng)
poorRating=data[data['score']<=3] #評(píng)分小于等于3星的為差評(píng)
goodComments=goodRating['comment_lines']
poorComments=poorRating['comment_lines']
分別統(tǒng)計(jì)詞頻。好評(píng)組里前20高頻詞組為:
差評(píng)組的情況:
從統(tǒng)計(jì)結(jié)果來看沟绪,兩組的高頻詞幾乎一樣刮便,都是很頻繁提到導(dǎo)演的名字、電影的畫面绽慈,以及電影的主題恨旱,包括愛情和時(shí)空穿越。這些詞語都是有實(shí)際的指向坝疼,表明熱門的短評(píng)基本上都包含了實(shí)質(zhì)的內(nèi)容搜贤,而非水軍灌水。
再看一下詞云钝凶。
好評(píng)的詞云里面幾乎都是肯定的詞匯仪芒,偶爾還提到新海誠的另一部《秒速五厘米》用來作比較「荩《觸不到的戀人》也被提及掂名,畢竟很難否認(rèn)這部電影沒有受到全智賢經(jīng)典作品的啟發(fā)。
差評(píng)的詞云里面明顯多了一些負(fù)面的詞匯哟沫,比如覺得劇情“尷尬”饺蔑、“受不了”,或者認(rèn)為故事“空洞”嗜诀、邏輯存在bug猾警。即便如此,依然有很多評(píng)論提及電影的畫面隆敢。的確发皿,在電影院看過的人應(yīng)該都會(huì)被壁紙一般的畫質(zhì)震撼到吧。
OK筑公,最后上一張全部評(píng)論的詞云雳窟。