Classificando todos os PDFs da internet
(snats.xyz)- É um experimento para classificar cerca de 8,4 milhões de PDFs do SafeDocs usando metadados de URL, em vez do conteúdo original, com o objetivo de etiquetar um grande corpus documental a um custo realista
- Em vez dos 8 TB de PDFs completos, usa cerca de 8 GB de metadados e rótulos gerados por LLM, aplicando uma abordagem teacher/student no estilo FineWeb à classificação de URLs de PDFs
- Um único classificador de deep learning ficou em 59,14% de acurácia com
Alibaba-large-gte-1.5, mas a combinação de embeddings de URL com XGBoost chegou a 85,26% após busca de hiperparâmetros - Um ensemble de XGBoost e LinearRegressor baseado em TF-IDF também registrou 67,52% e 70,68%, respectivamente, mostrando que abordagens tradicionais simples de NLP superaram a linha de base inicial de deep learning
- O conjunto final de rótulos, embeddings, informações de download da base original e o código foram publicados, podendo ser reutilizados em experimentos de classificação de PDFs ou em pipelines de dados para modelos VLM/Omni
Corpus de PDFs SafeDocs e objetivo da classificação
- Common Crawl é um arquivo da web da internet e, ao encontrar um PDF, salva apenas o primeiro 1 MB do arquivo completo e corta o restante
- SafeDocs ou
CC-MAIN-2021-31-PDF-UNTRUNCATEDé um corpus criado ao buscar novamente os PDFs de um snapshot do Common Crawl para obter versões não truncadas - Esse dataset é composto por cerca de 8,4 milhões de PDFs e tem tamanho total de 8 TB descompactado
- O objetivo é classificar os PDFs com rótulos temáticos
- Ex.: um PDF de Linear Algebra vira Math
- Ex.: um livro-texto de Anatomy vira Medicine
Criando rótulos com metadados de URL
- Em vez de processar diretamente os 8 TB do conteúdo completo, o trabalho usa os metadados do dataset original
- Os metadados têm cerca de 8 GB de texto
- A principal coluna é
url
- O nome do arquivo na URL serve como pista para inferir a natureza do documento
- Ex.:
Introduction_to_Python_Programming_-_WEB.pdf - Esse nome sugere que o arquivo provavelmente é um documento educacional ou técnico
- Ex.:
- O método de rotulagem foi inspirado na abordagem do FineWeb
- Um LLM atua como teacher, gerando rótulos a partir de texto não estruturado
- Um classificador menor, o student, é treinado com esses rótulos gerados
- Usando este prompt e o Llama-3-70B via API da together, foram gerados os 100 mil rótulos iniciais
- Como a distribuição dos rótulos era desbalanceada e havia muitas classes pequenas, rótulos com menos de 250 ocorrências foram agrupados em
other - Depois, foram selecionadas no máximo 5.000 amostras por rótulo para equilibrar a base, resultando em um dataset final rotulado com 59 mil exemplos
Tentativa de fine-tuning de modelo de embeddings
- A primeira abordagem foi processar o texto das URLs com um modelo de embeddings e fazer fine-tuning para o problema de classificação
- O FineWeb Edu usou snowflake-arctic-embed-m, mas o experimento também considerou modelos bem colocados no Massive Text Embeddings Benchmark
- Como modelos de cerca de 7B parâmetros pareceram pouco práticos para classificar rapidamente 8 milhões de PDFs, foram testadas alternativas menores
Stella_en_400Mgte-large-1.5- Arctic Embed
all-mpnet-basedistillbertflant-t5-smallbert-base-uncased
- Com Hugging Face, o modelo-base foi mantido congelado e apenas os embeddings e a cabeça de classificação foram treinados, permitindo rodar até em notebook
- Nessa abordagem, o melhor modelo foi
Alibaba-large-gte-1.5, com 59,14% de acurácia
Elevando o desempenho com XGBoost
- A segunda abordagem não usa diretamente o modelo de embeddings como classificador; em vez disso, gera embeddings das URLs e os usa como entrada do XGBoost
- Após converter o texto em embeddings, o XGBoost é treinado como se fossem dados tabulares
- Foram gerados embeddings para todos os links de PDF, totalizando cerca de 40 GB descompactados
- Os embeddings estão publicados neste dataset do Kaggle
- Em vez de um único classificador grande, foram treinados classificadores binários por classe
- A ideia veio de uma antiga competição do Kaggle
- O desempenho médio do modelo de embeddings com XGBoost foi o seguinte
- accuracy: 0.839750
- precision: 0.859758
- recall: 0.819733
- f1: 0.838937
- Essa abordagem obteve uma acurácia 24,83 p.p. superior à abordagem inicial de deep learning
Resultados com TF-IDF e LinearRegressor
- A terceira abordagem cria características de texto com TF-IDF, sem embeddings de deep learning, e então treina o modelo
- TF-IDF dá pesos maiores a palavras frequentes em um documento específico, mas raras no corpus total
- O desempenho do XGBoost com TF-IDF foi o seguinte
- accuracy: 0.675200
- precision: 0.683185
- recall: 0.646316
- f1: 0.662497
- Também foi testado um ensemble de LinearRegressor baseado em TF-IDF
- accuracy: 0.706802
- precision: 0.723558
- recall: 0.663038
- f1: 0.690286
- As duas abordagens superaram a linha de base inicial de deep learning, de 59,14%
Nova tentativa de deep learning com mais rótulos gerados por LLM
- Foi definida uma meta de 70% de acurácia para o classificador único de deep learning, e mais rótulos foram gerados
- Os rótulos adicionais somaram 400 mil, gerados com Llama3.1-7B
- O motivo para usar um modelo menor do que antes foi reduzir o custo de inferência
- Os experimentos mostraram que mais dados levaram a melhor desempenho
- Inspirado por The Llama 3 Herd of Models, da Meta, o trabalho testou
roberta-basee o já usadogte-large - O
gte-largeatingiu até 69,22% de acurácia no dataset de treino
Desempenho final por modelo
- Os resultados dos experimentos foram os seguintes
| Model Name | Accuracy |
|---|---|
| gte-large naïve (59k labels) | 59.14% |
| XGBoost embeddings | 83.97% |
| XGBoost Tf-Idf | 67.52% |
| LinearRegressor Tf-Idf | 70.68% |
| gte-large naïve (400k labels) | 69.22% |
| XGBoost Embeddings HyperParameter Sweep | 85.26% |
- No fim, o melhor modelo foi o de XGBoost com embeddings
- O modelo de embeddings com XGBoost após busca de hiperparâmetros alcançou o melhor resultado, com 85,26% de acurácia
Classificação do corpus completo e visualização
- O código final tem uma estrutura simples: carrega os embeddings na memória e faz as previsões
- A previsão de rótulos para todo o conjunto de PDFs levou cerca de 1 hora
- Não houve configuração para execução em GPU, então a GPU não foi usada
- Os resultados previstos e os embeddings foram visualizados com PCA e UMAP
- O PCA visualizou cerca de 8,5 milhões de pontos do dataset inteiro em uma única imagem
- O UMAP foi executado alugando uma máquina maior
- Azure
Standard_E48s_v3 - 48 núcleos
- 384 GB de RAM
- 768 GB de disco
- O UMAP conseguiu processar até 6,5 milhões de pontos; acima disso, o limite de memória já ficava muito próximo
- Azure
Dados e código publicados
- O dataset final está disponível neste repo do Hugging Face
- Se você precisar apenas dos embeddings, eles podem ser baixados neste dataset do Kaggle
- As informações de download do dataset original SafeDocs estão neste bucket S3
- O código de classificação está no caminho classify_metadata do monorepo no GitHub
- Como PDFs misturam dados e imagens, a avaliação é que eles podem ser usados com mais frequência em pipelines de treinamento de modelos VLM/Omni
1 comentários
Opiniões no Hacker News
Por volta de 2009, fiz um trabalho de visualização semelhante com cerca de 5,7 milhões de artigos de pesquisa (PDFs, corpus privado) de editoras científicas como Elsevier e Springer
Newton, G., A. Callahan & M. Dumontier. 2009. Semantic Journal Mapping for Search Visualization in a Large Scale Article Digital Library. Second Workshop on Very Large Digital Libraries at the European Conference on Digital Libraries (ECDL) 2009. https://lekythos.library.ucy.ac.cy/bitstream/handle/10797/14...
Eu sou o primeiro autor
Se o benchmark de 2009 foi de 13 horas, fico curioso para saber quanto tempo o cálculo levaria hoje
Hoje em dia, acho que todo mundo simplesmente jogaria esses dados no UMAP
E também se o ampersand
&tem um significado diferente deand, ou se é apenas formato de citaçãoUma das vantagens dos embeddings que se discute menos hoje em dia é que é possível aplicar técnicas tradicionais de modelagem estatística quase diretamente, e, de quebra, evitar as sutilezas e armadilhas de pré-processamentos comuns de NLP, como stemming
Este artigo mostra especialmente bem por que usar embeddings de LLM logo como primeira etapa de NLP, sobretudo para documentos longos, é uma abordagem prática
Sou o autor. Não esperava que este post chegasse ao topo do HN; podem me perguntar qualquer coisa
Dei uma olhada no código e vi muita coisa que não conheço; parece que, mais do que Python em si, há muitas técnicas de análise que eu desconheço
Os PDFs já estavam classificados?
Foi um texto interessante e cheio de detalhes. Mas, ao fazer aprendizado binário um-contra-todos, equilibrar as classes e usar a probabilidade máxima na inferência pode ser problemático, porque as probabilidades podem não ficar bem calibradas
Fico curioso se vocês fazem calibração de probabilidade separadamente antes de aplicar
argmaxEm 2006 já havia várias coleções de torrents de 1 TB de livros didáticos
Imagino que hoje o tamanho e a quantidade sejam ainda maiores
Lembro que, até 2008, era muito mais fácil encontrar livros didáticos, manuais de soluções, PDFs relacionados e outros materiais do que 6 a 8 anos depois
A maior diferença é que vários sites como o Chegg começaram a sugar esse material e revendê-lo de alguma forma
A maior parte é material de eletrônica e engenharia, que baixei de torrents há uns 2 anos, quando queria brincar com GraphQL e dados de OSR
Tenho algo entre 20 e 40 TB de PDFs (antes da deduplicação)
8 TB é bastante, mas não chega nem perto do volume total de PDFs que existe no mundo
Eu também tenho uma coleção razoável de ebooks, PDFs e mangás que juntei para ler, mas não consigo imaginar o tamanho de uma biblioteca de 20 TB
Com certeza existem muito mais PDFs do que 8 TB. Provavelmente há muita duplicação aí, mas, por ter muitas imagens, acho que a deduplicação não funcionaria tão bem
É um texto interessante e divertido. Testei várias soluções de LLM/IA generativa para extrair dados tabulares de PDFs, mas os resultados ficaram aquém do esperado
Elas vão bem em extrair strings de texto ou fazer resumos, por exemplo responder qual é o valor total ou quando foi impresso, mas ainda cometem bastante erro ao extrair de forma confiável para CSV
Vale testar o serviço de particionamento da Aryn: https://www.aryn.ai/post/announcing-the-aryn-partitioning-se...
Foi lançado recentemente e há também um exemplo de como transformar dados de tabelas em PDFs em dataframes pandas. Depois dá para converter para CSV: https://sycamore.readthedocs.io/en/stable/aryn_cloud/get_sta...
Muito legal. Na Airtrain também verificamos que embeddings são muito valiosos para criar modelos de classificação
Se você quiser mexer com muito texto e embeddings, recentemente deduplicamos e geramos embeddings de todo o fineweb-edu (também mencionado no texto) e colocamos o dataset resultante no Hugging Face: https://huggingface.co/datasets/airtrain-ai/fineweb-edu-fort...
Ideia muito bacana. Não tenho tido muito tempo livre ultimamente, mas há pouco tempo pensei em fazer um projeto parecido, embora diferente
Eu queria criar uma ferramenta open source para baixar dados de séries temporais úteis para ciências sociais. Por exemplo, séries temporais de comentários em redes sociais sobre preços de alimentos
Acho que os LLMs abriram vários novos ângulos de pesquisa que ainda não são muito explorados
Se um dia eu tocar esse projeto paralelo, talvez aproveite algumas boas ideias daqui
Excelente trabalho. Vocês combinaram várias abordagens, de modo parecido com o que bibliotecas nacionais às vezes fazem. Eu também já usei todo tipo de embeddings → classificadores e LDA
Fiquei curioso sobre o prompt: https://github.com/snat-s/m/blob/main/classify_metadata/prom...
Isso não é, na prática, parecido com dar um prompt pedindo para classificar por tipo de URL?