CoolFace
Datasetpublic

bratao/corpus-ptbr-v1

🇧🇷 Corpus PT-BR v1 Um corpus em Português Brasileiro voltado para pré-treinamento e fine-tuning de LLMs. Combina dados reais curados com uma camada sintética construída para ampliar a diversidade estilística, lexical e discursiva em português. 🔄 Visão Geral do Pipeline 📊 Estatísticas Métrica Valor Total de documentos 8,399,857 Total de palavras ~4.84B Tokens estimados ~6.29B Tamanho (Parquet) ~17.9 GB Idioma Português… See the full description on the dataset page: https://huggingface.co/datasets/bratao/corpus-ptbr-v1.

sourceHugging Faceodc-byupdated 5mo agoView on Hugging Face
0likes192downloads
Dataset Card

🇧🇷 Corpus PT-BR v1

Um corpus em Português Brasileiro voltado para pré-treinamento e fine-tuning de LLMs. Combina dados reais curados com uma camada sintética construída para ampliar a diversidade estilística, lexical e discursiva em português.

🔄 Visão Geral do Pipeline

[image]

📊 Estatísticas

MétricaValor
Total de documentos8,399,857
Total de palavras~4.84B
Tokens estimados~6.29B
Tamanho (Parquet)~17.9 GB
IdiomaPortuguês Brasileiro (pt-br)
LicençaODC-By 1.0

Subsets

SubsetDocumentosPalavrasTokens (est.)
real6,813,702~4.10B~5.33B
synthetic1,586,155~739M~961M

📂 Fontes

Subset real

Dados de pretraining limpos e filtrados de fontes públicas:

FonteDocumentosDescrição
c4_pt3,070,868Common Crawl (C4) — subset em português, limpo e deduplicado
fineweb2_pt3,742,834FineWeb2 — dados de alta qualidade filtrados para português

Subset synthetic

1,586,155 documentos gerados por LLMs de alta qualidade através de múltiplos pipelines:

PipelineArquivosDocumentosModelos
Geração Local (GPU)corpusgreat, corpusme, CORPUS1, corpus125m, etc.~116KQwen 2.5 72B (4-bit)
API Batch (Streaming)synthetic_corpus_batch*, synthetic_corpus_chutes*~132KDeepSeek V3, Qwen3 235B
API Multi-Providersynthetic_corpus_openrouter*~47KVários modelos
Mistral-basedopenstral*, bistral*~245KMistral, Mixtral
Outros pipelinessynthetic_corpus_gptoss*, mexe, ade, ede, etc.~1.05MDiversos
Diversidade de estilos: Artigos educativos, entrevistas, debates, FAQs, threads de Twitter, posts de LinkedIn, conversas de WhatsApp, podcasts, mesas redondas, tutoriais, reviews, newsletters, diálogos socráticos, e mais — gerados com 21+ system prompts e 20 estilos de texto diferentes.

🚀 Como Usar

python
from datasets import load_dataset

# Carregar o corpus inteiro
ds = load_dataset("Madras1/corpus-ptbr-v1", split="train")

# Filtrar por subset
ds_real = ds.filter(lambda x: x["subset"] == "real")
ds_synthetic = ds.filter(lambda x: x["subset"] == "synthetic")

# Filtrar por fonte específica
ds_c4 = ds.filter(lambda x: x["source"] == "c4_pt")
ds_fineweb = ds.filter(lambda x: x["source"] == "fineweb2_pt")

# Exemplo de acesso
print(ds[0]["text"][:500])
print(f"Fonte: {ds[0]['source']}, Subset: {ds[0]['subset']}")

Streaming (recomendado para datasets grandes)

python
from datasets import load_dataset

# Streaming — não baixa tudo de uma vez
ds = load_dataset("Madras1/corpus-ptbr-v1", split="train", streaming=True)

for example in ds:
    print(example["text"][:200])
    break

🛠️ Metodologia Detalhada

1. Coleta de Dados Reais

