Sentiment Roberta

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 1: Twitter-XLM-RoBERTa

Modelo especializado em texto curto (tweets), multilingual, com excelente performance em português.

Características

  • Treinamento: ~200M tweets em 100+ idiomas
  • Otimização: Mensagens curtas e informais (ideal para WhatsApp)
  • Classes: 3 (positive, neutral, negative)
  • Especial: Lida bem com emojis e linguagem coloquial

Features Criadas

Feature Tipo Definição Valores Uso
sentimento_roberta_label category Classificação do sentimento em 3 classes positive, neutral, negative Análise de tom emocional das conversas
sentimento_roberta_score float Score de confiança do modelo (0-1) 0.0 a 1.0 Intensidade/confiança da predição, filtrar predições incertas
sentimento_label category Alias para sentimento_roberta_label (modelo padrão) positive, neutral, negative Compatibilidade com código existente
sentimento_score float Alias para sentimento_roberta_score (modelo padrão) 0.0 a 1.0 Compatibilidade com código existente

As features são criadas com prefixo sentimento_roberta_* para permitir comparação futura com outros modelos. Aliases sem prefixo (sentimento_label, sentimento_score) são mantidos para retrocompatibilidade.

Execução

Script: scripts/sentiment_twitter_roberta.py

Para executar a análise de sentimento com Twitter-RoBERTa:

import subprocess

print("🤖 Iniciando análise de sentimento...")
print("📦 Modelo: Twitter-XLM-RoBERTa")
print("⏱️  Tempo estimado: 15-30 minutos (CPU) ou 5-10 minutos (GPU)\n")

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

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

Ou via terminal:

python scripts/sentiment_twitter_roberta.py

Resultados

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

📊 Distribuição de Sentimentos
Sentimento Quantidade Percentual Confiança Média
😐 Neutral 30,066 48.9% 0.609
😊 Positive 17,410 28.3% 0.716
😢 Negative 14,006 22.8% 0.694
🔍 Exemplos por Sentimento
Mensagem Confiança
Arrasou 0.524
esse vai de boas 0.843
O jeep é show! 0.876
O valor ta bom 0.640
Alto paraíso São Jorge 0.879
Mensagem Confiança
https://www.localiza.com/brasil/pt-br/reservas/passo-2 0.888
confortável 0.387
Tem um outro lá tbm mas mesmo preco 0.805
10 conto diferença 0.603
A movida tem ai tbm? 0.858
Mensagem Confiança
É tudo igual 0.634
Vou entrar no link sim Foi mal, fiquei enrolada esses dias tbm 0.924
4 mil é muito 0.448
Mas sim, ainda caro 0.717
Saquei 0.386
Tip💡 Interpretação dos Resultados

Tom Geral: EQUILIBRADO E SAUDÁVEL ✅

  • Positivo (28%) 🟢 → Carinho e afeto presentes
  • Neutro (49%) ⚪ → Coordenação e informação (normal)
  • Negativo (23%) 🔴 → Vulnerabilidade compartilhada (saudável)

Características de um relacionamento saudável:

  • ✅ Tem positividade (não é só reclamação)
  • ✅ Tem espaço para negativo (vulnerabilidade)
  • ✅ Muita comunicação prática (neutro)

🎯 Insights Principais:

  • Modelo funcionou bem - Confiança média >60%
  • Dados realistas - 33% sem texto é normal no WhatsApp
  • Distribuição saudável - Não é tóxico (< 30% negativo)
  • Neutro domina - Conversas práticas do dia a dia
  • Exemplos fazem sentido - Classificações coerentes

🔮 Próximos Passos no EDA:

  • 📈 Timeline emocional ao longo dos meses
  • 👥 Comparação entre remetentes
  • 🌍 Sentimento durante encontros vs distância
  • ⏰ Variação por período do dia
  • 📅 Diferenças entre dias da semana

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

📋 Informações do Processamento
Métrica Valor
Modelo twitter-xlm-roberta-base-sentiment
Executado em 01/12/2025 12:05:21
Device CPU
Tempo total 24.29 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_metadata.json'

# Verifica se arquivos existem
if output_file.exists() and metadata_file.exists():
    
    # 1. Carrega metadados do processamento
    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_roberta_label' in df.columns:
        print("\n✅ Análise encontrada!\n")
        
        # Distribuição
        print("📊 Distribuição:")
        display(df['sentimento_roberta_label'].value_counts())
        
        # Estatísticas de confiança
        print("\n📈 Confiança:")
        display(df['sentimento_roberta_label'].describe())
        
        # Exemplos por sentimento
        print("\n🔍 Exemplos:")
        for label in ['positive', 'neutral', 'negative']:
            if label in df['sentimento_roberta_label'].values:
                print(f"\n{label.upper()}:")
                exemplos = df[df['sentimento_roberta_label'] == label][
                    ['conteudo', 'sentimento_roberta_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_twitter_roberta.py")