Skip to content

Code-AldreySandre/classificacao_de_sentimentos

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Classificador de Sentimentos com NLP e spaCy

Python SpaCy Status

Um projeto hands-on de Processamento de Linguagem Natural (NLP) focado na classificação binária de emoções (Alegria vs. Medo) utilizando redes neurais convolucionais via spaCy.


Sobre o Projeto

Este projeto foi desenvolvido com o objetivo principal de praticar e consolidar conceitos fundamentais de NLP e Machine Learning. A aplicação consiste em um pipeline completo que recebe frases em português, realiza o pré-processamento linguístico e prediz a carga emocional do texto.

Objetivos de Aprendizado

  • Compreender o pipeline de treinamento do spaCy (textcat).
  • Aplicar técnicas de pré-processamento (Lematização, Stop Words, Tokenização).
  • Analisar métricas de desempenho (Acurácia, Precision, Recall, F1-Score).
  • Interpretar Matrizes de Confusão para diagnosticar vieses do modelo.
  • Gerenciar dependências e ambientes virtuais com Poetry.

Tecnologias Utilizadas

  • Linguagem: Python 3.12+
  • Core NLP: spaCy (Modelo pt_core_news_sm)
  • Manipulação de Dados: Pandas, NumPy
  • Visualização: Seaborn, Matplotlib
  • Métricas: Scikit-Learn
  • Gerenciamento de Dependências: Poetry

Estrutura do Projeto

A organização dos diretórios segue as boas práticas de Engenharia de Machine Learning, garantindo a separação entre dados, modelos serializados e notebooks de experimentação:

├── .venv/                 # Ambiente Virtual isolado (gerenciado pelo Poetry)
├── DataBases/             # Armazenamento dos datasets (arquivos .txt)
│   ├── base_treinamento.txt  # Base rotulada para o aprendizado supervisionado
│   └── base_teste.txt        # Base inédita reservada para a validação final
├── Models/                # Persistência do "cérebro" da IA
│   └── modelo_final/      # O artefato final do spaCy (V2) salvo em disco
├── Notebooks/             # Laboratório de código (Jupyter Notebooks)
│   ├── Nlp_TextClassifier.ipynb  # Pipeline de pré-processamento e treinamento
│   └── Avaliacao_Modelo.ipynb    # Pipeline de teste, métricas e gráficos
├── poetry.lock            # Arquivo de trava de versões (garante reprodutibilidade)
├── pyproject.toml         # Manifesto de configuração e dependências
├── LICENSE                # Licença do código
└── README.md              # Documentação do projeto

Como Executar