FontePipelineDescrição
C4 PTCommon Crawl → C4 → filtro SBERTWeb crawl limpo e deduplicado, subset em português
FineWeb2 PTFineWeb2 → filtro SBERTDados de alta qualidade curados pela HuggingFace, filtrados para português

Esses dados de web crawl, embora pré-filtrados, ainda contêm muito ruído (spam, textos de baixa qualidade, conteúdo genérico). Por isso foram submetidos à filtragem de qualidade com SBERT (seção 3).

2. Geração de Dados Sintéticos

O pipeline de geração sintética foi projetado para maximizar diversidade linguística e estilística:

Modelos utilizados:

ModeloTipoParâmetrosModoDestaque Multilíngue
Qwen 2.5 72BDense72BLocal (4-bit, H100)🟢 Suporte nativo a 29+ idiomas incl. PT
Gemma 3 27BDense27BLocal (H100)🟢 140+ idiomas; base do modelo GAIA PT-BR
DeepSeek V3/V3.1/V3.2MoE671B (37B ativos)API🟢 Treinado em 14.8T tokens multilíngues
Qwen3 235BMoE235B (22B ativos)API🟢 Suporte nativo a 29+ idiomas incl. PT
Kimi K2 InstructMoE1T (32B ativos)API🟡 Forte em chinês/inglês, bom em PT
GLM 4.5Dense~130BAPI🟢 Suporte explícito a 26 idiomas incl. PT
Llama 3 70BDense70BAPI🟢 PT é idioma oficial (8 idiomas, MGSM: 91.1)
MiMo Flash V2MoEAPI🟡 Líder em SWE-bench multilíngue
Mistral / MixtralMoE8x22B / 8x7BAPI🟢 Forte em idiomas europeus incl. PT
🌍 Por que esses modelos? A seleção priorizou LLMs com comprovada capacidade multilíngue e forte desempenho em português, mesmo quando desenvolvidos por empresas chinesas ou americanas: - Qwen 2.5 (Alibaba): Suporta oficialmente 29+ idiomas incluindo português. Foi utilizado como LLM-judge para anotação de qualidade de documentos em português em pesquisas acadêmicas recentes. Em benchmarks de legal brasileiro, superou modelos mais novos. - DeepSeek V3 (DeepSeek): Treinado em 14.8 trilhões de tokens de dados multilíngues de alta qualidade. Listado entre os top modelos para português no Artificial Analysis. - Llama 3 (Meta): Português é um dos 8 idiomas oficialmente suportados. Score de 91.1 no benchmark multilíngue MGSM — o mais alto da família Llama. - GLM 4.5 (Zhipu AI): Pré-treinado em 26 idiomas incluindo português. Reconhecido por desempenho equilibrado em idiomas europeus e asiáticos. - Gemma 3 (Google): Suporta 140+ idiomas no pré-treinamento. - Kimi K2 (Moonshot AI): Excelente em raciocínio cross-lingual chinês-inglês, com boa transferência para português. Modelo de 1 trilhão de parâmetros. - MiMo Flash V2 (Xiaomi): Líder em SWE-bench Multilingual entre modelos open-source. Forte em geração de código e texto em múltiplos idiomas. Essa diversidade de origens (🇨🇳 China, 🇺🇸 EUA, 🇫🇷 França, 🇪🇺 Europa) garante variação estilística natural no corpus — cada modelo imprime suas próprias nuances linguísticas ao português, enriquecendo a distribuição dos dados de treinamento.

Diversidade de prompts:

  • 21+ system prompts com personas distintas: professor universitário, jornalista científico, historiador, divulgador (estilo Átila Iamarino), escritor técnico, filósofo, contador de histórias, pensador crítico, entre outros
  • 20 estilos de texto: artigos educativos, entrevistas, debates, FAQs, threads de Twitter/X, posts de LinkedIn, conversas de WhatsApp, transcrições de podcast, mesas redondas, tutoriais, reviews, newsletters, diálogos socráticos, carrosséis de Instagram, posts de Reddit, e mais
  • Variação de temperatura (0.5–0.9) para ampliar a diversidade lexical
  • Batch generation com múltiplos temas por request para eficiência
