本屆世界盃冠軍是誰?我們用ChatGPT和圖資料庫一起預測……

一次利用 chatGPT 給出資料抓取程式碼,借助 NebulaGraph 圖資料庫與圖演算法預測體壇賽事的嘗試。

圖片也是用 OpenAI DALL-E 2 生成,並用 DALL-E 2 Outpainting 擴充的

本文轉載自悅數科技,作者古思為。

蹭 ChatGPT 熱度

最近因為世界盃正在進行,我受到這篇 Cambridge Intelligence 的文章啟發(在這篇文章中,作者僅僅利用有限的資訊量和條件,借助圖演算法的方法做出了合理的冠軍預測),想到可以試著用圖資料庫 NebulaGraph 玩玩冠軍預測,還能順道科普一波圖庫技術和圖演算法。

本來想著幾個小時擼出來一個方案,但很快被資料集的收集工作勸退了,我是實在懶得去 「FIFA 2022 的維基」抓取所需的資料,索性就擱淺、放了幾天。

同時,另一個熱潮是上週五 OpenAI 發佈了 ChatGPT 3 服務,它可以實現各種語言編碼。ChatGPT 可實現的複雜任務設計包括:

●      隨時幫你實現一段指定需求的程式碼

●      模擬任意一個 prompt 介面:shell、python、virtual machine、甚至你創造的語言

●      帶入給定的人設,和你聊天

●      寫詩歌、rap、散文

●      找出一段程式碼的 bug

●      解釋一段複雜的正規表示式的含義

ChatGPT 的上下文聯想力和理解力到了前所未有的程度,以至於所有接觸它的人都在討論新的工作方式:如何掌握讓機器幫助我們完成特定任務。

所以,當我試過讓 ChatGPT 幫我寫複雜的圖資料庫查詢語句、解釋複雜圖查詢語句的含義、解釋一大段 Bison 程式碼含義之後,我突然意識到:為什麼不讓 ChatGPT 幫我寫好抓取資料的程式碼呢?

抓取世界盃資料

我真試了下 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,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 在 NebulaGraph Studio/Explorer中的截圖

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

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

匯入資料進 NebulaGraph

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

來自轉載

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

來自轉載

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

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

來自轉載

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

探索資料

查詢資料

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

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

來自轉載

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

來自轉載

初步觀察資料

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

來自轉載

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

來自轉載

圖演算法輔助分析

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

來自轉載

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

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

1.    利用點的出入度,改變它們的顯示大小突出重要程度

2.    利用 Louvain 演算法區分點的社區分割

可以看到紅色的大點是鼎鼎大名的巴塞隆納,而它的球員們也被紅色標記了。

預測冠軍演算法

為了能充分利用圖的魔法(與圖上的隱含條件、資訊),我的思路是選擇一種利用連接進行節點重要程度分析的圖演算法,找出擁有更高重要性的點,對它們進行全域迭代、排序,從而獲得前幾名的國家隊排名。

這些方法其實就體現了厲害的球員同時擁有更大的社區、連接度。同時,為了增加強隊之間的區分度,我準備把出場率、進球數的資訊也考慮進來。

最終,我的演算法是:

●      取出所有的 (球員)-服役->(俱樂部) 的關係,過濾其中進球數過少、單場進球過少的球員(以平衡部分弱隊的老球員帶來的過大影響)

●      從過濾後的球員中向外探索,獲得國家隊

●      在以上的子圖上運行 Betweenness Centrality 演算法,計算節點重要度評分

演算法過程

首先,我們取出所有進球數超過 10,場均進球超過 0.2 的 (球員)-服役->(俱樂部) 的子圖:

子圖截圖

為了方便,我把進球數和出場數也作為了 serve 邊上的屬性了。

來自轉載

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

來自轉載

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

來自轉載

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

來自轉載

預測結果

最終,我們根據 Betweenness Centrality 的值排序,可以得到最終的獲勝球隊應該是:巴西 !

其次是比利時、德國、英格蘭、法國、阿根廷,讓我們等兩個禮拜回來看看預測結果是否精準吧 :D。

註:排序資料(其中還有非參賽球隊的點)

預測結果

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

本文由「王與桐」原創出品, 轉載或內容合作請點選 轉載說明 ;違規轉載必究。

本文經授權發布,不代表36氪立場。

如若轉載請註明出處。來源出處:36氪