Bản đồ GitHub
(github.com/anvaka)- 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
- Current release, May 10, 2025: 690 nghìn dự án, 1.500 cụm
- Initial release, May 8, 2023: 400 nghìn dự án, 1.000 cụm
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
repoListvàrepoNamesOnly, 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
avào ô tìm kiếm, hệ thống tìm các kho bắt đầu bằngavà 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
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
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
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ế
https://xkcd.com/1138/
Link thực tế: https://anvaka.github.io/map-of-github/
Tôi bật cười khi thấy khu Among Us được đặt tên là Sussex
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”
Có vẻ ai cũng đánh giá quá cao kích thước bong bóng của mình
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”
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ị :-)
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
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
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
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ả đó
Quitlessia và NeoQuitlessia… 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ý :)
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ả
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ể
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