ChatGPT 加圖資料庫 NebulaGraph 預測 2022 世界盃冠軍球隊
一次利用 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,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) 中的截圖:
我們點選右上角的儲存後,便能建立一個新的圖空間,將這個圖建模應用到圖空間裡。
這裡可以參考下 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/
其實,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 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 使用者一起交流圖資料庫技術和應用技能,留下「你的名片」一起玩耍呀~
- 圖資料庫在中國移動金融風控的落地應用
- 記一次 rr 和硬體斷點解決記憶體踩踏問題
- 用圖技術搞定附近好友、時空交集等 7 個典型社交網路應用
- 用圖技術搞定附近好友、時空交集等 7 個典型社交網路應用
- 圖資料庫中的“分散式”和“資料切分”(切圖)
- 揭祕視覺化圖探索工具 NebulaGraph Explore 是如何實現圖計算的
- 連線微信群、Slack 和 GitHub:社群開放溝通的基礎設施搭建
- 圖資料庫認證考試 NGCP 錯題解析 vol.02:這 10 道題竟無一人全部答對
- 如何判斷多賬號是同一個人?用圖技術搞定 ID Mapping
- 複雜場景下圖資料庫的 OLTP 與 OLAP 融合實踐
- 如何運維多叢集資料庫?58 同城 NebulaGraph Database 運維實踐
- 有了 ETL 資料神器 dbt,表資料秒變 NebulaGraph 中的圖資料
- 基於圖的下一代入侵檢測系統
- 從實測出發,掌握 NebulaGraph Exchange 效能最大化的祕密
- 讀 NebulaGraph原始碼 | 查詢語句 LOOKUP 的一生
- 當雲原生閘道器遇上圖資料庫,NebulaGraph 的 APISIX 最佳實踐
- 從全球頂級資料庫大會 SIGMOD 看資料庫發展趨勢
- 「實操」結合圖資料庫、圖演算法、機器學習、GNN 實現一個推薦系統
- 如何輕鬆做資料治理?開源技術棧告訴你答案
- 圖演算法、圖資料庫在風控場景的應用