一次运用 ChatGPT 给出数据抓取代码,凭借 NebulaGraph 图数据库与图算法猜测体坛赛事的测验。
作者:古思为
蹭 ChatGPT 热度
最近由于世界杯正在进行,我受到这篇 Cambridge Intelligence 的文章启示(在这篇文章中,作者只是运用有限的信息量和条件,凭借图算法的办法做出了合理的冠军猜测),想到能够试着用图数据库 NebulaGraph 玩玩冠军猜测,还能顺道科普一波图库技术和图算法。
本来想着几个小时撸出来一个方案,但很快被数据集的搜集工作劝退了,我是实在懒得去「FIFA 2022 的维基」抓取所需的数据,索性就搁浅、放了几天。
一同,另一个热潮是上周五 OpenAI 发布了 ChatGPT 服务,它能够完结各种语言编码。ChatGPT 可完结的杂乱使命设计包括:
- 随时帮你完结一段指定需求的代码
- 模仿恣意一个 prompt 界面:Shell、Python、Virtual Machine、乃至你发明的语言
- 带入给定的人设,和你聊天
- 写诗篇、rap、散文
- 找出一段代码的 bug
- 解说一段杂乱的正则表达式的意义
ChatGPT 的上下文联想力和了解力到了前所未有的程度,以至于一切接触它的人都在评论新的工作方式:怎么把握让机器帮助咱们完结特定使命。
所以,当我试过让 ChatGPT 帮我写杂乱的图数据库查询句子、解说杂乱图查询句子的意义、解说一大段 Bison 代码意义之后,我突然意识到:为什么不让 ChatGPT 帮我写好抓取数据的代码呢?
抓取世界杯数据
我真试了下 ChatGPT,成果是:完全能够,并且好像真的很简单。
整个完结进程,基本上我像是一个代码考试的面试官,或是一个产品经理,提出我的需求,ChatGPT 给出具体的代码完结。我再试着运转代码,找到代码中不合理的地方,指出来并给出主张,ChatGPT 真的能了解我指出的点,并给出相应的批改,像是:
这一全进程我就不在这儿列出来了,不过我把生成的代码和整个评论的进程都分享在这儿,感兴趣的同学能够去看看。
终究生成的数据是一个 CSV 文件:
- 代码生成的文件 world_cup_squads.csv
- 手动修正、分开了生日和年纪的列 world_cup_squads_v0.csv
上面的数据集包括的信息有:球队、小组、编号、方位、球员名字、生日、年纪、参与世界比赛场次、进球数、执役沙龙。
Team,Group,No.,Pos.,Player,DOB,Age,Caps,Goals,Club
Ecuador,A,1,1GK,Hernn Galndez,(1987-03-30)30 March 1987,35,12,0,Aucas
Ecuador,A,2,2DF,Flix Torres,(1997-01-11)11 January 1997,25,17,2,Santos Laguna
Ecuador,A,3,2DF,Piero Hincapi,(2002-01-09)9 January 2002,20,21,1,Bayer Leverkusen
Ecuador,A,4,2DF,Robert Arboleda,(1991-10-22)22 October 1991,31,33,2,So Paulo
Ecuador,A,5,3MF,Jos Cifuentes,(1999-03-12)12 March 1999,23,11,0,Los Angeles FC
这是手动删除了 CSV 表头的数据集 world_cup_squads_no_headers.csv。
图办法猜测 2022 世界杯
图建模
本文用到了图数据库 NebulaGraph 和可视化图探究东西 NebulaGraph Explorer,你能够在阿里云免费请求半个月的试用,进口链接是 请求运用云端 NebulaGraph。
图建模(Graph Modeling)是把实在世界信息以”点–>边“的图形式去笼统与表示。
这儿,咱们把在公共范畴取得的信息映射成如下的点与边:
点:
- player(球员)
- team(球队)
- group(小组)
- club(沙龙)
边:
- groupedin(球队归于哪一小组)
- belongto(队员归于国家队)
- serve(队员在沙龙执役)
而队员的年纪、参与世界场次(caps)、进球数(goals)则很天然作为 player 这一类点的特点。
下图是这个 schema 在 NebulaGraph Studio/Explorer(后边称 Studio/Explorer) 中的截图:
咱们点击右上角的保存后,便能创立一个新的图空间,将这个图建模使用到图空间里。
这儿能够参阅下 Explore 草图的文档:docs.nebula-graph.com.cn/3.3.0/nebul…
导入数据进 NebulaGraph
有了图建模,咱们能够把之前的 CSV 文件(无表头版本)上传到 Studio 或者 Explorer 里,通过点、选关联不同的列到点边中的 vid 和特点:
完结关联之后,点击导入,就能把整个图导入到 NebulaGraph。成功之后,咱们还得到了整个 csv --> Nebula Importer
的关联配置文件:nebula_importer_config_fifa.yml,你能够直接拖拽整个配置,不用自己去配置它了。
这儿能够参阅 Explorer 数据导入的文档:docs.nebula-graph.com.cn/3.3.0/nebul…
数据导入后,咱们能够在 schema 界面查看数据统计。能够看到,有 831 名球员参与了 2022 卡塔尔世界杯,他们执役在 295 个不同的沙龙:
这儿咱们用到了 Explorer 的 schema 创立的文档:docs.nebula-graph.com.cn/3.3.0/nebul…
探究数据
查询数据
下面,咱们试着把一切的数据展示出来看看。
首要,凭借 NebulaGraph Explorer,我用拖拽的方式画出了恣意类型的点(TAG)和恣意类型点(TAG)之间的边。这儿,咱们知道一切的点都包括在至少一个边里,所以不会漏掉任何孤立的点。
让 Explorer 它帮我生成查询的句子。这儿,它默认返回 100 条数据(LIMIT 100
),咱们手动改大一些,将 LIMIT 后边的参数改到 10000,并让它在 Console 里履行。
初步调查数据
成果渲染出来是这姿态,能够看到成果天然而然地变成一簇簇的形式。
这些外围、形成的簇多是由不怎么知名的足球沙龙,和不怎么厉害的国家队的球员组成,由于通常这些沙龙只有一两个球员参与世界杯,并且他们还集中在一个国家队、地区,所以没有和许多其他球员、国家队产生衔接。
图算法辅佐剖析
在我点击了 Explorer 中的两个按钮之后(详细参阅后边的文档链接),在浏览器里,咱们能够看到整个图已经变成:
这儿能够参阅 Explorer 的图算法文档:docs.nebula-graph.com.cn/3.3.0/nebul…
其实,Explorer 这儿运用到了两个图算法来剖析这儿的洞察:
- 运用点的收支度,改变它们的显示大小突出重要程度
- 运用 Louvain 算法区分点的社区分割
能够看到赤色的大点是鼎鼎大名的巴塞罗那,而它的球员们也被赤色标记了。
猜测冠军算法
为了能充分运用图的魔法(与图上的隐含条件、信息),我的思路是挑选一种运用衔接进行节点重要程度剖析的图算法,找出具有更高重要性的点,对它们进行全局迭代、排序,从而取得前几名的国家队排名。
这些办法其实就体现了厉害的球员一同具有更大的社区、衔接度。一同,为了添加强队之间的区分度,我准备把进场率、进球数的信息也考虑进来。
终究,我的算法是:
- 取出一切的
(球员)-执役->(沙龙)
的关系,过滤其间进球数过少、单场进球过少的球员(以平衡部分弱队的老球员带来的过大影响) - 从过滤后的球员中向外探究,取得国家队
- 在以上的子图上运转 Betweenness Centrality 算法,计算节点重要度评分
算法进程
首要,咱们取出一切进球数超越 10,场均进球超越 0.2 的 (球员)-执役->(沙龙)
的子图:
MATCH ()-[e]->()
WITH e LIMIT 10000
WITH e AS e WHERE e.goals > 10 AND toFloat(e.goals)/e.caps > 0.2
RETURN e
为了便利,我把进球数和进场数也作为了 serve 边上的特点了。
然后,咱们全选图上的一切点,点击左边的东西栏,挑选出方向的 belongto
边,向外进行图拓展(遍历),一同挑选将拓展得到的新点标记为旗号的 icon:
现在,咱们取得了终究的子图,咱们运用东西栏里的浏览器内的图算法功能,履行 BNC(Betweenness Centrality)
最后,这个子图变成了这姿态:
猜测成果
终究,咱们根据 Betweenness Centrality 的值排序,能够得到终究的取胜球队应该是:巴西 !
其次是比利时、德国、英格兰、法国、阿根廷,让咱们等两个礼拜回来看看猜测成果是否精确吧 :D。
注:排序数据(其间还有非参赛球队的点)
Vertex | Betweenness Centrality |
---|---|
Brazil | 3499 |
Paris Saint-Germain | 3073.3333333333300 |
Neymar | 3000 |
Tottenham Hotspur | 2740 |
Belgium | 2587.833333333330 |
Richarlison | 2541 |
Kevin De Bruyne | 2184 |
Manchester City | 2125 |
lkay Gndoan | 2064 |
Germany | 2046 |
Harry Kane (captain | 1869 |
England | 1864 |
France | 1858.6666666666700 |
Argentina | 1834.6666666666700 |
Bayern Munich | 1567 |
Kylian Mbapp | 1535.3333333333300 |
Lionel Messi (captain | 1535.3333333333300 |
Gabriel Jesus | 1344 |
原文地址:discuss.nebula-graph.com.cn/t/topic/115…
谢谢你读完本文 (///▽///)
如果你想尝鲜图数据库 NebulaGraph,记住去 GitHub 下载、运用、(^^)-☆ star 它 -> GitHub;和其他的 NebulaGraph 用户一同交流图数据库技术和使用技术,留下「你的手刺」一同玩耍呀~