大数据电影可视化系统
?寫在前面:強烈推薦給大家一個優秀的人工智能學習網站,內容包括人工智能基礎、機器學習、深度學習神經網絡等,詳細介紹各部分概念及實戰教程,通俗易懂,非常適合人工智能領域初學者及研究者學習。??點擊跳轉到網站。
*??目錄
🆙項目介紹:
一、數據采集及預處理(pachong.py):
二、Python數據分析及可視化:
(1)電影票房排名
(2)電影評分排名douanscore.py
(3)Echarts最近上映電影
(4)影片《囧媽》短評信息
(5)詞圖云cituyun.py
(6)情感分析emotion.py
(7)Python詞頻統計wordcount.py
三、Hadoop大數據分析:
(1)Mapreduce離線計算(mapreduce_hive文件)
(2)Hive數倉分析
(3)影片類型與票房統計圖movietype.py
(5)導演與影片類型關系圖director.py
(6)電影票房預測(電票票房預測.xls)
(7)電影評分預測scorepredict.py
四、Spark電影數據分析實戰:
GitHub - GoAlers/Spark-Movie: Spark電影數據分析實戰,利用spark開發針對用戶觀影等歷史行為數據進行采集、分析和展示
🆙項目介紹:
本項目以電影數據為主題,以數據采集、處理、分析及數據可視化為項目流程,可實現百萬級電影數據離線處理與計算。功能包括python爬蟲,Matplotlib繪圖、Echarts數據可視化、結合mysql數據實現hive電影相關數據統計、Mapreduce詞頻統計、情感分析、詞圖云等。
🌐項目鏈接: GitHub - GoAlers/Bigdata-Movie
??開發環境:IDEA+Pycharm+Python3+hadoop2.8+mapreduce+hive2.3+mysql5.7+sqoop/spark
📊大數據分析部分流程圖:
??項目運行:在每個標題文件包含運行文件名,具體圖片、內容可根據自身需要進行修改。
?大數據學習資料推薦?
?📝大數據綜合筆記學習參考文章:
大數據開發面試知識點總結_GoAI的博客-CSDN博客_大數據開發面試
📝Hadoop環境搭建參考文章:
Hadoop大數據生態組件環境安裝_GoAI的博客-CSDN博客_大數據組件安裝
📝Hadoop常見命令學習參考文章:
Hadoop常見命令總結_GoAI的博客-CSDN博客
一、數據采集及預處理(pachong.py):
通過編寫爬蟲程序采集豆瓣電影top250電影信息,采集電影名稱、電影簡介、電影評分、其他信息、電影連接等字段,抓取電影票房總收入排名情況(取前20),刪除冗余和空值字,利用Python的PyMysql庫連接本地Mysql數據庫并導入movies表(前提安裝好mysql數據庫),可以將數據保存到本地,從而進行數據可視化展示,也可將數據導入到大數據的Hive數倉工具中,用于大數據分析。
采集數據展示:
| 排序 | 影片名稱 | 類型 | 總票房(萬) | 場均人次 | 上映日期 |
| 1 | 戰狼2 | 動作 | 567928 | 38 | 2017/7/27 |
| 2 | 哪吒之魔童降世 | 動畫 | 501324 | 24 | 2019/7/26 |
| 3 | 流浪地球 | 科幻 | 468433 | 29 | 2019/2/5 |
| 4 | 復仇者聯盟4:終局之戰 | 動作 | 425024 | 23 | 2019/4/24 |
| 5 | 紅海行動 | 動作 | 365079 | 33 | 2018/2/16 |
| 6 | 唐人街探案2 | 喜劇 | 339769 | 39 | 2018/2/16 |
| 7 | 美人魚 | 喜劇 | 339211 | 44 | 2016/2/8 |
| 8 | 我和我的祖國 | 劇情 | 317152 | 36 | 2019/9/30 |
| 9 | 我不是藥神 | 劇情 | 309996 | 27 | 2018/7/5 |
| 10 | 中國機長 | 劇情 | 291229 | 27 | 2019/9/30 |
二、Python數據分析及可視化:
數據可視化能使數據更加直觀,更有利于分析,可以說可視化技術是數據分析與挖掘最重要的內容。Matplotlib作為基于Python語言的開源項目,旨在為Python提供一個數據繪圖包,實現專業豐富的繪圖功能。
(1)電影票房排名
利用Python中Matplotlib繪圖庫及Pandas中的pd.readcsv()方法讀取Excel電影數據文件,讀取每列數據進行,設置參數將結果繪制成折線圖。
(2)電影評分排名douanscore.py
利用Python的Request、Beautifulsoup庫進行爬蟲,模擬請求獲取網頁數據,結合正則表達式匹配提取數據,并將豆瓣電影top250電影數據存儲到Mysql數據庫中,通過數據庫語句使用order by實現電影top評分統計。
mysql配置信息:
host="localhost",user="root",password="123456",db="maoyan",charset="utf8",port = 3306
movie表結構:
| 屬性 | 字段命名 | 類型 | 約束 |
| id | 序號 | int | primary key |
| name | 電影名稱 | VARCHAR(20) | not null |
| Link | 電影連接 | VARCHAR(100) | not null |
| score | 評分 | VARCHAR(5) | not null |
| descr | 電影概述 | VARCHAR(50) | |
| directer | 導演及其他 | VARCHAR(100) |
最終電影數據結果如下:
利用數據庫語句統計movies進行電影評分top20,并將結果通過Python的Matplotlib庫進行數據可視化,繪圖結果如下:
(3)Echarts最近上映電影
Echarts 主要用于數據可視化展示,是一個開源的JavaScript庫,兼容現有絕大部分瀏覽器。在Python中,Echarts被包裝成數據可視化工具庫Pyecharts。它提供直觀、豐富、可個性化定制的數據可視化圖表,包括常規的折線圖、柱狀圖、散點圖、餅圖等,本文程序參考開源程序,項目可以顯示最近上映的電影及相關評分,具體顯示內容可進行自行修改。
echarts官網:Examples - Apache ECharts
echarts學習資料:
ECharts 教程 | 菜鳥教程
Echarts數據可視化_孤風隨雨的博客
(4)影片《囧媽》短評信息
? ? 今年大年初一電影《囧媽》網絡首映映,截止目前其豆瓣電影評分6.0分,通過電影《囧媽》的豆瓣熱門短評進行案例分析,以八爪魚軟件為數據采集工具進行數據爬蟲,采集字段有用戶名、評級、點贊數和評論內容等信息,利用正則表達式匹配字段標簽,根據豆瓣電影提供的評級星數系統顯示力薦、推薦、還行、較差、很差等五個評級,滿分為五星,數據格式如下:
(5)詞圖云cituyun.py
利用Python的jieba分詞工具以及wordcloud庫實現詞云展示,截取電影《囧媽》評論一列,按照規定的停用詞切割每行語句,實現分詞功能。通過詞圖云展示可以直觀地看出用戶對電影的態度情況,數據展示結果如下:
(6)情感分析emotion.py
運用Python機器學習中的情感分析庫Snownlp和繪圖庫pyplot挖掘囧媽短評數據,做出情感分析并展示。利用Snownlp中s.sentiments方法計算情感分數,分數在0.5以上判斷為是好評,可以看到電影的評論差距明顯。情感分析效果圖如下:
(7)Python詞頻統計wordcount.py
本程序通過編寫python程序實現電影詞頻統計并排序取前20,使用seabron庫進行可視化,。
三、Hadoop大數據分析:
大數據處理最重要的環節就是數據分析,數據分析通常分為兩種:批處理和流處理。
批處理是對一段時間內海量的離線數據進行統一處理,對應處理框架Mapreduce、Spark等;
流處理則是針對動態實時的數據處理,即在接收數據的同時就對其進行處理,對應的處理框架有 Storm、Spark Streaming、Flink等。
本文以離線計算為主介紹電影數據分析,注意運行以下代碼,需要提前搭建好Hadoop環境(linux系統下安裝Java JDK+Hadoop+Hive+Mysql)。
(1)Mapreduce離線計算(mapreduce_hive文件)
Mapreduce編程詞頻統計主要利用wordcount思想,通過按規定格式分割詞句,實現單詞統計詞頻。其統計數據為歷史電影的上映信息,map階段主要負責單詞分割統計,map階段把每個字符串映射成鍵、值對,按行將單詞映射成(單詞,1)形式,Shuffle過程會對map的結果進行分區排序,然后按照同一分區的輸出合并在一起寫入到磁盤中,最終得到一個分區有序的文件,最后reduce階段會匯總統計出每個詞對應個數,數據最終會存儲在HDFS上。本文以電影詞作為統計對象,實現單詞統計詞頻功能。詞頻統計流程圖如下:
map階段會把每個字符串映射成鍵、值對,按行將單詞映射成(單詞,1)形式輸出,其中shuffle過程會對map的結果進行分區排序,然后按照同一分區的輸出合并在一起寫入到磁盤中,最終得到一個分區有序的文件。通過Python編程實現Map階段代碼如下:
Map階段代碼:
import sysfor line in sys.stdin: ss = line.strip().split(' ') for s in ss: if s.strip() != "": print "%s\t%s" % (s, 1)(2)reduce階段
reduce階段會匯總map階段結果每個詞對應個數,數據最終會存儲在HDFS上。本文以《哈利波特》英文電影文本為例,實現詞頻統計功能。實現Reduce階段代碼如下:
Reduce階段代碼:
import sys current_word = None count_pool = [] sum = 0for line in sys.stdin: word, val = line.strip().split('\t') if current_word == None: current_word = word if current_word != word: for count in count_pool: sum += count print "%s\t%s" % (current_word, sum) current_word = word count_pool = [] sum = 0 count_pool.append(int(val)) for count in count_pool: sum += count print "%s\t%s" % (current_word, str(sum))利用Hadoop Streaming可以使用任何可運行程序或語言作為Map和Reduce的創建和執行MapReduce作業,通過編寫shell腳本執行wordcount,需要進入mapreduce_hive目錄下運行執行命令sh run.sh ,(此處注意hadoop-streaming-2.6.5.jar位置改成自己對應的,如果找不到可以通過find命令查找,總之調好文件位置就可以運行!)。
#run.sh HADOOP_CMD="/usr/local/src/hadoop2.6.5/bin/hadoop" STREAM_JAR_PATH="/usr/local/src/hadoop2.6.5/contrib/streaming/hadoop-streaming-2.6.5.jar"INPUT_FILE_PATH_1="/The_Man_of_Property.txt" OUTPUT_PATH="/output"$HADOOP_CMD fs -rmr -skipTrash $OUTPUT_PATH# Step 1. $HADOOP_CMD jar $STREAM_JAR_PATH \-input $INPUT_FILE_PATH_1 \-output $OUTPUT_PATH \-mapper "python map_new.py" \-reducer "python red_new.py" \-file ./map_new.py \-file ./red_new.py最終生成的part-00000文件存儲在hadoop環境中(注意并不是在自己本地linux系統文件中),課題通過圖片中hadoop? -cat命令可以查看內容,最后統計結果如下:
(2)Hive數倉分析
Hive數倉介紹:
Hive是一個基于Hadoop的數據倉庫工具,主要用于解決海量結構化日志的數據統計,可以將結構化的數據文件映射成一張表,通過類SQL語句的方式對表內數據進行查詢、統計分析。利用Sqoop數據傳輸工具可以將Mysql數據庫信息導入到Hive數倉。
運用Hive可以實現海量數據分析,并且支持自定義函數,省去MapReduce編程。本文針對歷史豆瓣電影數據進行統計,數據經過清洗,刪除空值、多余項,得到大約100000多條電影數據,數據文件對應movie.csv(正常并不包含總分列),部分數據格式如下:
(1)建表
Hive建表分為內部表和外部表兩種。創建內部表,表內數據將會移動到數據倉庫指向的路徑,刪除表時,數據會隨之刪除;而外部表在刪除時,不會刪除數據表原有信息,相對更加安全。
本文電影表包括電影名稱、評分、評論人數、類型、上映年份,以及總分等字段,數據默認逗號分隔,其中總分=電影評分*評論人數(這里可自己適當增加權重分數,使其分數更加合理),數據創建命令如下(以下代碼需要安裝好hive,并輸入hive進入到hive環境下再執行以下代碼):
create table IF NOT EXISTS movie1(name string,score double,people int,type string,address string,time int,sum float)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';(2)導入數據
Hadoop支持各類型文件上傳到HDFS,可以通過本地命令直接上傳到Hive中,也可以利用Sqoop數據傳輸工具實現將Mysql數據庫與Hive數據庫互傳。本地導入命令如下:(movie.csv注意路徑改成自己上傳到linux系統里的路徑)
load data local inpath '/movie.csv' into table movie1;(3)統計分析
Hive底層基于Mapreduce執行,利用distribute by和sort by命令可以實現分組排序,統計總分(總分計算規則如上)在1000000分以上電影數據,并按照評分、總得分降序順序排列,優化后命令如下:
select name,score,sum,timefrom movie1where sum > 1000000distribute by score sort by score desc,sum desclimit 20;?最終運行結果展示(過程文件保存在項目對應文件夾中):
肖申克的救贖 9.6 6650832.0 1994 美麗人生 9.5 3114622.5 1997 這個殺手不太冷 9.4 6227989.0 1994 阿甘正傳 9.4 5460432.0 1994 霸王別姬 9.4 4498116.0 1993 辛德勒的名單 9.4 2884897.5 1993 泰坦尼克號 9.4 1476495.6 2012 機器人總動員 9.3 3922126.2 2008 瘋狂動物城 9.3 2647263.5 2016 十二怒漢 9.3 1255025.8 1957 盜夢空間 9.2 5907633.0 2010 千與千尋 千と千尋の神隠 9.2 4834646.0 2001 忠犬八公的故事 9.2 3244039.5 2009 教父 9.2 2584013.2 1972 亂世佳人 9.2 2080405.2 1939 三傻大鬧寶萊塢 9.1 5003253.0 2011 泰坦尼克號 9.1 4872968.0 1998 星際穿越 9.1 3459274.0 2014 大話西游之大圣娶親 西遊記大結局之仙履奇 9.1 3332629.2 2014 龍貓 となりのトト 9.1 3133293.8 1988(3)影片類型與票房統計圖movietype.py
(5)導演與影片類型關系圖director.py
(6)電影票房預測(電票票房預測.xls)
通過數據分析線性回歸預測電影票房未來收入情況,并進行相關分析。
(7)電影評分預測scorepredict.py
利用機器學習sklearn庫建立回歸模型,隨機取5個用戶計算評分預測出用戶對于某新影片的評分范圍,輸出評分最大、最小、平均值。
#encoding:utf-8 import numpy as np import pandas as pd import matplotlib.pyplot as plt import re from sklearn.linear_model import LinearRegression#繪圖部分 data = pd.read_csv('lianxi/film-csv.txt',encoding = 'utf-8',delimiter = ';') #讀取文件 data = data.iloc[:,:-1] #去除文件中的非法數據 data = data.drop(0).drop_duplicates().reset_index().drop('index',axis = 1) #由于第一行為空數據 去除 并去重 重置索引 # print datat = [] #將電影類型按多種分割符切分 for i in range(len(data)): a = re.split(u' / |/|,|、| |?',data[u'影片類型'][i]) for j in a: t.append(j) t = set(t) #將重復的類型去掉 tt = [] for i in t: #將不規范的類型去除 得出所有存在的類型 if (len(i)<=2)|(i==u'合家歡'): tt.append(i)#評分預測 id = [1050,1114,1048,1488,1102] #五個用戶id data1 = pd.read_csv('lianxi/score.log',delimiter=',',encoding = 'utf-8',header=0,names = [u'電影名稱',u'userid',u'score']) data1 = data1[data1[u'userid'].isin(id)] #去除五個用戶 相關數據data1[u'電影名稱'] = data1[u'電影名稱'].str.strip() #去除電影名稱的空格 all = []#用來存預測結果 for k in range(len(id)): #循環五次 建模 進行預測 dfp1 = data1[data1[u'userid']==id[k]].reset_index().drop('index',axis = 1) datamerge = pd.merge(data,dfp1,on=u'電影名稱') #用merge 將電影詳細信息 與新用戶評分合并 lst = [] lsd = [] lsr = [] for i in range(len(datamerge)): #切分出電影類型 和導演 以及對應的票房 for j in tt: if j in datamerge[u'影片類型'][i]: d = re.split(u',|、|/| ',datamerge[u'導演'][i]) for k in d: lsd.append(k.replace(u'?', u'')) lst.append(j.replace(u'?', u'')) lsr.append(datamerge[u'score'][i]) lsd1 = list(set(lsd)) for i in range(len(lsd1)): #將電影類型和票房轉成 連續量 以便機器訓練 for j in range(len(lsd)): if lsd1[i] == lsd[j]: lsd[j] = i + 1 for i in range(len(tt)): for j in range(len(lst)): if tt[i] == lst[j]: lst[j] = i + 1 lsd = pd.DataFrame(lsd, columns=[u'導演']) lst = pd.DataFrame(lst, columns=[u'影片類型']) lsr = pd.DataFrame(lsr, columns=[u'評分'])a = pd.concat([lsd, lst, lsr], axis=1) print(a)trainx = a.iloc[:, 0:2] # 電影類型和 導演 作為特征量 trainy = a.iloc[:, 2:3] # 評分作為樣本值 l = LinearRegression() # 建模 l.fit(trainx, trainy) # 訓練anstest = pd.DataFrame([[5,10]],columns=[u'導演',u'影片類型']) ans = l.predict(anstest)#預測 all.append(ans[0][0]) #得出結果 print (u'評分最大值是'+'%.2f'%max(all)) #輸出 print (u'評分最小值是'+'%.2f'%min(all)) print (u'評分中位數值是'+'%.2f'%np.median(all)) print (u'評分平均值是'+'%.2f'%np.mean(all))額外電影數據集鏈接:https://pan.baidu.com/s/1ji3YIjCSGXbvFh7swiWdFg?提取碼:1234?
后續會實現更多電影數據維度分析,如果遇到項目相關問題,可以在評論留言。
四、Spark電影數據分析實戰:
GitHub - GoAlers/Spark-Movie: Spark電影數據分析實戰,利用spark開發針對用戶觀影等歷史行為數據進行采集、分析和展示https://github.com/GoAlers/Spark-Movie
總結
以上是生活随笔為你收集整理的大数据电影可视化系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FreeRTOS 入门
- 下一篇: 计算机网络工程概论论文,网络工程专业导论