Home›Blog›Do PDF ao dataset pesquisável: pipeline de IA para documentos públicos
#ia#automacao#python#ocr
Do PDF ao dataset pesquisável: pipeline de IA para documentos públicos
Guia prático para transformar PDFs públicos em dados pesquisáveis com OCR, redaction, embeddings e busca — passo a passo e checklist para um MVP.
📅 22 Jun 2026⏱️ 4 min de leitura✍️ Zenn Digital
Gancho: IAJus 2026 e a demanda por automação
O evento IAJus 2026 do CNJ reacende o interesse por integrar IA e automações no setor público. Uma necessidade recorrente é transformar volumes de documentos (PDFs de processos, atas, relatórios públicos) em dados pesquisáveis e reutilizáveis — sem expor informação sensível.
Abaixo segue um roteiro prático para montar um pipeline que extrai, limpa, anonimiza e indexa documentos públicos, gerando um MVP que você pode oferecer como serviço, produto interno ou projeto freelance.
Visão geral da arquitetura
Ingest: coleta de PDFs (upload, FTP, e-mails, repositório público)
Extração/OCR: transformar PDF em texto
Normalização e chunking: dividir por parágrafos/metadados
Redaction (opcional/obrigatório): remover ou mascarar PII/sensível
Enriquecimento: extração de metadados (datas, autores, tipos)
Normalize espaços, quebras de linha e remova cabeçalhos/rodapés repetidos.
Divida texto em chunks de ~500–1000 tokens (ou 200–800 palavras) mantendo contexto e metadados (página, posição).
4) Redaction (privacidade)
Aplique regras de redaction antes de indexar. Use NER para detectar nomes, CPFs, emails, telefones, datas sensíveis.
Estratégia: preferir mascaramento ([REDACTED]) em vez de exclusão total para auditar laterais.
Exemplo com spaCy (PT):
import spacy
nlp = spacy.load("pt_core_news_sm")
def redact(text):
doc = nlp(text)
out = text
for ent in reversed(doc.ents):
if ent.label_ in {"PER","LOC","ORG","MISC","DATE"}:
out = out[:ent.start_char] + "[REDACTED]" + out[ent.end_char:]
return out
Atenção: modelos NER não são perfeitos. Combine regras regex (CPF, CNPJ, emails) com NER.
5) Embeddings e indexação
Gere embeddings por chunk e construa índice vetorial.
Exemplo com sentence-transformers + FAISS:
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
model = SentenceTransformer("all-MiniLM-L6-v2")
chunks = ["texto 1", "texto 2"]
embs = model.encode(chunks, show_progress_bar=True)
d = embs.shape[1]
index = faiss.IndexFlatL2(d)
index.add(np.array(embs))
Para cada consulta: buscar top-k pelo índice, então opcionalmente passar contexto para um modelo de geração/resumo para produzir respostas sintéticas.
Para evitar hallucination, sempre mostre trechos originais e link para o documento fonte.
Checklist rápido para o seu MVP
Pipeline de ingest configurado (upload/monitoramento)
Extração OCR funcionando para documentos escaneados
Chunking com metadados (página, posição)
Regras de redaction implementadas (regex + NER)
Embeddings e índice (FAISS/Chroma) funcionando
Endpoint de busca com paginação e exibição de excertos
Logs de auditoria e controle de acesso
Tests básicos com exemplos reais (documentos públicos)
Boas práticas e riscos
Proteção de dados: mesmo para documentos públicos, verifique exigências locais sobre dados pessoais; aplique retenção e acesso mínimo.
Transparência: registre transformações (o que foi redigido/alterado) para auditoria.
Performance: faça pré-computação de embeddings; atualize índice incrementalmente.
Custo: prefira modelos embarcáveis para escala inicial; use serviços gerenciados apenas quando necessário.
Ideias de serviços para vender
Extração e indexação de atas e decretos para gabinetes e universidades
Motor de busca semântico para portais de transparência
Serviço de monitoramento (alertas por termo) para órgãos e ONGs
Pack de anonimização em lote para publicações
Checklist de lançamento (1ª versão)
Demo com 5 documentos variados
Interface de busca e botão de download do excerto original
Relatório de redactions realizados
Política de retenção e contrato simples para clientes
Se quiser, eu posso gerar um roteiro de implementação detalhado com comandos, Dockerfile e um exemplo de repo Python para você copiar e rodar como MVP.