4 ポイント 投稿者 GN⁺ 2024-12-16 | 1件のコメント | WhatsAppで共有
  • Map of GitHubは、69万件以上のGitHubプロジェクトを点として配置した地図で、共通のstargazerが多いプロジェクトほど互いに近く配置されます
  • 地図作成にはGoogle BigQueryのGitHubアクティビティイベント公開データセットが使われ、2011年2月から2025年5月までのイベントから約5億件のstarデータを使用しています
  • リポジトリ間の関係計算には正確なJaccard Similarityが使われ、24GB RAMの家庭用コンピューターでは足りず、512GB RAMのAWS EC2インスタンスで数時間かけて処理しました
  • クラスタリングでは複数のアルゴリズムを試した後、Leiden clusteringを採用し、結果として約69万件のプロジェクトが1,500以上のクラスターに分けられました
  • レンダリングは独自のレイアウトツールとmaplibre、GeoJSON、tippecanoeを組み合わせて実装され、国名ラベルの多くはChatGPTの助けで生成されています

プロジェクト概要

  • Map of GitHubは、69万件以上のGitHubプロジェクトを可視化した地図です
  • 各点は1つのプロジェクトを表します
  • 共通してstarを付けたユーザーが多いプロジェクト同士ほど、地図上でより近くに配置されます

公開バージョン

データ収集と類似度計算

  • 第1段階では、どのユーザーがどのリポジトリにstarを付けたかを取得します
    • Google BigQueryのGitHubアクティビティイベント公開データセットを使用しています
    • 対象期間は2011年2月から2025年5月までです
    • この過程で約5億件のstarデータを取得しました
  • 第2段階では、各リポジトリ間の正確なJaccard Similarityを計算します
    • 24GB RAMの家庭用コンピューターには計算量が大きすぎました
    • 512GB RAMを備えたAWS EC2インスタンスでは数時間以内に処理できました
    • 他の類似度方式も試しましたが、Jaccardが最も信頼できる結果を出しました

クラスタリングと地図レイアウト

  • 第3段階では、リポジトリをまとめるために複数のクラスタリングアルゴリズムを試しました
  • 最終的にLeiden clusteringを最も好ましいものとして採用し、約69万件前後のプロジェクトが1,500以上のクラスターに分けられました
  • 第4段階では、クラスター内部のノード配置に独自のngraph.forcelayoutを使用しています
  • クラスター全体のグローバル配置には別の設定を使用しています

レンダリング方式

  • 第5段階は地図をレンダリングするプロセスです
  • 以前のプロジェクトとは異なり、車輪の再発明を避けるためmaplibreを使用しています
  • データはGeoJSON形式に変換されます
  • タイル生成にはtippecanoeが使用されています
  • その後、地図探索の体験を構成します

国名ラベル生成

  • 地図に表示される多くの国ラベルはChatGPTの助けで生成されています
  • 誤ったラベルを見つけた場合は、右クリックで修正し、pull requestを送ることができます
  • ラベル生成用のシステムプロンプトは、GitHubリポジトリのまとまりを特定のプログラミングコミュニティにおける「国」と見なし、ユニークで覚えやすい名前を作るよう求めています
    • 名前は1〜3語で簡潔である必要があります
    • そのリポジトリ群に共通するテーマ、技術、目的を捉える必要があります
    • 「JSWorld」「UI」「Web」「Forge」「Archipelago」「Hub」「Republic」「Nexus」のような一般的な表現は避ける必要があります
    • 似たリポジトリ名を単純に結合してはいけません
    • 地図上で即座に識別できるほど、他の国名と区別できる必要があります
  • ユーザー入力にはrepoListrepoNamesOnlyが含まれ、それらのリポジトリの具体的なテーマや技術を分析して名前を作るよう求めます
  • LLMが以前の名前と似すぎた名前を返した場合は再試行させ、temperatureを上げてより創造的な結果を促します

検索とデザイン

  • 検索ボックスは、すべてのリポジトリの単純なダンプを先頭文字または作者を基準にインデックス化して実装しています
  • 検索欄にaを入力すると、aで始まるリポジトリを探し、クライアント側でファジーマッチャーにより表示します
  • 現在のデータ表現は気に入っていますが、地図のビジュアルデザインについてはまだ適したスタイルを探しています
  • 地図デザインの経験やビジュアル面のアイデアがあれば共有してほしいと依頼しています

ライセンス

  • リポジトリはMITライセンスで公開されています
  • データを他の作業に使用する場合は、このプロジェクトへのattributionを検討してほしいと依頼しています

