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.
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.
- 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.
- 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
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
Este projeto utiliza o Poetry para gerenciamento. Siga os passos abaixo:
-
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 -
Instale as dependências:
poetry install
-
Ative o ambiente virtual:
source .venv/bin/activateSe estiver no windows:
.\.venv\Scripts\activate
-
Baixe o modelo de língua portuguesa:
poetry run python -m spacy download pt_core_news_Sm
-
Execute o projeto:
code . # ou jupyter notebook
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.
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. |
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:
- Lowercasing: Padronização de todo o texto para minúsculas.
-
Lematização (Lemmatization): Redução das palavras à sua raiz gramatical (ex: "correndo", "correu"
$\rightarrow$ "correr") para agrupar variações semânticas. - Remoção de Stop Words: Eliminação de palavras funcionais comuns (ex: "o", "a", "de", "para") que não carregam carga emocional intrínseca.
- 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").
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.
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%
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.
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.
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.