4 điểm bởi GN⁺ 2024-12-16 | 1 bình luận | Chia sẻ qua WhatsApp
  • Map of GitHub là một bản đồ đặt hơn 690 nghìn dự án GitHub dưới dạng các điểm, trong đó các dự án có nhiều người dùng cùng gắn sao sẽ nằm gần nhau hơn
  • Việc tạo bản đồ sử dụng bộ dữ liệu công khai về sự kiện hoạt động GitHub trên Google BigQuery, và dùng khoảng 500 triệu dữ liệu star từ các sự kiện trong giai đoạn tháng 2 năm 2011 đến tháng 5 năm 2025
  • Việc tính toán quan hệ giữa các kho dùng Jaccard Similarity chính xác; máy tính gia đình với 24GB RAM là không đủ, nên quá trình này được xử lý trong vài giờ trên một phiên bản AWS EC2 với 512GB RAM
  • Sau khi thử nhiều thuật toán, bản đồ chọn Leiden clustering cho bước phân cụm, và kết quả là khoảng 690 nghìn dự án được chia thành hơn 1.500 cụm
  • Phần kết xuất được triển khai bằng cách kết hợp công cụ bố cục tự xây dựng với maplibre, GeoJSON và tippecanoe; nhiều nhãn tên quốc gia được tạo với sự hỗ trợ của ChatGPT

Tổng quan dự án

  • Map of GitHub là bản đồ trực quan hóa hơn 690 nghìn dự án GitHub
  • Mỗi điểm đại diện cho một dự án
  • Những dự án có nhiều người dùng cùng gắn star sẽ được đặt gần nhau hơn trên bản đồ

Phiên bản công khai

Thu thập dữ liệu và tính toán độ tương đồng

  • Ở bước đầu tiên, hệ thống lấy dữ liệu người dùng nào đã gắn star cho kho nào
    • Sử dụng bộ dữ liệu công khai về sự kiện hoạt động GitHub trên Google BigQuery
    • Khoảng thời gian mục tiêu là từ tháng 2 năm 2011 đến tháng 5 năm 2025
    • Quá trình này thu được khoảng 500 triệu dữ liệu star
  • Ở bước thứ hai, hệ thống tính Jaccard Similarity chính xác giữa từng kho
    • Khối lượng tính toán quá lớn đối với máy tính gia đình có 24GB RAM
    • Trên một phiên bản AWS EC2 có 512GB RAM, quá trình được xử lý trong vài giờ
    • Dù đã thử các cách đo độ tương đồng khác, Jaccard cho kết quả đáng tin cậy nhất

Phân cụm và bố cục bản đồ

  • Ở bước thứ ba, dự án thử nhiều thuật toán phân cụm để nhóm các kho lại
  • Cuối cùng, dự án ưu tiên Leiden clustering nhất, và khoảng 690 nghìn dự án được chia thành hơn 1.500 cụm
  • Ở bước thứ tư, dự án dùng ngraph.forcelayout tự xây dựng để bố trí các nút bên trong từng cụm
  • Việc bố trí toàn cục của toàn bộ các cụm sử dụng cấu hình riêng

Cách kết xuất

  • Bước thứ năm là quá trình kết xuất bản đồ
  • Không giống các dự án trước đó, để tránh tự làm lại từ đầu, dự án sử dụng maplibre
  • Dữ liệu được chuyển đổi sang định dạng GeoJSON
  • tippecanoe được dùng để tạo tile
  • Sau đó, dự án xây dựng trải nghiệm khám phá bản đồ

Tạo nhãn tên quốc gia

  • Nhiều nhãn quốc gia hiển thị trên bản đồ được tạo với sự hỗ trợ của ChatGPT
  • Nếu phát hiện nhãn sai, bạn có thể sửa bằng cách nhấp chuột phải và gửi pull request
  • System prompt để tạo nhãn coi các nhóm kho GitHub như những “quốc gia” của các cộng đồng lập trình cụ thể, và yêu cầu tạo ra các tên độc đáo, dễ nhớ
    • Tên cần ngắn gọn, gồm 1 đến 3 từ
    • Phải nắm bắt được chủ đề, công nghệ và mục đích chung của nhóm kho đó
    • Tránh các cách diễn đạt chung chung như “JSWorld”, “UI”, “Web”, “Forge”, “Archipelago”, “Hub”, “Republic”, “Nexus”
    • Không được đơn thuần ghép các tên kho tương tự nhau
    • Phải đủ khác biệt để có thể nhận ra ngay trên bản đồ so với các tên quốc gia khác
  • Đầu vào người dùng gồm repoListrepoNamesOnly, và yêu cầu mô hình phân tích chủ đề, công nghệ cụ thể của các kho đó để tạo tên
  • Nếu LLM trả về tên quá giống với các tên trước đó, hệ thống sẽ thử lại và tăng temperature để khuyến khích kết quả sáng tạo hơn

