- O autor conduziu um projeto que analisa mais de 40 milhões de posts e comentários do Hacker News usando embeddings de texto
- O principal objetivo do projeto era implementar recursos aprimorados de busca, recomendação e análise
- Para isso, os dados foram coletados com a API do Hacker News, e contexto adicional foi obtido por meio de crawling de páginas da web
- Com base nos dados coletados, foram gerados embeddings de texto, que depois foram mapeados para um espaço 2D com UMAP
- A partir desses dados mapeados, foi criado o mapa interativo "Hacker News Universe"
- Além disso, os embeddings foram usados para implementar recursos como busca semântica, comunidades virtuais automáticas e análise de popularidade/sentimento
- Para lidar com processamento em larga escala, foi usado um cluster de GPUs, e servidores de edge foram implantados para melhorar a experiência do usuário
Coleta de dados do Hacker News
- Mais de 40 milhões de posts e comentários foram coletados usando a API do Hacker News
- Como a resposta da API era lenta, foi implementado um serviço baseado em Node.js para processamento paralelo
- A pontuação dos posts não cai abaixo de -1, e a pontuação dos comentários não pode ser verificada pela API
- Alguns posts e comentários têm título e corpo vazios (provavelmente editados por moderadores)
- Em alguns casos, o ID do comentário é menor que o do comentário pai (provavelmente porque moderadores moveram a árvore de comentários)
Geração de embeddings de texto
- Como apenas o título não era suficiente para representar semanticamente os posts, foi obtido contexto adicional por meio do crawling das páginas da web
- A geração de embeddings de texto exige GPUs de alto desempenho, e processar 40 milhões de entradas poderia levar quase um ano
- Com o RunPod, foi montado um cluster de GPUs a baixo custo, e foram desenvolvidos
db-rpc e queued para melhorar a eficiência do processamento distribuído
- Com 150 GPUs, os embeddings de 40 milhões de textos foram gerados em poucas horas
Obtendo contexto adicional com crawling de páginas da web
- Como a qualidade dos embeddings não era boa apenas com os títulos dos posts, as páginas vinculadas foram rastreadas para obter contexto adicional
- O crawler foi implementado em Rust, alcançando desempenho 10 vezes superior em relação à versão em Node.js
- Muitos links estavam quebrados (
link rot), então foram recuperados usando a API do Internet Archive
- No final, menos de 5% das 4 milhões de páginas não puderam ser obtidas
Geração de embeddings de texto aprimorados
- Para usar a página inteira como entrada, houve a migração para o modelo
jina-embeddings-v2-small-en
- Posts com pouco contexto foram complementados com os comentários mais bem colocados
- Para os comentários, a entrada foi composta considerando a estrutura hierárquica e incluindo também comentários ancestrais
Redução de dimensionalidade com UMAP
- Os embeddings de 1024 dimensões foram reduzidos para um espaço bidimensional usando UMAP
- Para a redução de dimensionalidade, são necessários o grafo PyNNDescent e os embeddings originais
- Processar um milhão de entradas de alta dimensionalidade levou cerca de 1 hora e meia em uma CPU de 96 núcleos
- Como resultado da redução, foi possível visualizar interesses e a distribuição de popularidade
Similaridade de cosseno
- O cálculo de similaridade entre embeddings costuma usar distância de cosseno
- A distância de cosseno representa a diferença angular entre vetores e, ao contrário da distância euclidiana, não é afetada pela magnitude do vetor
- Isso é adequado para calcular similaridade de texto, porque mesmo discussões longas e intensas devem ser mapeadas como próximas se o tema for semelhante
- O cálculo de similaridade de cosseno pode ser implementado de forma simples com multiplicação de matrizes
Criação do mapa Hacker News Universe
- Com base nos embeddings, foi criado um mapa interativo do Hacker News semelhante ao Google Maps
- Há suporte para recursos como ajuste da quantidade de pontos visíveis ao aplicar zoom, rotulagem de alguns pontos e exibição de detalhes ao clicar
- Como enviar milhões de pontos de uma vez só ao navegador seria inviável, foi implementado carregamento progressivo usando tiling e LOD
- Cada tile contém no máximo 1500 pontos e permanece abaixo de 20 KB, garantindo diversidade ao considerar a densidade de cada região
- O webapp foi implementado com Canvas e WebWorker, e os recursos de mapa foram desenvolvidos com referência ao Google Maps
Adição de efeitos visuais
- Para melhorar a imersão e a noção de orientação, foram adicionados elementos como marcos, fronteiras e relevo, como em mapas reais
- Curvas de nível de luminosidade foram desenhadas de acordo com a densidade dos pontos para representar áreas de maior interesse no HN
- Com Gaussian blur, foram geradas curvas de nível suaves, depois convertidas em SVG para produzir imagens vetoriais sem serrilhado
- Também foram adicionadas "cidades" que representam temas principais, servindo como guia para áreas específicas
Teste do recurso de busca
- A busca baseada em embeddings semânticos mostrou resultados mais relevantes e variados do que a busca por palavras-chave
- Ela entende bem consultas em forma de pergunta e encontra temas semelhantes mesmo sem palavras exatamente iguais
- Graças à alta qualidade dos posts do HN, os resultados de busca também expõem muitas informações úteis e cheias de insights
- No ranking dos resultados, além da relevância, foram usados a pontuação dos posts e pesos temporais para considerar confiabilidade e atualidade
Geração automática de comunidades virtuais
- É possível criar comunidades virtuais por palavra-chave e ver instantaneamente coleções de posts alinhadas aos seus interesses
- Além dos posts, também é possível examinar comentários com discussões ativas relacionadas ao interesse
- Também é possível identificar usuários influentes e muito ativos em temas específicos
- Usar filtragem posterior em vez de pré-filtragem pode reduzir bastante o custo computacional
Análise de dados em larga escala
- Um modelo open source de análise de sentimento foi usado para classificar o sentimento positivo/negativo de 30 milhões de comentários
- Ao analisar o sentimento de tópicos em séries temporais, é possível observar mudanças de acordo com eventos importantes
- Também é possível comparar a popularidade entre tópicos usando similaridade e pontuação
- Para melhorar a velocidade de cálculo das consultas, foram aplicadas operações matriciais com GPU, aumentando bastante o desempenho
Planos futuros
- Suporte a atualização de dados em tempo real
- Desenvolvimento de um sistema de recomendação baseado em deep learning
- Melhoria da qualidade da busca com um modelo de reranking
- Reforço da análise de usuários (similaridade, expertise etc.)
- Descoberta de ideias adicionais de melhoria por meio da coleta de opiniões da comunidade
Opinião do GN⁺
- Este projeto é um bom exemplo de como coletar, refinar e analisar grandes volumes de dados de forma eficaz. Em especial, as técnicas de otimização de desempenho, como processamento paralelo e uso de GPU, são impressionantes.
- O mapa do Hacker News que visualiza a similaridade entre posts ao combinar embeddings de texto com UMAP é um resultado muito criativo e interessante. Parece que ajudará bastante os usuários a explorar temas de interesse e descobrir novas informações.
- Os recursos de busca semântica e geração automática de comunidades são ideias inovadoras que podem elevar a experiência de uso do Hacker News a outro nível. Tomara que tecnologias de busca capazes de entender contexto e intenção, indo além da simples correspondência de palavras-chave, se disseminem mais entre usuários em geral.
- A construção de um pipeline de processamento de dados em larga escala e em tempo real provavelmente será o principal desafio. Será preciso avaliar com cuidado formas de eliminar gargalos de desempenho, como edge computing e bancos de dados in-memory.
- Como os dados do HN são bastante confiáveis, os resultados da análise de sentimento também parecem ter valor prático. Ainda assim, vale prestar atenção a vieses algorítmicos e considerar treinamento especializado para o domínio.
1 comentários
O título está faltando.