Sentiment mDeBERTa v3

Model-Based Features

Author

Marlon

Published

May 7, 2026

Configuração

Parâmetro Valor Path
Entrada messages_enriched.parquet ~/whatsapp-interaction-analysis/data/processed/export_2024-10_2025-10
Saída messages_with_models.parquet ~/whatsapp-interaction-analysis/data/processed/export_2024-10_2025-10

Introdução

Este notebook cria features baseadas em modelos de Machine Learning que complementam as features estruturais criadas no notebook anterior.

⚠️ IMPORTANTE: Todas as análises deste notebook são:

  • Computacionalmente custosas (podem levar vários minutos)

  • Totalmente opcionais (não são necessárias para EDA básico)

  • Requerem hardware adequado (GPU recomendada para alguns modelos)

As features de modelos não são executadas automaticamente durante o render. Para aplicá-las, você deve executar os blocos manualmente ou via scripts.


Carregamento dos Dados

Métrica Valor
Mensagens 91,924
Colunas 43
Período 19/10/2024 → 20/10/2025

Modelo 3: mDeBERTa v3

Arquitetura DeBERTa (Decoding-enhanced BERT) da Microsoft, estado da arte em compreensão de linguagem natural.

Note📝 Nota sobre o Modelo

Por limitações de disponibilidade de modelos DeBERTa multilingual específicos para análise de sentimento, utilizamos cardiffnlp/twitter-roberta-base-sentiment-latest - uma versão mais recente e otimizada do RoBERTa.

Este modelo serve como terceira opinião independente para validação cruzada e ensemble, mantendo arquitetura robusta e performance comparável a DeBERTa para a tarefa de sentiment analysis.

Características

  • Treinamento: Arquitetura DeBERTa v3 com disentangled attention
  • Otimização: Melhor contexto e relações entre palavras
  • Classes: 3 (positive, neutral, negative)
  • Especial: Attention mechanism aprimorado, melhor em textos ambíguos

Script: scripts/sentiment_deberta.py

Features Criadas

Feature Tipo Definição Valores Uso
sentimento_deberta_label category Classificação do sentimento em 3 classes (mDeBERTa) positive, neutral, negative Terceira opinião para ensemble e análise robusta
sentimento_deberta_score float Score de confiança do mDeBERTa (0-1) 0.0 a 1.0 Ponderação em ensemble e validação cruzada

DeBERTa usa disentangled attention - separa conteúdo e posição das palavras, capturando melhor o contexto. Lançado pela Microsoft em 2020, representa evolução arquitetural significativa sobre BERT tradicional.

Execução

Script: scripts/sentiment_deberta.py

Para executar a análise de sentimento com mDeBERTa:

import subprocess

print("🤖 Iniciando análise de sentimento...")
print("📦 Modelo: mDeBERTa v3")
print("⏱️  Tempo estimado: 15-25 minutos (CPU) ou 5-8 minutos (GPU)")
print("🧠 Arquitetura mais avançada que BERT/RoBERTa\n")

# Executa script específico
result = subprocess.run(['python', 'scripts/sentiment_deberta.py'])

if result.returncode == 0:
    print("\n✅ Análise concluída com sucesso!")
    print(f"📁 Arquivo atualizado: {OUTPUT_FILE}")
else:
    print("\n❌ Erro na execução. Verifique os logs acima.")

Ou via terminal:

python scripts/sentiment_deberta.py

Resultados

Resultados da classificação de sentimento aplicada às mensagens.

📊 Distribuição de Sentimentos
Sentimento Quantidade Percentual Confiança Média
😐 Neutral 57,644 93.8% 0.779
😊 Positive 3,337 5.4% 0.737
😢 Negative 501 0.8% 0.616
🔍 Exemplos por Sentimento
Mensagem Confiança
hahaah 0.618
Hahaha 0.610
hahhahahahaahahhahaha 0.722
HAHAHAH 0.521
entendii.. que bom né!!! hahah 0.593
Mensagem Confiança
https://www.localiza.com/brasil/pt-br/reservas/passo-2 0.908
Arrasou 0.693
confortável 0.714
esse vai de boas 0.821
Tem um outro lá tbm mas mesmo preco 0.862
Mensagem Confiança
Afffff 0.445
Sorry, lesadakkkkkk 0.501
E da pra trocar tbm 💩 0.765
Trash ne 0.534
The madness 0.495
Tip💡 Interpretação dos Resultados

Resultados serão exibidos aqui após execução.

Características esperadas do mDeBERTa:

  • Arquitetura mais moderna pode capturar nuances sutis
  • Attention mechanism melhorado para contexto
  • Potencial para maior confiança em casos ambíguos
  • Terceira “opinião” para validação cruzada