Tìm kiếm và thiết kế

  • Ô tìm kiếm được triển khai bằng cách lập chỉ mục một bản dump đơn giản của mọi kho theo chữ cái đầu hoặc theo tác giả
  • Khi nhập a vào ô tìm kiếm, hệ thống tìm các kho bắt đầu bằng a và hiển thị chúng ở phía client bằng fuzzy matcher
  • Hiện tại dự án hài lòng với cách biểu diễn dữ liệu, nhưng vẫn đang tìm phong cách phù hợp cho thiết kế thị giác của bản đồ
  • Nếu có kinh nghiệm về thiết kế bản đồ hoặc ý tưởng trực quan, dự án mong được chia sẻ

Giấy phép

  • Kho được công bố theo giấy phép MIT
  • Nếu sử dụng dữ liệu cho công việc khác, dự án đề nghị cân nhắc ghi attribution cho dự án này

1 bình luận

 
GN⁺ 2024-12-16
Các ý kiến trên Hacker News
  • Không hiểu sao torvalds/linux lại nằm ở Fronterra, cạnh các dự án JS, danh sách awesome-X và checklist frontend
    Có lẽ các hacker kernel bỗng nhiên yêu frontend, hoặc nhiều khả năng hơn là những người viết code và những người bấm sao các dự án GitHub không trùng nhau mấy

    • Độ tương đồng Jaccard không phù hợp lắm với các dự án “người nổi tiếng”
      Chúng trông giống nhau không phải vì có liên quan về mặt ngữ nghĩa, mà đơn giản vì cả hai đều nổi tiếng
      Bản đồ reddit cũng gặp cùng vấn đề: https://anvaka.github.io/map-of-reddit/ — các subreddit nổi tiếng đều trở nên “giống” nhau
      Dù vậy, với các dự án nhỏ và ít nổi tiếng hơn thì nó vẫn hoạt động tốt :D
    • Tôi tự hỏi liệu code embedding có thể tốt hơn để sắp xếp các dự án không
      Tuy nhiên, nghĩ đến tài nguyên cần thiết để tải từng file xuống và tính embedding thì có lẽ không thực tế
    • Có lẽ cũng giống lý do khiến heatmap trong nhiều trường hợp về cơ bản trở thành bản đồ dân số
      https://xkcd.com/1138/
    • Có phải vì react không?
  • Link thực tế: https://anvaka.github.io/map-of-github/

    • Đúng, lẽ ra phải gắn link này chứ không phải repository
  • Tôi bật cười khi thấy khu Among Us được đặt tên là Sussex

    • Cái buồn cười nhất tôi thấy là Lispaña
  • Tôi ngạc nhiên vì Rustland nhỏ đến vậy. Nó chỉ cỡ một bang trong Clouderra
    Cũng thú vị là cả Bevy và Veloren đều nằm ở Rustland. Có lẽ các sao đến từ cộng đồng Rust nhiều hơn là cộng đồng phát triển game
    Điều này cũng hợp lý nếu xét hệ sinh thái Rust vẫn còn tương đối nhỏ, và có vẻ có nhiều người “làm X bằng Rust”

    • Tôi cũng sốc vì nodelandia nhỏ như vậy, thậm chí còn không phải một lục địa độc lập
      Có vẻ ai cũng đánh giá quá cao kích thước bong bóng của mình
    • Tôi thấy nhiều dự án Rust phát triển hệ điều hành nằm gần các kernel khác của “PlusPlus Nation”
      Vậy thì “X nhưng bằng Rust” có thể được xếp vào phía “X” chứ không phải “RustLand”
    • Cũng không quá bất ngờ. Rust cũng nổi tiếng là ngôn ngữ được một thiểu số ồn ào truyền bá
    • Theo OP, dữ liệu là tính đến tháng 3 năm 2023, nên nhiều dự án Rust gần đây hơn có lẽ chưa được đưa vào nhiều
    • Dù vậy, rất vui khi thấy bevy xuất hiện trong đó :)
  • Rất thú vị khi tìm thấy dự án mapbox-gl-utils của tôi ở đây
    https://anvaka.github.io/map-of-github/#12/24.78947/18.85186

  • Việc tìm một dự án cụ thể chỉ bằng bản đồ, không có chức năng tìm kiếm, trở thành một minigame thú vị :-)

    • Hoặc bạn có thể bắt đầu từ một dự án rồi tìm đường đến dự án khác. Có thể tưởng tượng là có các tuyến hàng hải :)
  • Là fan Julia, tôi ngạc nhiên khi julialang/julia có ít kết nối như vậy
    Dù đây là một ngôn ngữ ngách, hình ảnh nó trông cô lập như vậy trên bản đồ này dường như cũng không quá xa với trải nghiệm của người dùng hay nhà phát triển

    • Ở phía tây hòn đảo có julialang/julia là JuliaLand
      Việc bản thân julialang/julia nằm gần tensorflow và opencv, còn các gói Julia thực sự lại tụ ở nơi khác, dường như cho thấy sự khác biệt giữa “người dùng kỳ vọng” và “người dùng thực tế”
      Nhiều người gắn sao cho chính dự án Julia là những người dùng Python tính toán số đang tìm một Python mới, nhưng phần lớn vẫn ở lại với Python, nên các sao khác của họ cũng nằm phía Python tính toán số
      Trong khi đó, những người gắn sao cho các gói ở JuliaLand là người dùng Julia thực sự, nên khá hợp lý khi chúng tụ gần Moleculandia, AstroSpace và Quantumia
  • Cách tiếp cận rất gọn gàng và sáng tạo, nhưng thành thật mà nói tôi hơi phân vân liệu ẩn dụ quốc gia/bản đồ có phải lựa chọn tốt nhất không
    Trong nhiều trường hợp chỉ nhìn tên thì không rõ ràng, phải phóng to mới hiểu nó đại diện cho gì
    Có lẽ sẽ thú vị hơn nếu dùng phân cụm phân cấp, gắn các nhãn do LLM tạo ra mang tính mô tả và sát hơn, rồi dùng các đường để thể hiện mức liên kết trung bình giữa các cụm cấp cao

    • Tôi lại ngạc nhiên theo hướng tích cực vì đây không phải một hình nặng nề đầy những đường kẻ
      Với tư cách người từng tạo những hình như vậy từ thập niên 90 và gần như ngay lập tức học được giới hạn của chúng, tôi thích việc cái này không tuyên bố quá mức. Nó chỉ là một cách nhìn, không phải một bài báo
      Tôi thích các biểu đồ có trục mang ý nghĩa. Những thứ như đường, hình dạng, hộp/nhóm, khoảng cách, X so với Y, màu sắc, độ dày, texture, nền, tiền cảnh
      Đơn giản cũng tốt. Quá thường xuyên người ta vẽ đường chỉ để làm đẹp mà chẳng có ý nghĩa gì, còn cái này chỉ là một bức hình có chút nhóm và có cá tính. Không hay sao?
      Tất nhiên tôi vẫn thích các đường, nhưng không phải lúc nào, ở đâu cũng cần
    • Chúng ta vẫn chưa tìm được thuật toán phân cụm phổ quát
      Thường có nhiều cách nhóm dữ liệu mà cách nào cũng hợp lý theo cách riêng, nên chọn cụm cuối cùng nào cũng không thể hoàn hảo
      Ừm… có lẽ làm thứ gì đó như phân cụm lượng tử sẽ là một dự án thú vị
      Giờ tôi nhớ không rõ lắm, nhưng tôi nhớ đã thử thuật toán hdbscan, tức phân cụm phân cấp. Với đồ thị ở quy mô GitHub thì không thể đưa vào bộ nhớ
      Cuối cùng tôi dùng thứ gì đó gần giống phân cụm phân cấp, kết hợp louvain/leiden/cách tự làm, và thứ thấy trên bản đồ cuối cùng là kết quả đó
    • Có thể làm vậy, nhưng dự án này đã chọn làm bản đồ
  • QuitlessiaNeoQuitlessia… mấy cái tên thật ác
    Doom Emacs nằm ở NeoQuitlessia chứ không phải Emacsia, nhưng đáng ngạc nhiên là lại hợp lý :)

    • Haha! Tôi yêu vim
      Chúng ta sẽ không thoát đâu
  • Tôi tò mò các kết nối giữa các repository được xác định như thế nào
    Tôi đã kiểm tra vài repository của mình, và một số kết nối không thấy tham chiếu theo hướng nào cả

    • Tác giả đã trả lời trong bài HN gốc: https://news.ycombinator.com/item?id=35933981
      Về cơ bản, như những người khác suy đoán, các đường biểu thị điểm tương đồng cao nhất dựa trên “những người đã bấm sao”, và toàn bộ bản đồ cũng được hình thành theo tiêu chí đó
      Có thể gây nhầm lẫn, nhưng các đường chỉ xuất hiện khi bạn nhấp vào một quốc gia cụ thể
    • Ngay dòng đầu đã nói: “Các điểm ở gần nhau nếu có nhiều người cùng bấm sao cho chúng”
    • Độ tương đồng Jaccard trả về giá trị từ 0 đến 1. Trong trường hợp này, hầu hết các giá trị có lẽ sẽ gần 0
      Chắc là có một ngưỡng hard-code để quyết định có tạo cạnh hay không. Ví dụ nếu độ tương đồng Jaccard giữa A và B lớn hơn 0,2 thì tạo một cạnh