4 pontos por GN⁺ 2024-12-16 | 1 comentários | Compartilhar no WhatsApp
  • Map of GitHub é um mapa que posiciona mais de 690 mil projetos do GitHub como pontos, e projetos com muitos stargazers em comum ficam mais próximos entre si
  • Para criar o mapa, foi usado o dataset público de eventos de atividade do GitHub no Google BigQuery, com cerca de 500 milhões de dados de star de eventos entre fevereiro de 2011 e maio de 2025
  • Para calcular as relações entre repositórios, foi usada a Jaccard Similarity exata; como um computador doméstico com 24GB de RAM não era suficiente, o processamento levou algumas horas em uma instância AWS EC2 com 512GB de RAM
  • Para o clustering, vários algoritmos foram testados antes da escolha de Leiden clustering, e no resultado cerca de 690 mil projetos foram divididos em mais de 1.500 clusters
  • A renderização foi implementada combinando uma ferramenta própria de layout com maplibre, GeoJSON e tippecanoe, e boa parte dos rótulos de nomes de países foi gerada com ajuda do ChatGPT

Visão geral do projeto

  • Map of GitHub é um mapa que visualiza mais de 690 mil projetos do GitHub
  • Cada ponto representa um projeto
  • Projetos com muitos usuários que deram star em comum são posicionados mais próximos no mapa

Versões públicas

Coleta de dados e cálculo de similaridade

  • Na primeira etapa, foram obtidos os dados de quais usuários deram star em quais repositórios
    • Foi usado o dataset público de eventos de atividade do GitHub no Google BigQuery
    • O período analisado vai de fevereiro de 2011 a maio de 2025
    • Nesse processo, foram obtidos cerca de 500 milhões de dados de star
  • Na segunda etapa, foi calculada a Jaccard Similarity exata entre cada repositório
    • O volume de cálculo era grande demais para um computador doméstico com 24GB de RAM
    • Em uma instância AWS EC2 com 512GB de RAM, o processamento foi concluído em algumas horas
    • Outros métodos de similaridade também foram testados, mas o Jaccard produziu os resultados mais confiáveis

Clustering e layout do mapa

  • Na terceira etapa, vários algoritmos de clustering foram testados para agrupar os repositórios
  • No fim, a preferência foi pelo Leiden clustering, e cerca de 690 mil projetos foram divididos em mais de 1.500 clusters
  • Na quarta etapa, foi usado o ngraph.forcelayout próprio para posicionar os nós dentro de cada cluster
  • Para o posicionamento global dos clusters, foi usada uma configuração separada

Método de renderização

  • A quinta etapa é o processo de renderizar o mapa
  • Diferente de projetos anteriores, foi usado o maplibre para evitar reinventar a roda
  • Os dados são convertidos para o formato GeoJSON
  • A geração de tiles usa tippecanoe
  • Depois disso, foi construída a experiência de navegação do mapa

Geração de rótulos de nomes de países

  • Muitos dos rótulos de países exibidos no mapa foram gerados com ajuda do ChatGPT
  • Se você encontrar um rótulo incorreto, pode corrigi-lo com clique direito e enviar um pull request
  • O prompt de sistema para gerar os rótulos trata cada conjunto de repositórios do GitHub como um “país” de uma comunidade de programação específica e pede a criação de nomes únicos e fáceis de lembrar
    • Os nomes devem ser curtos, com 1 a 3 palavras
    • Devem capturar o tema, a tecnologia e o propósito em comum daquele conjunto de repositórios
    • Expressões genéricas como “JSWorld”, “UI”, “Web”, “Forge”, “Archipelago”, “Hub”, “Republic” e “Nexus” devem ser evitadas
    • Não se deve apenas combinar nomes de repositórios parecidos
    • Devem ser distintos o suficiente para serem identificados imediatamente no mapa e diferenciados de outros nomes de países
  • A entrada do usuário inclui repoList e repoNamesOnly, e o pedido é para analisar os temas e tecnologias concretas desses repositórios para criar um nome
  • Se o LLM retornar um nome muito parecido com nomes anteriores, ele tenta novamente e aumenta a temperature para induzir resultados mais criativos