Este projeto utiliza o Poetry para gerenciamento. Siga os passos abaixo:

  1. Clone o repositório:

    git clone [https://github.com/seu-usuario/seu-projeto-nlp.git](https://github.com/seu-usuario/seu-projeto-nlp.git)
    cd seu-projeto-nlp
  2. Instale as dependências:

       poetry install
  3. Ative o ambiente virtual:

    source .venv/bin/activate

    Se estiver no windows:

    .\.venv\Scripts\activate
  4. Baixe o modelo de língua portuguesa:

    poetry run python -m spacy download  pt_core_news_Sm
  5. Execute o projeto:

    code .
    # ou
    jupyter notebook

Metodologia e Experimentos

O desenvolvimento do projeto seguiu uma abordagem científica e iterativa. Para encontrar o equilíbrio ideal entre generalização e precisão, foram realizados três grandes experimentos controlados, variando os hiperparâmetros de treinamento e as técnicas de pré-processamento de texto.

1. O Ciclo de Experimentação

Abaixo, o comparativo das versões testadas até atingir o modelo final:

Experimento Configuração Acurácia Diagnóstico Técnica
V1 (Baseline) 10 Épocas + Limpeza Agressiva 58.33% Underfitting: O modelo treinou por pouco tempo e não conseguiu convergir, apresentando comportamento quase aleatório.
V2 (Campeão) 50 Épocas + Limpeza Agressiva 64.29% Melhor Resultado: O aumento de épocas permitiu que a Loss diminuísse suficientemente para o modelo aprender padrões sutis da classe "Medo".
V3 (Ruído) 50 Épocas + Com Pontuação 61.90% Overfitting/Ruído: A tentativa de manter pontuação e stop words adicionou complexidade excessiva para um dataset pequeno, confundindo o classificador.

2. A Estratégia Vencedora (Configuração V2)

A configuração que garantiu a melhor performance foi a "Limpeza Agressiva". Dado o tamanho reduzido do dataset, a estratégia adotada foi maximizar a relação sinal-ruído, removendo qualquer elemento que não fosse essencial para a semântica da emoção.

Pipeline de Pré-processamento:

  1. Lowercasing: Padronização de todo o texto para minúsculas.
  2. Lematização (Lemmatization): Redução das palavras à sua raiz gramatical (ex: "correndo", "correu" $\rightarrow$ "correr") para agrupar variações semânticas.
  3. Remoção de Stop Words: Eliminação de palavras funcionais comuns (ex: "o", "a", "de", "para") que não carregam carga emocional intrínseca.
  4. Remoção de Pontuação: Descarte de caracteres especiais para focar puramente no léxico.

Insight do Estudo: Ao contrário da intuição inicial de que a pontuação (ex: "!!!") ajudaria na detecção de medo, os testes (V3) mostraram que, em bases de dados pequenas, ela age como ruído. Simplificar o texto permitiu ao modelo focar nas keywords determinantes (ex: "pavor", "amor", "socorro").

Análise de Resultados

O modelo final (V2) foi submetido a uma avaliação rigorosa utilizando a base de teste (dados inéditos), garantindo a isenção dos resultados.

1. Métricas de Performance

O classificador atingiu uma performance consistente acima da aleatoriedade (50%), demonstrando aprendizado efetivo:

  • Acurácia Global: 64.29%
  • Precision: 64.07%
  • Recall: 64.29%
  • F1-Score: 64.14%

2. Diagnóstico da Matriz de Confusão

A análise detalhada dos erros revela o comportamento semântico do modelo:

Classe Real Predição do Modelo Análise
Alegria Alta Precisão O modelo acertou a vasta maioria dos casos (34 de 48). O vocabulário de alegria mostrou-se distinto e fácil de ser capturado.
Medo Dificuldade O modelo acertou 20 casos, mas confundiu 16 frases de medo como sendo alegria.

Indução: O modelo apresenta um viés otimista. Devido ao desbalanceamento e à limitação quantitativa da base, em situações de ambiguidade ou palavras desconhecidas, a rede neural tende a classificar a frase na classe majoritária de acertos ("Alegria"). A "assinatura" do medo (ex: palavras específicas de perigo) precisa de mais exemplos para se tornar predominante.


Conclusão

Este projeto cumpriu seu objetivo pedagógico ao demonstrar a complexidade da análise de sentimentos "end-to-end". Foi possível sair de um modelo aleatório (50%) para um classificador funcional (~65%) apenas através do ajuste fino de hiperparâmetros (épocas) e estratégias de limpeza de dados, sem alterar a arquitetura da rede.

A acurácia de 64% representa o teto de performance extraído deste conjunto de dados específico com a arquitetura textcat do spaCy.

Possíveis melhorias

Para evoluir o projeto em iterações futuras, recomenda-se:

  • Expansão do Dataset: Aumentar a base para 500+ frases para permitir que o modelo aprenda nuances sutis (como pontuação e negações) sem sofrer com ruído.
  • Data Augmentation: Utilizar bibliotecas de sinonímia para gerar variações sintéticas das frases de "Medo", balanceando as classes.
  • Deep Learning Avançado: Testar arquiteturas baseadas em Transformers (como BERTimbau) para capturar melhor o contexto semântico.

About

Pipeline de NLP end-to-end para classificação binária de sentimentos (Alegria vs. Medo) utilizando Python e spaCy. Inclui experimentos de pré-processamento e análise de métricas.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors