填坑填坑!
娱乐圈明星关系图谱体验地址, 建议先体验后阅读本文, 或者先打开链接, 等阅读完没准页面也加载好了 (太卡警告! 或者去 B 站看下录制的 28s 超短视频: 超酷炫的娱乐圈明星关系图谱, 初次录, 戛然而止勿喷):
https://desertsx.github.io/yulequan-relations-graph/
在 InteractiveGraph 实现酷炫关系图谱之前瞻 一文里边扯皮边介绍了娱乐圈明星关系图谱的相关内容, 并讲解了项目的关键步骤, 但因为一直没有将代码上传到 GitHub, 未免有些夸夸其谈, 毕竟 talk is cheap, show me the code 才是正事.
在重新修改过各文件名称 (因而会和前瞻一文有些出入, 某些平台上可编辑的话会进行修改以确保和本文一致), 去掉无用冗余内容, 加好注释说明后, 代码已经开源在: DesertsX/YuLeQuan_Stars_Relation_Graph_By_InteractiveGraph.
文件目录结构如下所示, 用的是可在线生成的工具: Dir Tree Noter, 以下对各文件作用进行简单说明.
YuLeQuan_Stars_Relation_Graph_By_InteractiveGraph
├─ stock_csv2json.py
├─ stock_data.CSV
├─ apachecn_csv2json.py
├─ apachecn_data.CSV
├─ ylq_all_star_relations.CSV
└─ ylq_star_infos.CSV
├─ ylq_star_images_spider.py
├─ Infos_and_Data2Json.ipynb
├─ webapp
│ ├─ __init__.py
│ ├─ app_run.py
│ ├─ static
│ │ ├─ honglou.JSON
│ │ ├─ stock_graph.JSON
│ │ ├─ apachecn_graph.JSON
│ │ └─ ylq_star_relation_graph_v2.JSON
│ │ ├─ images
│ │ │ ├─ person
│ │ │ └─ star
│ │ ├─ lib
│ │ │ ├─ font-awesome-4.7.0
│ │ │ ├─ interactive-graph-0.1.0
│ │ │ └─ jQuery-3.2.1
│ ├─ templates
│ │ ├─ apachecn.html
│ │ ├─ stock_relation.HTML
│ │ └─ yulequan-relations-graph.HTML
│ └─ views
│ ├─ __init__.py
│ └─ graph_view.py
项目里其实包含三个小项目: stock / apachecn / ylq_star_relation_graph, 且分别保留了原始 CSV 数据及转换成所需 JSON 数据的 python 代码; 处理后的数据位于 webapp/static 下; 对应的 HTML 文件位于 Web/templates/ 下; 如果图谱里的节点用到了图像, 一律在 webapp/static/images 下, 而这里的 person 对应 apachecn 项目, star 对应 ylq_star_relation_graph 项目, 其中后者由 ylq_star_images_spider.py 爬取获得所需的千余张明星图像; webapp/static/lib 里用到的是 InteractiveGraph 的资源, 未做修改, 直接使用即可.
项目用到了 Flask, 需自行安装; 运行 app_run.py 启动内建的服务器, 浏览器里打开 http://127.0.0.1:5000, 再结合 graph_view.py 里定义过的路由, 就能看到三个小项目的对应展示情况.
- # graph_view.py
- from flask import Blueprint, request, render_template
- graph = Blueprint('graph', __name__)
- # http://127.0.0.1:5000/graph/relation?stock1=平安银行&stock2=招商银行
- @graph.route('/graph/relation', methods=['GET'])
- def get_relation():
- stock1 = request.args.get('stock1')
- stock2 = request.args.get('stock2')
- return render_template('stock_relation.html', stock1=stock1, stock2=stock2)
- # http://127.0.0.1:5000/apachecn
- @graph.route('/apachecn')
- def apachecn():
- return render_template('apachecn.html')
- # http://127.0.0.1:5000/yulequan-relations-graph
- @graph.route('/yulequan-relations-graph') # 不要写成 /graph/yulequan-relations-graph 否则加载头像图片时无法显示
- def ylq():
- return render_template('yulequan-relations-graph.html')
三个小项目分别对应的链接:
- http://127.0.0.1:5000/graph/relation?stock1=平安银行&stock2=招商银行
- http://127.0.0.1:5000/apachecn
- http://127.0.0.1:5000/yulequan-relations-graph
以上, 如果你只想运行本项目, 了解这么多即可.
如果你想构建自己的关系图谱, 但对数据处理和转换没有头绪, 接下来的内容或许能帮助到你. 本次娱乐圈明星关系图谱的数据处理和转换在 Infos_and_Data2Json.ipynb 里有详细代码和必要的说明, 本文仅简述下要点.
最终想构建出怎样的关系图谱, 就需要预先准备好怎样的数据.
例如当点击明星节点时, 想呈现哪些详细介绍内容, 就需要在爬取数据时解析和存储对应的数据, 本次仅为练手, 所以只用到了明星个人主页里很少的数据, 以刘烨为例 (刘烨个人主页), 其 infos 就是 ['中国吉林', '75 KG', '1978-03-23'].
明星关系图谱里涉及明星类和地区类两类节点, 而查看爬取完的数据, 发现地区数据比较杂乱, 还需进行处理.
这里是古柳的一种处理方式, 大家可自行 DIY: 海外的地区一律用对应的国家名; 中国的地区有细分的则一律用对应的省份名, 无细分的则统一用 "中国"; 剩下的用 "不详". 其中, area_list 和 area_map 是根据实际数据整理出来的, 更详细代码见: DesertsX/YuLeQuan_Stars_Relation_Graph_By_InteractiveGraph.
- area_list = ['美国', '以色列', '澳大利亚', '英国', '加拿大', '文莱', '新加坡', '西班牙', '越南', '罗马尼亚', '马来西亚', '菲律宾', '新西兰',
- '韩国', '日本', '北京', '天津', '上海', '重庆', '河北', '山西', '辽宁', '吉林', '江苏', '浙江', '安徽', '福建', '江西', '山东',
- '河南', '湖北', '湖南', '广东', '海南', '四川', '贵州', '云南', '陕西', '甘肃', '青海', '台湾', '广西', '西藏', '宁夏', '新疆',
- '香港', '澳门', '内蒙古', '黑龙江']
- area_map = {'纽约': '美国', '美籍': '美国', '俄克拉荷马': '美国', '加州': '美国', '伦敦': '英国',
- '东京': '日本', '京畿道高阳市': '韩国', '大邱广域市': '韩国', '台北':'台湾', '遵义': '贵州',
- '南京': '江苏', '青岛': '山东', '深圳': '广东', '杭州': '浙江', '成都': '四川', '衡水': '河北',
- '大连': '山东', '齐齐哈尔': '黑龙江', '淮安': '江苏', '温州': '浙江', '唐山': '河北', '福州': '福建',
- '营口': '辽东', '武汉': '湖北', '广州': '广东'}
- def get_city(address):
- for area in area_list:
- if area in address:
- return area
- for area in area_map.keys():
- if area in address:
- return area_map[area]
- if '中国' in address: return '中国'
- else: return '不详'
- ylq_star_infos['area'] = ylq_star_infos['address'].apply(get_city)
- ylq_star_infos.head()
接下来是将爬取的 CSV 数据转换成 InteractiveGraph 所需的 JSON 数据, 可以参考 GitHub/InteractiveGraph 项目里给出的红楼梦数据: dist/examples/honglou.JSON. 古柳对该数据集曾简单介绍和分析过, 可见: 安利一个惊艳的红楼梦可视化作品和左手读红楼梦, 右手写 BUG, 闲快活. 详细代码一展开讲又会又臭又长, 大家还是去 GitHub 看吧, 有疑问可去 "Python 交友娱乐会所"(QQ 群: 613176398), 最终 JSON 数据最终格式大致如下, InteractiveGraph 0.1.1 版本还需加一段 JavaScript 代码, InteractiveGraph 0.2.0 应该是不需要了, 本次用了前者, 后者还未尝试过, 有机会再看:
- {
- "categories": {
- "Star": "明星",
- "Area": "地区"
- },
- "data": {
- "nodes": [
- {
- "label": "中国",
- "value": 211,
- "id": 117971764772430883811744432104367026350,
- "categories": [
- "Area"
- ],
- "info": ""
- },
- ...
- {
- "label": "新垣结衣",
- "value": 1,
- "id": 71,
- "image": "static/images/star / 新垣结衣. jpg",
- "categories": [
- "Star"
- ],
- "info": "日本 / 1988-06-11"
- },
- ...
- ],
- "edges": [
- {
- "id": 221862466013404320763033294366140362926,
- "label": "姐弟",
- "from": 801,
- "to": 1255
- },
- ...
- {
- "id": 300862216428897559752162867914678825134,
- "label": "出生于",
- "from": 1,
- "to": 117971766594678621641213275765944971438
- },
- ...
- ]
- }
- }
处理完数据, 回过头添加对应 yulequan-relations-graph.HTML 文件; 在 graph_view.py 里定义路由, 渲染 HTML 文件, 运行 app_run.py , 打开 http://127.0.0.1:5000/yulequan-relations-graph 就成功啦! 欢迎大家在自己感兴趣的数据集上动手实现酷炫的关系图谱.
以上, 完结撒花!
来源: http://www.jianshu.com/p/f608ab94ab5d