💰 Análise de Custos

Gerar ~961 milhões de tokens sintéticos em escala é um desafio logístico e financeiro significativo.

Custo estimado a preços de mercado (output tokens):

ModeloPreço por 1M tokens (output)Proporção estimada
DeepSeek V3/V3.2~US$ 0.42Alta (modelo barato e potente)
MiMo Flash V2~US$ 0.30Moderada
Qwen3 235B~US$ 1.20Moderada
Kimi K2 Instruct~US$ 2.00–3.00Baixa
GLM 4.5~US$ 1.60Baixa
Llama 3 70B~US$ 0.40–0.80Baixa
Mistral/Mixtral~US$ 0.24–0.60Moderada
Modelos locais (Qwen 72B, Gemma 27B)Custo de GPU (~US$ 2–3/h por H100)Alta
MétricaValor
Tokens sintéticos gerados~961M
Custo estimado a preço de mercado~US$ 1.500–3.000
Custo realSignificativamente menor

Estratégias de redução de custo:

  1. 1.Inferência local otimizada: Modelos de 72B+ parâmetros rodando quantizados (4-bit) em GPUs NVIDIA H100, maximizando throughput por hora de GPU — custo por token drasticamente menor que APIs
  2. 2.Arbitragem de APIs: Uso estratégico de múltiplos provedores, aproveitando créditos gratuitos, promoções, e preços por volume
  3. 3.Batch generation: Múltiplos artigos gerados por request, maximizando tokens de output por chamada
  4. 4.Diversificação de modelos: Mix entre modelos caros (maior qualidade) e modelos baratos/gratuitos (volume), mantendo a qualidade média alta
💡 Lição: É possível construir datasets de escala industrial sem orçamento corporativo, combinando engenharia de inferência local com uso inteligente de APIs.

3. Filtragem de Qualidade dos Dados Reais com SBERT

Um dos diferenciais deste corpus é o pipeline de filtragem de qualidade baseado em SBERT (Sentence-BERT), aplicado aos dados reais (C4 e FineWeb2) para remover textos de baixa qualidade do web crawl. Os dados sintéticos, por serem gerados por LLMs de alta capacidade com prompts cuidadosamente projetados, já possuem qualidade inerente e não necessitam dessa filtragem.

3.1. Rotulação Automática com LLM-as-a-Judge

Para treinar o modelo de qualidade, primeiro foi necessário criar um dataset rotulado. Em vez de rotulação manual (inviável para grandes volumes), foi utilizada a técnica LLM-as-a-Judge: um LLM de alta capacidade foi usado para classificar automaticamente ~72K amostras de texto em 3 níveis de qualidade:

ClasseLabelCritério do LLM JudgeExemplos
Ouro (2)Alta qualidadeBem escrito, informativo, coeso, estruturadoArtigos científicos, textos educativos
Médio (1)Qualidade aceitávelLegível mas superficial ou genéricoPosts básicos, textos curtos
Ruim (0)Baixa qualidadeSpam, incoerente, corrompidoAnúncios, textos sem sentido

Essa abordagem é inspirada no pipeline do FineWeb (HuggingFace, 2024), que demonstrou a eficácia de filtragem de qualidade baseada em modelos para curar dados de web crawl em larga escala.

3.2. Fine-Tuning do SBERT

Com os 72K textos rotulados pelo LLM, um modelo SBERT (all-mpnet-base-v2) foi fine-tunado para aprender a "textura" da qualidade textual.

O treinamento usou pares estratégicos:

Tipo de ParTextosLabelObjetivo
PositivoOuro + Ouro1.0Aproximar textos de alta qualidade
Hard NegativeOuro + Médio0.0Ensinar diferenças sutis de qualidade
Easy NegativeOuro + Ruim0.0Ensinar diferenças óbvias (spam vs qualidade)

Configuração do treino:

  • Loss: Cosine Similarity Loss
  • Avaliação: EmbeddingSimilarityEvaluator a cada 500 steps
  • Warmup: 10% dos steps
  • O melhor checkpoint é salvo automaticamente (save_best_model=True)