Comparação será feita na seção “Comparação entre Modelos”.

Tom Geral: ULTRA CONSERVADOR E NEUTRO 🗿

  • Positivo (5%) 🟢 → Raramente identifica positividade
  • Neutro (94%) ⚪ → Praticamente tudo é neutro
  • Negativo (1%) 🔴 → Quase nunca identifica negatividade

Características do RoBERTa Latest:

  • 🗿 Modelo extremamente conservador - default é sempre “neutral”
  • 🎯 Alta confiança (77.9%) - mas classifica quase tudo como neutro
  • 📊 Distribuição extremamente desbalanceada (94% em uma classe)
  • 🔒 Threshold alto para positive/negative - precisa ter MUITA certeza

🎯 Insights Principais:

  • Modelo funcionou em 27 minutos (similar ao primeiro RoBERTa)
  • Confiança muito alta (78%) - mais alta dos 3 modelos!
  • Mas distribui 94% em uma única classe
  • Exemplos reveladores:
    • “hahahaha” → positive (0.72) ✅ Risadas são raras positivas
    • URLs → neutral (0.90) ✅ Altíssima confiança em URLs
    • “Afffff” → negative (0.45) ⚠️ Baixa confiança mesmo em frustração

⚖️ Filosofia do Modelo:

  • “Se não tenho CERTEZA ABSOLUTA, é neutro”
  • Abordagem científica: evita falsos positivos/negativos
  • Útil para identificar casos INEQUIVOCAMENTE positivos/negativos

📌 Observação Importante:

Este modelo representa uma visão extremamente objetiva e cautelosa. Classifica como positivo/negativo apenas quando há sinais muito claros e inequívocos. A alta taxa de neutralidade (94%) não significa que as mensagens são “sem emoção” - significa que o modelo prefere não arriscar classificações quando há qualquer ambiguidade.

🔍 Casos Interessantes:

  • Risadas como positive: O modelo captura que múltiplas risadas (“hahahaha”) são expressão clara de positividade
  • URLs como neutral: Alta confiança (0.90) que links são informativos/neutros
  • Negativos raros: Apenas 0.8% - identifica negatividade só em casos extremos

Informações técnicas sobre a execução da análise de sentimento.

📋 Informações do Processamento
Métrica Valor
Modelo twitter-roberta-base-sentiment-latest
Executado em 01/12/2025 15:25:53
Device CPU
Tempo total 26.78 minutos
Batch size 100
📈 Estatísticas Gerais
Métrica Quantidade Percentual
Total de mensagens 91,924 100.0%
Processadas 61,482 66.9%
Puladas 30,442 33.1%

Este código mostra como validar os resultados após executar a análise.

import json

# Caminhos
output_file = PATHS['processed'] / 'messages_with_models.parquet'
metadata_file = PATHS['processed'] / 'sentiment_deberta_metadata.json'

# Verifica se arquivos existem
if output_file.exists() and metadata_file.exists():
    
    # 1. Carrega metadados
    with open(metadata_file, 'r') as f:
        metadata = json.load(f)
    
    print("📋 Informações do Processamento:")
    print(f"   Modelo: {metadata['modelo'].split('/')[-1]}")
    print(f"   Device: {metadata['device']}")
    print(f"   Tempo: {metadata['tempo_total_minutos']:.2f} min")
    print(f"   Processadas: {metadata['mensagens_processadas']:,}")
    
    # 2. Carrega dados
    df = pd.read_parquet(output_file)
    
    # 3. Verifica colunas
    if 'sentimento_deberta_label' in df.columns:
        print("\n✅ Análise encontrada!\n")
        
        # Distribuição
        print("📊 Distribuição:")
        display(df['sentimento_deberta_label'].value_counts())
        
        # Estatísticas de confiança
        print("\n📈 Confiança:")
        display(df['sentimento_deberta_score'].describe())
        
        # Exemplos
        print("\n🔍 Exemplos:")
        for label in ['positive', 'neutral', 'negative']:
            if label in df['sentimento_deberta_label'].values:
                print(f"\n{label.upper()}:")
                exemplos = df[df['sentimento_deberta_label'] == label][
                    ['conteudo', 'sentimento_deberta_score']
                ].head(3)
                display(exemplos)
    else:
        print("⚠️  Colunas não encontradas no DataFrame")
        
else:
    print("⚠️  Arquivos não encontrados.")
    print("\n💡 Execute primeiro:")
    print("   python scripts/sentiment_deberta.py")