Busca e design

  • A caixa de busca foi implementada indexando um dump simples de todos os repositórios pela primeira letra ou pelo autor
  • Ao digitar a na busca, são encontrados repositórios que começam com a, e eles são exibidos no cliente com um fuzzy matcher
  • A representação atual dos dados agrada, mas ainda estão buscando o estilo certo para o design visual do mapa
  • Se você tiver experiência com design de mapas ou ideias visuais, pedem que compartilhe

Licença

  • O repositório é disponibilizado sob a licença MIT
  • Se os dados forem usados em outros trabalhos, pedem considerar atribuição a este projeto

1 comentários

 
GN⁺ 2024-12-16
Comentários no Hacker News
  • Por algum motivo, torvalds/linux está em Fronterra, ao lado de projetos JS, listas awesome-X e checklists de front-end
    Ou os hackers de kernel de repente passaram a amar front-end, ou, mais provavelmente, as pessoas que escrevem código e as pessoas que dão estrela em projetos no GitHub não se sobrepõem muito

    • A similaridade de Jaccard não é muito boa para projetos “celebridade”
      Eles parecem parecidos não porque tenham relação semântica, mas simplesmente porque ambos são populares
      O mapa do reddit sofreu do mesmo problema: https://anvaka.github.io/map-of-reddit/ — subreddits populares acabam todos “parecidos” entre si
      Ainda assim, funciona bem para projetos menores e menos famosos :D
    • Fico imaginando se embeddings de código teriam sido melhores para organizar os projetos
      Mas, considerando os recursos necessários para baixar cada arquivo e calcular os embeddings, provavelmente não seria viável na prática
    • Talvez seja parecido com o motivo pelo qual heatmaps muitas vezes acabam sendo, na prática, mapas populacionais
      https://xkcd.com/1138/
    • Será por causa do React?
  • Link real: https://anvaka.github.io/map-of-github/

    • Isso, era esse link que deveria ter sido usado, não o repositório
  • Ri quando vi que a região de Among Us se chama Sussex

    • O mais engraçado que vi foi Lispaña
  • Fiquei surpreso com o tamanho pequeno de Rustland. É praticamente só uma província dentro de Clouderra
    Também é interessante que Bevy e Veloren estejam ambos em Rustland. Provavelmente as estrelas vieram mais da comunidade Rust do que da comunidade de desenvolvimento de jogos
    Faz sentido, considerando que o ecossistema Rust ainda é relativamente pequeno e parece haver muita gente fazendo “X em Rust”

    • Também é chocante que nodelandia seja tão pequena e nem sequer seja um continente independente
      Acho que todo mundo superestima o tamanho da própria bolha
    • Vejo muitos projetos Rust de desenvolvimento de sistemas operacionais perto de outros kernels da “PlusPlus Nation”
      Então “X, mas em Rust” pode acabar em “X”, não em “RustLand”
    • Não é tão surpreendente assim. Rust também é conhecida como uma linguagem evangelizada por uma minoria barulhenta
    • Segundo o OP, os dados são de março de 2023, então muitos projetos Rust mais recentes provavelmente ainda não foram incluídos
    • Ainda assim, foi bom ver o bevy ali :)
  • Muito divertido encontrar meu projeto mapbox-gl-utils aqui
    https://anvaka.github.io/map-of-github/#12/24.78947/18.85186

  • Sem uma função de busca, tentar achar um projeto específico só pelo mapa vira um minigame divertido :-)

    • Ou dá para começar em um projeto e tentar encontrar um caminho até outro. Dá até para imaginar que existem rotas marítimas :)
  • Como fã de Julia, fiquei surpreso com tão poucas conexões para julialang/julia
    É uma linguagem de nicho, mas a forma como ela parece isolada neste mapa talvez não esteja tão distante da experiência de usuários ou desenvolvedores

    • A oeste da ilha onde fica julialang/julia há JuliaLand
      O fato de julialang/julia em si estar perto de tensorflow e opencv, enquanto os pacotes Julia reais estão agrupados em outro lugar, parece mostrar a diferença entre “usuários aspiracionais” e “usuários reais”
      Muitas pessoas que deram estrela no projeto Julia em si eram usuários de Python para computação numérica em busca de um novo Python, mas a maioria ficou no Python, então suas outras estrelas também estão do lado de Python para computação numérica
      Já as pessoas que deram estrela nos pacotes de JuliaLand são usuários reais de Julia e, de forma plausível, acabaram agrupadas perto de Moleculandia, AstroSpace e Quantumia
  • É uma abordagem muito limpa e criativa, mas, honestamente, fico dividido sobre se a metáfora de países/mapa é a melhor
    Em muitos casos, só pelo nome não fica claro; é preciso dar zoom para entender o que está sendo representado
    Talvez tivesse sido mais interessante fazer uma clusterização hierárquica, atribuir rótulos gerados por LLM mais descritivos e fiéis, e mostrar com linhas a conectividade média entre os clusters principais

    • Fiquei agradavelmente surpreso justamente por não ser uma imagem pesada cheia de linhas
      Como alguém que fez esses gráficos pela primeira vez nos anos 90 e aprendeu quase imediatamente suas limitações, gosto deste porque ele não faz afirmações exageradas. Não é um artigo, é só uma visualização
      Gosto de gráficos em que os eixos têm significado. Linhas, formas, caixas/grupos, distância, X versus Y, cores, espessura, textura, fundo, primeiro plano, esse tipo de coisa
      Coisas simples também são boas. Com muita frequência, traçam linhas sem nenhum significado só para enfeitar; este é apenas um desenho com alguns grupos e personalidade. Não é legal?
      Claro que ainda gosto de linhas, mas elas não são necessárias sempre e em todo lugar
    • Ainda não encontrei um algoritmo de clusterização universal
      Muitas vezes há várias formas de agrupar os dados e todas fazem sentido, então qualquer clusterização final escolhida é imperfeita
      Hmm… talvez algo como clusterização quântica pudesse ser um projeto interessante
      Minha memória está meio nebulosa agora, mas lembro de ter tentado o algoritmo hdbscan, ou seja, clusterização hierárquica. Em um grafo na escala do GitHub, não cabia na memória
      No fim, usei algo parecido com clusterização hierárquica, uma mistura de louvain/leiden/uma abordagem própria, e o que aparece no mapa final é o resultado disso
    • Poderia ter sido feito assim, mas este projeto decidiu fazer um mapa
  • Quitlessia e NeoQuitlessia… esses nomes são perversos
    Doom Emacs está em NeoQuitlessia, não em Emacsia, e surpreendentemente isso faz sentido :)

    • Haha! Amo vim
      Nós não vamos sair
  • Fico curioso sobre como são determinadas as conexões entre repositórios
    Verifiquei alguns dos meus repositórios, e algumas conexões não parecem ter referência em nenhuma direção

    • O autor respondeu no post original do HN: https://news.ycombinator.com/item?id=35933981
      Basicamente, como outros tinham suposto, as linhas representam as maiores pontuações de similaridade com base nas “pessoas que deram estrela”, e o mapa inteiro também é formado com base nisso
      Pode ser confuso, mas as linhas só aparecem quando você clica em um país específico
    • Está na primeira linha: “Os pontos ficam próximos quando muitas pessoas deram estrela em ambos”
    • A similaridade de Jaccard retorna um valor entre 0 e 1. Neste caso, a maioria dos valores deve estar próxima de 0
      Imagino que haja um limiar hardcoded para decidir se uma aresta é criada ou não. Por exemplo, criar uma aresta se a similaridade de Jaccard entre A e B for maior que 0,2