ChatGPT 加圖資料庫 NebulaGraph 預測 2022 世界盃冠軍球隊

語言: CN / TW / HK

ChatGPT 預測世界盃

一次利用 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 真的能理解我指出的點,並給出相應的修正,像是:

chatGPT-correction-process

這一全過程我就不在這裡列出來了,不過我把生成的程式碼和整個討論的過程都分享在這裡,感興趣的同學可以去看看。

最終生成的資料是一個 CSV 檔案:

上面的資料集包含的資訊有:球隊、小組、編號、位置、球員名字、生日、年齡、參加國際比賽場次、進球數、服役俱樂部。

Team,Group,No.,Pos.,Player,DOB,Age,Caps,Goals,Club
Ecuador,A,1,1GK,Hernán Galíndez,(1987-03-30)30 March 1987,35,12,0,Aucas
Ecuador,A,2,2DF,Félix 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,São 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) 中的截圖:

schema_fifa

我們點選右上角的儲存後,便能建立一個新的圖空間,將這個圖建模應用到圖空間裡。

這裡可以參考下 Explore 草圖的文件:https://docs.nebula-graph.com.cn/3.3.0/nebula-explorer/db-management/draft/

匯入資料進 NebulaGraph

有了圖建模,我們可以把之前的 CSV 檔案(無表頭版本)上傳到 Studio 或者 Explorer 裡,通過點、選關聯不同的列到點邊中的 vid 和屬性:

importer_config_mapping

完成關聯之後,點選匯入,就能把整個圖匯入到 NebulaGraph。成功之後,我們還得到了整個 csv --> Nebula Importer 的關聯配置檔案:nebula_importer_config_fifa.yml,你可以直接拖拽整個配置,不用自己去配置它了。

importer_log

這裡可以參考 Explorer 資料匯入的文件:https://docs.nebula-graph.com.cn/3.3.0/nebula-explorer/db-management/11.import-data/

資料匯入後,我們可以在 schema 介面檢視資料統計。可以看到,有 831 名球員參加了 2022 卡達世界盃,他們服役在 295 個不同的俱樂部:

data_stats

這裡我們用到了 Explorer 的 schema 建立的文件:https://docs.nebula-graph.com.cn/3.3.0/nebula-explorer/db-management/10.create-schema/#_6

探索資料

查詢資料

下面,我們試著把所有的資料展示出來看看。

首先,藉助 NebulaGraph Explorer,我用拖拽的方式畫出了任意型別的點(TAG)和任意型別點(TAG)之間的邊。這裡,我們知道所有的點都包含在至少一個邊裡,所以不會漏掉任何孤立的點。

query-builder-0

讓 Explorer 它幫我生成查詢的語句。這裡,它預設返回 100 條資料(LIMIT 100),我們手動改大一些,將 LIMIT 後面的引數改到 10000,並讓它在 Console 裡執行。

query-builder-1

初步觀察資料

結果渲染出來是這樣子,可以看到結果自然而然地變成一簇簇的模式。

bird_view

這些外圍、形成的簇多是由不怎麼知名的足球俱樂部,和不怎麼厲害的國家隊的球員組成,因為通常這些俱樂部只有一兩個球員參加世界盃,而且他們還集中在一個國家隊、地區,所以沒有和很多其他球員、國家隊產生連線。

edge_teams

圖演算法輔助分析

在我點選了 Explorer 中的兩個按鈕之後(詳細參考後邊的文件連結),在瀏覽器裡,我們可以看到整個圖已經變成:

Barcelona

這裡可以參考 Explorer 的圖演算法文件:https://docs.nebula-graph.com.cn/3.3.0/nebula-explorer/graph-explorer/graph-algorithm/

其實,Explorer 這裡利用到了兩個圖演算法來分析這裡的洞察:

  1. 利用點的出入度,改變它們的顯示大小突出重要程度
  2. 利用 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 邊上的屬性了。

query_step0

然後,我們全選圖上的所有點,點選左邊的工具欄,選擇出方向的 belongto 邊,向外進行圖拓展(遍歷),同時選擇將拓展得到的新點標記為旗幟的 icon:

treversal_step1

現在,我們獲得了最終的子圖,我們利用工具欄裡的瀏覽器內的圖演算法功能,執行 BNC(Betweenness Centrality)

bnc_step2

最後,這個子圖變成了這樣子:

bnc_predict

預測結果

最終,我們根據 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 Gündoğan 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

原文地址:https://discuss.nebula-graph.com.cn/t/topic/11584


謝謝你讀完本文 (///▽///)

如果你想嚐鮮圖資料庫 NebulaGraph,記得去 GitHub 下載、使用、(^з^)-☆ star 它 -> GitHub;和其他的 NebulaGraph 使用者一起交流圖資料庫技術和應用技能,留下「你的名片」一起玩耍呀~