大數據告訴你:10年漫威,到底有多少角色
最近正值復聯4上映,小F也發現了一個有趣的網站。
主要是關于漫威人物、漫威電影的圖譜。
https://graphics.straitstimes.com/STI/STIMEDIA/Interactives/2018/04/marvel-cinematic-universe-whos-who-interactive/index.html(復制到瀏覽器打開)
網站是基于Graph技術開發的。
其實之前小F也利用了有關Graph的庫實現了一波人物的關系分析。
只不過分析結果比較粗糙而已~
下面是網站的概況,大家可以一覽。
那么人家能做出這么酷炫的關系圖,我們自己能不能實現呢?
這一期就利用網站提供的數據,使用Neo4j(NOSQL圖形數據庫)進行實戰一波。
一、獲取分析
人物及人物關聯信息從網站上獲取,具體接口如下。
數據為json格式,分別在「characters」和「relationship」中。
這里的信息是分別指托尼·斯達克,關系「0」為朋友,斯蒂文·羅杰斯。
二、 數據獲取
具體代碼如下。
- headers = {
- 'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
- }
- url = 'https://graphics.straitstimes.com/STI/STIMEDIA/Interactives/2018/04/marvel-cinematic-universe-whos-who-interactive/data/marvel-data.json'
- response = requests.get(url=url, headers=headers)
- result = json.loads(response.text)
- num = 0
- names = []
- item = {0: 'friend', 1: 'enemy', 2: 'creation', 3: 'family', 4: 'work', 5: 'love'}
- for i in result['relationship']:
- subject = result['relationship'][i]['id']
- object = result['relationship'][i]['target_id']
- if subject not in names:
- names.append(subject)
- if object not in names:
- names.append(object)
- relation = int(result['relationship'][i]['relationship'])
- with open('relation_message.csv', 'a+') as f:
- f.write(subject + ',' + object + ',' + item[relation] + '\n')
- for j in names:
- num += 1
- with open('names_message.csv', 'a+') as f:
- f.write(j + ',' + str(num) + '\n')
- for k in result['characters']:
- id = result['characters'][k]['id']
- name = result['characters'][k]['name']
- status = result['characters'][k]['status']
- species = result['characters'][k]['species']
- with open('message.csv', 'a+') as f:
- f.write(id + ',' + name + ',' + status + ',' + species + '\n')
***成功獲取數據。
人物名為簡稱,共計182個人物。
1144條人物關系數據,4大類型。
下面是182個人物的一些詳情信息。
包含了人物的名字及簡稱,存活狀態,人物屬性。
三、數據可視化
下面通過Neo4j對人物關系進行可視化。
Neo4j的安裝這里就不細說了,大家可以自行百度。
開啟Neo4j服務后,登陸Neo4j網站,初始化界面如下。
先加載***個文件。
具體代碼如下。
- LOAD CSV WITH HEADERS FROM 'file:///names_message.csv' AS data CREATE (:people{name:data.name, id:data.id});
下面加載第二個文件。
具體代碼如下。
- LOAD CSV WITH HEADERS FROM "file:///relation_message.csv" AS relations
- MATCH (entity1:people{name:relations.subject}) , (entity2:people{name:relations.object})
- CREATE (entity1)-[:rel{relation: relations.relation}]->(entity2)
點擊1144按鈕處,取消限制數,再點擊全屏。
這里大致能看出來漫威的人物聚集情況。
***大反派滅霸(thanos),原來這么孤立的。
這里由于人物太多,造成觀察不便,所以對結果進行一些篩選。
比如篩選托尼·斯達克的朋友,運行下面的代碼。
- match p=(n:people{name:"tonys"})-[:rel{relation:"friend"}]->() return p;
得到下圖結果。
其中「thor」為「雷神」,「stever」為「美隊」,「blackw」為「黑寡婦」,「vision」為「幻視」,「peterp」為「蜘蛛俠」,「bruceb」為「綠巨人」。
下面再來看一下美隊的女友吧。
佩吉·卡特和她的侄女莎朗·卡特,據說兩人樣貌極為相像。
四、總結
本次只是對Neo4j的一些簡單操作,后期或許會去深入了解。
此外漫威的這些人物信息,還可以玩出很多花樣的。
也希望大家能去動手嘗試嘗試,做一枚硬核鐵粉~