--- language: pt license: mit base_model: neuralmind/bert-base-portuguese-cased pipeline_tag: text-classification tags: - stance-detection - twitter - portuguese - bertimbau metrics: - accuracy - f1 --- # BERTimbau Base — Stance em Episódios de Cancelamento (PT-BR) Modelo de **classificação de stance** (postura discursiva) em tweets em português sobre episódios de cancelamento: dado um tweet, prediz se o autor se posiciona como **acusador**, **defensor** ou **neutro** em relação ao alvo do cancelamento. Fine-tuning de [`neuralmind/bert-base-portuguese-cased`](https://huggingface.co/neuralmind/bert-base-portuguese-cased) (BERTimbau Base), desenvolvido como parte do MVP da Sprint de Machine Learning & Analytics da Pós-Graduação em Ciência de Dados e Analytics (PUC-Rio) e de uma pesquisa mais ampla sobre dinâmica mimética em redes sociais. ## Uso ```python from transformers import pipeline clf = pipeline("text-classification", model="carlospaes120/bertimbau-base-stance") clf("Ele errou feio, tem que responder pelo que disse.") # [{'label': 'acusador', 'score': ...}] ``` ## Dados de treinamento 1.569 tweets em português rotulados manualmente, de dois episódios de cancelamento brasileiros — caso Monark (fev/2022, 600 tweets) e caso Wagner Schwartz (set/2017, 969 tweets) — divididos em treino (1.255), validação (157) e teste (157), com estratificação por classe. Distribuição: acusador 61%, neutro 23%, defensor 16%. Dataset e notebook completos: [github.com/carlospaes120/scapegoat](https://github.com/carlospaes120/scapegoat) (pasta `mvp/`). ## Receita de treinamento - Até 8 épocas, learning rate `2e-5`, warmup de 10%, batch 8, weight decay `0.01`, seed 42 - `EarlyStoppingCallback` (paciência 2) monitorando o F1-macro da validação; melhor época restaurada ao final - `CrossEntropyLoss` ponderada com class weights *balanced* (calculados apenas no treino), para mitigar o desbalanceamento - Sem data augmentation ## Reprodução O notebook completo do MVP está em [github.com/carlospaes120/scapegoat](https://github.com/carlospaes120/scapegoat) (pasta `mvp/`). Ele roda de ponta a ponta no Google Colab, baixando os dados automaticamente do repositório. O comportamento **padrão** do notebook (flag `TRAIN_BERT_FROM_SCRATCH = False`) **carrega este checkpoint** em vez de re-treinar: usa a pasta local se existir e, caso contrário, baixa estes pesos do Hugging Face Hub. Assim a avaliação no conjunto de teste roda em segundos, sem GPU. Para reproduzir o treino do zero a partir de `neuralmind/bert-base-portuguese-cased`, basta definir a flag como `True`. ## Métricas (teste congelado, n=157) | Classe | Precisão | Revocação | F1 | Suporte | |---|---|---|---|---| | acusador | 0,846 | 0,802 | 0,824 | 96 | | defensor | 0,452 | 0,560 | 0,500 | 25 | | neutro | 0,686 | 0,667 | 0,676 | 36 | | **Acurácia** | | | **0,732** | 157 | | **F1-macro** | | | **0,667** | 157 | ## Limitações - A classe `defensor` é minoritária (16%) e a mais difícil; com apenas 25 exemplos no teste, seu F1 é volátil. - O stance é tratado como propriedade apenas do texto — ironia e sarcasmo que dependem de contexto externo (timing, autor, evento) são fontes conhecidas de erro. - Treinado em dois episódios específicos; a generalização para outros casos de cancelamento não foi avaliada (sem validação *leave-one-case-out*). - Anotação por um único anotador, sem medida de concordância inter-anotador. ## Uso pretendido Modelo de pesquisa, para fins acadêmicos. Não recomendado para moderação de conteúdo ou qualquer decisão automatizada sobre pessoas.