1件のコメント

 
GN⁺ 2024-12-16
Hacker News のコメント
  • なぜか torvalds/linux が、JS プロジェクトや awesome-X リスト、フロントエンドのチェックリストの隣にある Fronterra にある
    カーネルハッカーたちが突然フロントエンドを愛するようになったのか、よりありそうなのは、コードを書く人たちと GitHub プロジェクトにスターを付ける人たちがあまり重なっていないということだろう

    • ジャカード類似度は「有名人」プロジェクトにはあまり向いていない
      意味的な関係があって似ているのではなく、単にどちらも人気があるから似て見える
      reddit の地図でも同じ問題があった: https://anvaka.github.io/map-of-reddit/ — 人気のあるサブレディットは全部互いに「似ている」ことになってしまう
      それでも小さくてあまり有名でないプロジェクトには、まだうまく機能する :D
    • プロジェクトを整理するには コード埋め込みのほうがよかったのかもしれないとも思う
      ただ、各ファイルをダウンロードして埋め込みを計算するのに必要なリソースを考えると、おそらく現実的には難しそう
    • ヒートマップが実質的に人口地図になりがちな理由と似ているのかもしれない
      https://xkcd.com/1138/
    • react のせいかな?
  • 実際のリンク: https://anvaka.github.io/map-of-github/

    • そう、リポジトリではなくこのリンクが貼られるべきだった
  • Among Us の区域名が Sussex なのを見て笑った

    • 自分が見た中で一番笑ったのは Lispaña だった
  • Rustland がこんなに小さいことに驚いた。Clouderra の中の一州くらいしかない
    Bevy と Veloren がどちらも Rustland にあるのも興味深い。おそらくスターはゲーム開発コミュニティより Rust コミュニティから多く来ているのだろう
    Rust エコシステムはまだ比較的小さく、「X を Rust でやる人たち」が多く見えるという点では納得できる

    • nodelandia もこんなに小さく、しかも独立した大陸ですらないのは衝撃的
      みんな自分のバブルの大きさを過大評価しているようだ
    • 「PlusPlus Nation」のほかのカーネルの近くに、OS 開発の Rust プロジェクトがたくさん見える
      すると「X but in Rust」は「RustLand」ではなく「X」側に入ることもあるのだろう
    • そこまで驚くことではない。Rust は声の大きい少数派が布教する言語としても知られている
    • OP によるとデータは 2023年3月時点なので、より最近の Rust プロジェクトはまだあまり含まれていないはず
    • それでもその中に bevy が見えるのはうれしい :)
  • 自分のプロジェクト mapbox-gl-utils をここで見つけられて、とても面白い
    https://anvaka.github.io/map-of-github/#12/24.78947/18.85186

  • 検索機能なしで、地図だけを使って特定のプロジェクトを探すのが楽しいミニゲームになる :-)

    • あるいは、あるプロジェクトから別のプロジェクトまで道を探してもいい。航路があると想像できる :)
  • Julia ファンとして、julialang/julia につながりがこんなに少ないのは驚き
    ニッチな言語ではあるけれど、この地図でこれほど孤立して見えることが、ユーザーや開発者の体験とかけ離れているわけでもなさそう

    • julialang/julia がある島の西側に JuliaLand がある
      julialang/julia 自体は tensorflow や opencv の近くにあり、実際の Julia パッケージは別の場所に集まっているのは、「期待ユーザー」と「実際のユーザー」の違いを示しているようだ
      Julia プロジェクト自体にスターを付けた多くの人は、新しい Python を探していた数値計算系の Python ユーザーだったが、大半は Python に残ったため、ほかのスターも数値計算 Python 側にある
      一方で JuliaLand のパッケージにスターを付けた人たちは実際の Julia ユーザーなので、もっともらしくも Moleculandia、AstroSpace、Quantumia の近くに集まっている
  • とてもすっきりした創造的なアプローチだが、国/地図のメタファーが最善かどうかは正直悩ましい
    多くの場合、名前だけでは明確でなく、何を表しているのか理解するには拡大する必要がある
    むしろ階層的クラスタリングを行い、より説明的で忠実な LLM 生成ラベルを付けたうえで、上位クラスタ間の平均的なつながりを線で示すような形のほうが面白かったかもしれない

    • 線だらけの重い図ではないことに、むしろ気持ちよく驚いた
      90年代にそういう図を初めて作り、ほとんどすぐに限界を学んだ立場としては、これは過剰な主張をしていないのがよい。論文ではなく、一つの見方にすぎない
      軸に意味のある図が好きだ。線、形、ボックス/グループ、距離、X 対 Y、色、太さ、質感、背景、前景といったものだ
      シンプルなものもよい。あまりにも頻繁に、何の意味もなく見栄えのためだけに線を引くが、これはただ少しグループがある図で、個性がある。いいのでは?
      もちろん線は今でも好きだが、いつでもどこでも必要というわけではない
    • まだ万能なクラスタリングアルゴリズムは見つけられていない
      データのまとめ方が複数あって、それぞれ筋が通ることがよくあり、だからどの最終クラスタリングを選んでも完璧ではない
      うーん……もしかすると量子クラスタリングのようなものをやると面白いプロジェクトになるかもしれない
      今では少し記憶が曖昧だが、hdbscan アルゴリズム、つまり階層的クラスタリングを試した覚えがある。GitHub 規模のグラフではメモリに載せられなかった
      結局、階層的クラスタリングに似たもの、louvain/leiden/自作の手法を混ぜたものを使い、最終的な地図に見えているものがその結果だ
    • そうすることもできただろうが、このプロジェクトは地図を作ることにしたのだ
  • QuitlessiaNeoQuitlessia とは……名前が邪悪だ
    Doom Emacs が Emacsia ではなく NeoQuitlessia にあるが、驚くほど納得できる :)

    • はは!vim が大好き
      我々は終了しない
  • リポジトリ間のつながりがどう決まるのか気になる
    自分のリポジトリをいくつか確認したが、一部のつながりはどちらの方向にも参照が見えない

    • 作者が元の HN 投稿で答えていた: https://news.ycombinator.com/item?id=35933981
      基本的にはほかの人たちが推測したように、線は「スターを付けた人たち」に基づく最も高い類似度スコアを表し、地図全体もその基準で形成されている
      紛らわしいかもしれないが、線は特定の国をクリックしたときにだけ表示される
    • 1行目に書いてある: 「共通してスターを付けた人が多いほど、点同士は近くなる」
    • ジャカード類似度は 0 から 1 の間の値を返す。この場合、ほとんどの値は 0 に近いはず
      辺を作るかどうかを決めるハードコードされたしきい値がありそうだ。例えば A と B の間のジャカード類似度が 0.2 より大きければ辺を作る、という具合だ