Python 分析 9 萬條資料告訴你復仇者聯盟誰才是絕對 C 位!
作者 | 羅昭成
責編 | 唐小引
出品 | CSDN(ID:CSDNnews)
《復聯 4》國內上映第十天,程式設計師的江湖裡開始流傳這樣一個故事,即:
漫威宇宙,其實就講了一件事情。整個宇宙就好比一個專案組。其中有一群叫作美國隊長、鋼鐵俠、驚奇隊長、浩克、索爾等人在維護這個專案,兢兢業業的維護整個專案。
某一天,出現了一個天才程式設計師,叫滅霸。當他加入到這家公司的時候,他意識到,這個專案已經非常龐大,僅僅是編譯,就要幾個小時。執行起來負重累累。而伺服器資源又非常的有限,老闆又不給預算買新機器,如果一直繼續這麼開發下去,這個專案遲早要出現 P0 事故。於是,他下定決定要把這個專案全面優化,使用用面向物件思想,提取重複程式碼,業務拆分,演算法優化等手段,徹底優化,目標是程式碼量減少 50%。
美國隊長帶領的專案組叫復仇者聯盟,發現了滅霸程式設計師的想法後,阻止並警告滅霸說:不要輕易去改老程式碼!!很容易出 bug 的,程式碼能跑就行!!
—— 以上來自知乎@郭啟軍
https://www.zhihu.com/question/321428495/answer/663671132
那麼,作為一個寫程式設計師的電影,我們怎麼不能用資料來分析一下,喜歡漫威宇宙的觀眾對《復聯 4》的評價呢?
抓取資料
業界朋友們,在電影分析中,使用貓眼的資料比較多。在本文中,筆者也使用了貓眼的介面來獲取資料,方便處理,資料量也比較多。
有關介面,大家可以自己去貓眼的網站上看,也可以使用如下地址:
http://m.maoyan.com/mmdb/comments/movie/248172.json?_v_=yes&offset=20&startTime=2019-04-24%2002:56:46
在 Python 中,使用 Request 可以很方便地傳送請求,拿到介面返回的 JSON 資料,來看程式碼:
def getMoveinfo(url): session = requests.Session() headers = { "User-Agent": "Mozilla/5.0", "Accept": "text/html,application/xhtml+xml", "Cookie": "_lxsdk_cuid=" } response = session.get(url, headers=headers) if response.status_code == 200: return response.text return None
請求返回的是一個 JSON 資料,拿到我們想要的評論原始資料,並將資料儲存在資料庫中:
def saveItem(dbName, moveId, id, originalData) : conn = sqlite3.connect(dbName) conn.text_factory=str cursor = conn.cursor() ins="INSERT OR REPLACE INTO comments values (?,?,?)" v = (id, originalData, moveId) cursor.execute(ins,v) cursor.close() conn.commit() conn.close()
經過大概兩個小時,終於從貓眼爬取了大約 9 萬條資料。資料庫檔案已經超過了 100M 了。
資料清洗
因為在上面抓取下來的資料,直接進行了原資料的儲存,沒有進行資料的解析處理。介面中包含了很多資料,有使用者資訊、評論資訊等。本次分析,只使用了部分資料,所以需要將用到的相關資料清洗出來:
def convert(dbName): conn = sqlite3.connect(dbName) conn.text_factory = str cursor = conn.cursor() cursor.execute("select * from comments") data = cursor.fetchall() for item in data: commentItem = json.loads(item[1]) movieId = item[2] insertItem(dbName, movieId, commentItem) cursor.close() conn.commit() conn.close() def insertItem(dbName, movieId,item): conn = sqlite3.connect(dbName) conn.text_factory = str cursor = conn.cursor() sql = ''' INSERT OR REPLACE INTO convertData values(?,?,?,?,?,?,?,?,?) ''' values = ( getValue(item, "id"), movieId, getValue(item, "userId"), getValue(item, "nickName"), getValue(item, "score"), getValue(item, "content"), getValue(item, "cityName"), getValue(item, "vipType"), getValue(item, "startTime")) cursor.execute(sql, values) cursor.close() conn.commit() conn.close()
通過 JSON 庫將原始資料解析出來,將我們需要的資訊儲存到新的資料表中。
資料分析
因為沒有任何一個平臺能夠拿到使用者的購票資料,我們只能從評論的資料中,以小見大,從這些資料中,分析出一些走勢。 在評論資料中,我們能看到評論使用者所在的城市。將資料所在的位置解析,劃分到各對應的行政省,可以看到每個省評論數量,見下圖( 顏色越紅,使用者評論數量越多 ):
城市
從圖中可以看到, 上海、廣州、四川使用者的數量顯然要比其他城市的使用者數量要多得多。再來看一下程式碼:
data = pd.read_sql("select * from convertData", conn) city = data.groupby(['cityName']) city_com = city['score'].agg(['mean','count']) city_com.reset_index(inplace=True) fo = open("citys.json",'r') citys_info = fo.readlines() citysJson = json.loads(str(citys_info[0])) print city_com data_map_all = [(getRealName(city_com['cityName'][i], citysJson),city_com['count'][i]) for i in range(0,city_com.shape[0])] data_map_list = {} for item in data_map_all: if data_map_list.has_key(item[0]): value = data_map_list[item[0]] value += item[1] data_map_list[item[0]] = value else: data_map_list[item[0]] = item[1] data_map = [(realKeys(key), data_map_list[key] ) for key in data_map_list.keys()]
漫威電影一直深受中國朋友們喜歡的高分電影。豆瓣評分 8.7 分,那我們的評論使用者中,又是一個什麼樣的趨勢呢?見下圖:
評分數
從圖中可以看到,評 5 分的數量遠高於其他評分,可見中國的觀眾朋友確實喜歡漫威的科幻電影。
復聯從 1 開始便是漫威宇宙各路超級英雄的集結,到現在的第 4 部,更是全英雄的匯聚。那麼,在這之中,哪位英雄人物更受觀眾歡迎?先看程式碼:
attr = ["滅霸","美國隊長", "鋼鐵俠", "浩克", "奇異博士","蜘蛛俠", "索爾" ,"黑寡婦", "鷹眼", "驚奇隊長", "幻視", "猩紅女巫","蟻人", "古一法師"] alias = { "滅霸": ["滅霸", "Thanos"], "美國隊長": ["美國隊長", "美隊"], "浩克": ["浩克", "綠巨人", "班納", "HULK"], "奇異博士": ["奇異博士", "醫生"], "鋼鐵俠": ["鋼鐵俠", "stark", "斯塔克", "託尼", "史塔克"], "蜘蛛俠": ["蜘蛛俠","蜘蛛","彼得", "荷蘭弟"], "索爾":["索爾", "雷神"], "黑寡婦": ["黑寡婦", "寡姐"], "鷹眼":["鷹眼","克林頓","巴頓","克林特"], "驚奇隊長":["驚奇隊長","卡羅爾", "驚奇"], "星雲":["星雲"], "猩紅女巫": ["猩紅女巫", "緋紅女巫", "旺達"], "蟻人":["蟻人", "蟻俠", "Ant", "AntMan"], "古一法師": ["古一", "古一法師", "法師"] } v1 = [getCommentCount(getAlias(alias, attr[i])) for i in range(0, len(attr))] bar = Bar("Hiro") bar.add("count",attr,v1,is_stack=True,xaxis_rotate=30,yaxix_min=4.2, xaxis_interval=0,is_splitline_show=True) bar.render("html/hiro_count.html")
執行結果如下圖,可以看到鋼鐵俠鋼鐵俠是實至名歸的 C 位,不僅電影在電影中是,在評論區仍然也是實至名歸的 C 位,甚至於遠超美隊、寡姐和雷神:
英雄評論次數
從以上觀眾分佈和評分的資料可以看到,這一部劇,觀眾朋友還是非常地喜歡。前面,從貓眼拿到了觀眾的評論資料。現在,筆者將通過 Jieba 把評論進行分詞,然後通過 Wordcloud 製作詞雲,來看看,觀眾朋友們對《復聯》的整體評價:
詞雲分析
可以看到,滅霸和鋼鐵俠出現的詞頻比其他英雄要高很多。這是否表示,這部劇的主角就是他們兩個呢?
細心的朋友應該發現了,鋼鐵俠、滅霸的數量在詞雲和評論數量裡面不一致。原因在於,評論數量就按評論條數來統計的,而詞雲中,使用的是詞頻,同一條評論中,多次出現會多次統計。所以,滅霸出現的次數居然高於了鋼鐵俠。
最後,再來分析一下鋼鐵俠與滅霸的情感分析,先上程式碼:
def emotionParser(name): conn = conn = sqlite3.connect("end.db") conn.text_factory = str cursor = conn.cursor() likeStr = "like \"%" + name + "%\"" cursor.execute("select content from convertData where content " + likeStr) values = cursor.fetchall() sentimentslist = [] for item in values: sentimentslist.append(SnowNLP(item[0].decode("utf-8")).sentiments) plt.hist(sentimentslist, bins=np.arange(0, 1, 0.01), facecolor="#4F8CD6") plt.xlabel("Sentiments Probability") plt.ylabel("Quantity") plt.title("Analysis of Sentiments for " + name) plt.show() cursor.close() conn.close()
此處,使用 SnowNLP 來進行情感分析。
情感分析,又稱為意見挖掘、傾向性分析等。簡單而言,是對帶有情感色彩的主觀性文字進行分析、處理、歸納和推理的過程。
滅霸
鋼鐵俠
從圖中看到, 鋼鐵俠的正向情感要比滅霸的正向情感要高,反派角色就是容易被人抗拒。
最最後,從《銀河護衛隊》時期穿越而來的滅霸在最後分鐘變成了粉末消散而去,這也給我們程式設計師一個警鐘:
重構程式碼,改善設計,降低系統複雜度,這樣做很好。但是,一定要保證系統的穩定執行,不留安全隱患,不然,早晚會丟掉自己的工作。
【END】
作為碼一代,想教碼二代卻無從下手:
聽說少兒程式設計很火,可它有哪些好處呢?
孩子多大開始學習比較好呢?又該如何學習呢?
最新的程式設計教育政策又有哪些呢?
下面給大家介紹CSDN新成員: 極客寶寶(ID: geek_baby)
戳他了解更多↓↓↓
熱 文推 薦
☞阿里要拆分“大中臺”模式?王欣馬桶 MT 更名“好記”;蘋果支付高通 47 億美元和解金 | 極客頭條
☞微軟釋出 VS Code Remote,開啟遠端開發新時代!
☞ 阿里半跪過,任正非差點跳樓,京東被騙光錢:成年人的生活哪有容易二字?
☞強推!盤點阿里巴巴 15 款開發者工具 | 程式設計師硬核評測
☞17篇論文入選CVPR 2019,百度AI都在關注什麼?(附論文地址)
System.out.println("點個在看吧!"); console.log("點個在看吧!"); print("點個在看吧!"); printf("點個在看吧!\n"); cout << "點個在看吧!" << endl; Console.WriteLine("點個在看吧!"); Response.Write("點個在看吧!"); alert("點個在看吧!") echo "點個在看吧!"
點選閱讀原文,輸入關鍵詞,即可搜尋您想要的 CSDN 文章。
你點的每個“在看”,我都認真當成了喜歡