6.9 KiB
ADR-001 — Classificar e rotear conteúdo predominantemente de mídia antes do multimotor
Status
Accepted
Contexto
O pipeline atual obtém a página completamente carregada através do crawler e, posteriormente, executa múltiplos motores de extração textual.
Esse desenho é adequado para artigos cujo conteúdo principal é texto.
Entretanto, alguns veículos publicam páginas onde:
- existe apenas uma breve introdução textual;
- o conteúdo principal é um vídeo, imagem, conjunto de imagens ou conteúdo incorporado.
Processar essas páginas com os motores textuais é desnecessário e pode gerar resultados pobres ou irrelevantes.
A responsabilidade de identificar esses casos deve ser adicionada sem alterar o crawler e sem transformar o pipeline em uma nova arquitetura.
Decisão
Adicionar uma etapa de classificação imediatamente após o crawl e antes do multimotor.
Fluxo:
Crawler
↓
DOM completamente carregada
↓
Media Candidate Detection
↓
├── sem mídia candidata
│ ↓
│ multimotor atual
│
└── com mídia candidata
↓
Media Content Classifier
↓
├── text
│ ↓
│ multimotor atual
│
└── media
↓
JSON separado
Detecção estrutural
Antes do LLM deve existir apenas uma análise estrutural simples da DOM.
Objetivo:
verificar se existe algum elemento de mídia que justifique a classificação.
A análise deve operar sobre a DOM/HTML já carregada pelo crawler.
É permitido utilizar:
- parser HTML;
- navegação por nós;
- tags;
- atributos estruturais;
- relações entre elementos;
- contagem de elementos.
É proibido utilizar:
- regex;
- listas de palavras específicas por idioma;
- heurísticas semânticas por idioma.
Essa etapa não decide se a publicação é media.
Ela decide apenas se há motivo para chamar o classificador.
Conteúdo enviado ao modelo
O modelo deve receber uma representação compacta dos dados já existentes na página.
Devem ser utilizados somente dados necessários para a decisão, como:
título
blocos textuais relevantes
presença de imagem
quantidade de imagens
presença de vídeo
presença de elementos incorporados
Não enviar mídia binária.
Não realizar chamadas externas para compreender a mídia.
Não enviar HTML completo quando uma representação compacta da estrutura puder fornecer a mesma informação.
Responsabilidade do classificador
O classificador responde uma única pergunta conceitual:
O texto desta publicação possui conteúdo jornalístico substancial por si próprio ou funciona essencialmente como uma breve introdução, contextualização ou descrição da mídia presente?
Se o texto for substancial:
{
"content_type": "text",
"media_type": null
}
Se a mídia for o conteúdo principal:
{
"content_type": "media",
"media_type": "..."
}
Tipos permitidos
video
image
images
embed
mixed
Não criar subtipos adicionais.
Regra para múltiplas imagens
Não é necessário identificar tecnicamente um componente carousel.
Se múltiplas imagens constituem o conteúdo principal, o resultado deve ser:
images
Independentemente de serem apresentadas como:
- carousel;
- slideshow;
- galeria;
- sequência vertical;
- qualquer outra composição visual.
Regra para conteúdo misto
Quando mais de uma categoria de mídia constituir o conteúdo principal:
mixed
Não criar precedência artificial como:
video > image
Artigos textuais
Um artigo continua sendo text mesmo contendo mídia quando existe conteúdo jornalístico textual substancial.
Portanto:
presença de mídia ≠ classificação media
Artigos muito curtos
Uma publicação extremamente curta com uma imagem pode ser classificada como media/image.
Não é necessário tentar preservar esse conteúdo como artigo textual apenas porque existe algum texto.
Posicionamento arquitetural
A nova etapa deve permanecer fora de:
Trafilatura
Newspaper4k
Readability
Nenhum dos três motores é responsável pela classificação.
O método equivalente ao atual extract_all_engines() somente deve ser executado depois que o novo roteamento determinar:
content_type = text
Saída física
Artigos textuais:
*_extracted.json
Artigos predominantemente de mídia:
*_media.json
A classificação de mídia não deve aparecer misturada aos artigos textuais processados com sucesso.
Dados preservados para mídia
Cada registro de mídia deve preservar somente informações básicas necessárias à rastreabilidade:
input_meta
crawled_url
page_title
http_status
content_type
media_type
Não existe extração de mídia nesta feature.
Alternativas consideradas
Executar primeiro o multimotor e identificar mídia depois
Rejeitada.
Motivos:
- executa trabalho desnecessário;
- mistura responsabilidades;
- não evita custo de processamento;
- mantém páginas inadequadas dentro do pipeline textual.
Usar Newspaper4k para descobrir mídia
Rejeitada.
Embora Newspaper4k possa expor informações de imagens e vídeos, utilizá-lo significaria executar parte do multimotor justamente nos conteúdos que a nova feature pretende desviar antes do multimotor.
Classificar tudo apenas com regras
Rejeitada.
A decisão:
texto jornalístico curto
versus:
texto que apenas descreve uma mídia
é semântica e precisa funcionar em até 10 idiomas.
Criar heurísticas específicas para resolver isso aumentaria código, manutenção e fragilidade.
Utilizar regex
Rejeitada e proibida por requisito.
Utilizar modelo multimodal
Rejeitada.
O sistema não precisa entender a mídia.
Precisa apenas determinar se o texto é o conteúdo principal ou se serve de introdução à mídia.
Consequências positivas
- reduz processamento desnecessário;
- mantém o multimotor focado em texto;
- separa claramente conteúdos de naturezas diferentes;
- mantém a implementação pequena;
- evita regras linguísticas;
- funciona de forma multilíngue;
- não introduz nova infraestrutura;
- permite evolução futura do pipeline de mídia de forma independente.
Consequências aceitas
Alguns artigos textuais muito curtos acompanhados de imagem poderão ser classificados como media/image.
Esse comportamento é deliberado e aceito, pois conteúdos textuais extremamente pobres não são úteis para o objetivo do pipeline textual.
Invariantes
A implementação deve sempre preservar:
MEDIA
→ nunca executa multimotor
TEXT
→ segue pipeline atual
classification_failed
→ não assume TEXT
→ não assume MEDIA
E:
nenhuma regex
nenhum download de mídia
nenhuma análise multimodal
nenhuma interação com carousel