3.3. Filtragem em Produção

O modelo treinado foi usado para filtrar os dados reais (C4 + FineWeb2) em escala:

┌─────────────────────────────────────────────────────────┐
│  1. ANCHOR: Média dos embeddings de textos "Ouro"  │
│     anchor_emb = mean(SBERT.encode(textos_ouro))       │
│                                                         │
│  2. SCORE: Para cada documento do C4/FineWeb2           │
│     score = cosine_sim(SBERT.encode(doc), anchor_emb)  │
│                                                         │
│  3. DECISÃO:                                            │
│     score ≥ threshold → ✅ Aprovado (alta qualidade)    │
│     score < threshold → ❌ Rejeitado (spam/lixo)        │
│                                                         │
│  Threshold = média_ouro - 1σ  (~84% dos textos bons)   │
└─────────────────────────────────────────────────────────┘

O processamento em batch (batch_size=64 na GPU) permite filtrar milhões de textos com eficiência.

4. Processamento Final

  • Deduplicação por hash MD5 — remoção de duplicatas exatas em todo o corpus
  • Filtragem por tamanho — mínimo de 50 caracteres e 10 palavras por documento
  • Normalização de schema — todos os documentos convertidos para formato unificado
  • Conversão para Parquet — formato otimizado com compressão Snappy

📋 Schema

Cada documento contém os seguintes campos:

CampoTipoDescrição
textstringConteúdo do documento
sourcestringFonte original do documento
subsetstring"real" ou "synthetic"
word_countint32Contagem de palavras
char_countint32Contagem de caracteres
languagestring"pt-br"

⚠️ Limitações

  • Dados sintéticos podem conter alucinações factuais
  • O subset real herda possíveis vieses das fontes originais (C4, FineWeb2)
  • Não há garantia de que todos os textos são factualmente corretos
  • Estimativas de tokens são aproximadas (fator ~1.3x sobre contagem de palavras)

📜 Licença e Termos de Uso

O Corpus PT-BR v1 é distribuído sob a licença Open Data Commons Attribution License (ODC-By) v1.0, herdada dos datasets que compõem sua base.

Entretanto, devido à natureza híbrida do corpus, aplicam-se termos específicos a cada subset:

  1. 1.Subset `real` (C4 e FineWeb2): Liberados sob a licença ODC-By 1.0. Os usuários também estão sujeitos aos Termos de Uso do Common Crawl.
  2. 2.Subset `synthetic`: Os textos sintéticos foram gerados utilizando diversos LLMs (como Llama 3, Qwen, DeepSeek e Gemma). O uso destes dados sintéticos pode estar sujeito aos termos de uso ou licenças originais dos respectivos modelos geradores (ex: Llama 3 Community License, Gemma Terms of Use, etc.), que frequentemente estabelecem regras sobre o uso de seus outputs para trinar modelos comerciais concorrentes.

Para usos de pesquisa (Research), fine-tuning e aplicações não-massivas, o uso é amplamente encorajado e permitido pelas licenças base.

🧠 Sobre o Projeto

Este corpus é um dos produtos de uma infraestrutura de engenharia de dados para NLP em Português, desenvolvida ao longo de meses. A liberação pública do corpus-ptbr-v1 inclui a documentação do dataset e scripts utilizados em partes do pipeline. O processo completo inclui:

  • Geração sintética em massa — orquestração de múltiplos LLMs (locais e via API) com prompts diversificados, otimização de throughput, e controle de custos
  • Filtragem de qualidade — modelo SBERT fine-tunado para classificar textos por qualidade, treinado com dados rotulados automaticamente via LLM-as-a-Judge
  • Datasets de rotulagem — datasets auxiliares para tarefas de classificação, avaliação e curadoria de qualidade
  • Processamento em escala — pipelines de deduplicação, normalização e conversão otimizados para datasets de bilhões de tokens

O corpus-ptbr-v1 é o primeiro dataset público gerado a partir dessa infraestrutura, com outros projetos de dados em andamento.

👤 Autor

Gabriel Yogi (MadrasLe)HuggingFace