| --- |
| language: |
| - pt |
| license: mit |
| tags: |
| - text-classification |
| - sentiment-analysis |
| - portuguese |
| - bert |
| - e-commerce |
| - promotional-periods |
| metrics: |
| - accuracy |
| - f1 |
| base_model: neuralmind/bert-base-portuguese-cased |
| --- |
| |
| # PromoSense — Modelo de Análise de Sentimento (v2) |
|
|
| Modelo de classificação de sentimento em avaliações de e-commerce brasileiro, com foco em períodos promocionais (Double Dates, Black Friday). |
|
|
| Desenvolvido como parte do **Projeto Integrador** do curso de Tecnólogo em Análise e Desenvolvimento de Sistemas — Senac Recife. |
|
|
| --- |
|
|
| ## Uso |
|
|
| ```python |
| from transformers import pipeline |
| |
| clf = pipeline( |
| "text-classification", |
| model="Amand4priscil4/promosense-modelo", |
| truncation=True, |
| max_length=512 |
| ) |
| |
| # Mapeamento de labels |
| LABEL_MAP = { |
| "LABEL_0": "negativo", |
| "LABEL_1": "neutro", |
| "LABEL_2": "positivo" |
| } |
| |
| texto = "Produto chegou antes do prazo, qualidade ótima, super recomendo!" |
| resultado = clf(texto)[0] |
| sentimento = LABEL_MAP[resultado["label"]] |
| print(f"{sentimento} ({resultado['score']:.2%})") |
| # positivo (98.45%) |
| ``` |
|
|
| --- |
|
|
| ## Modelo Base |
|
|
| - **Arquitetura:** BERT |
| - **Base:** `neuralmind/bert-base-portuguese-cased` (BERTimbau) |
| - **Tarefa:** Classificação de sequência (3 classes) |
|
|
| --- |
|
|
| ## Labels |
|
|
| | Label | Sentimento | |
| |---|---| |
| | LABEL_0 | negativo | |
| | LABEL_1 | neutro | |
| | LABEL_2 | positivo | |
| |
| --- |
| |
| ## Dataset de Treinamento |
| |
| - **Fonte:** Olist (avaliações de e-commerce brasileiro) |
| - **Arquivo:** `olist_rotulado_hibrido.csv` |
| - **Total de amostras:** ~35.246 avaliações processadas |
| - **Rotulagem:** Híbrida — nota da estrela + léxico de 150 expressões + conectivos de contraste |
| - **Distribuição após rotulagem híbrida:** neutros expandidos de 3.557 para 5.936 amostras |
| |
| ### Hiperparâmetros de Treinamento |
| |
| | Parâmetro | Valor | |
| |---|---| |
| | Épocas | 3 | |
| | Batch size | 32 | |
| | Learning rate | 2e-5 | |
| | GPU | T4 (Google Colab) | |
| | Framework | PyABSA + HuggingFace Transformers | |
| |
| --- |
| |
| ## Avaliação |
| |
| ### Treino (Olist) |
| |
| | Métrica | Valor | |
| |---|---| |
| | Accuracy | 87.03% | |
| | F1 macro | 79.50% | |
| |
| ### Ground Truth v1 — 110 amostras (Shopee) |
| |
| Produtos: JBL Boombox 4, E6S TWS Bluetooth |
| |
| | Métrica | Valor | |
| |---|---| |
| | **Accuracy** | **90.00%** (99/110) | |
| |
| ### Ground Truth v2 — 165 amostras (Shopee) |
| |
| Produtos: PS4 Slim, E6S TWS Bluetooth, JBL Boombox 4, Cozedor de Ovos 3 Andares, Fone de Ouvido E6S TWS |
| Aspectos avaliados: preço, entrega, qualidade |
| |
| | Métrica | Valor | |
| |---|---| |
| | **Accuracy** | **59.39%** (98/165) | |
| |
| #### Relatório por classe (GT v2) |
| |
| | Classe | Precision | Recall | F1 | Support | |
| |---|---|---|---|---| |
| | positivo | 0.6268 | 0.9889 | 0.7672 | 90 | |
| | neutro | 1.0000 | 0.0154 | 0.0303 | 65 | |
| | negativo | 0.3636 | 0.8000 | 0.5000 | 10 | |
| | macro avg | 0.6635 | 0.6014 | 0.4325 | 165 | |
| |
| #### Matriz de Confusão (GT v2) |
| |
| | | Pred. positivo | Pred. neutro | Pred. negativo | |
| |---|---|---|---| |
| | **Real positivo** | 89 | 0 | 1 | |
| | **Real neutro** | 51 | 1 | 13 | |
| | **Real negativo** | 2 | 0 | 8 | |
| |
| ### Ground Truth Combinado (v1 + v2) |
| |
| | Amostras | Accuracy | |
| |---|---| |
| | 275 | **71.64%** (197/275) | |
| |
| --- |
| |
| ## Limitações Conhecidas |
| |
| - **Neutro subclassificado:** F1 de neutro = 0.03 no GT v2. O modelo tem forte viés para a classe positivo, classificando a maioria dos neutros como positivo (51 de 65 casos). |
| - **Viés positivo:** 86% das predições no GT v2 foram classificadas como positivo. |
| - **Avaliações mistas:** Textos que combinam elogios e críticas (ex: "produto ótimo, mas controle com defeito") tendem a ser classificados como positivo ou negativo, nunca neutro. |
| - **PyABSA incompatível com Python 3.12:** A análise de sentimento por aspecto (ABSA) foi substituída por abordagem híbrida léxico + BERTimbau como fallback. |
| - **Léxico limitado:** Rotulagem baseada em 150 expressões — expansão para 200 prevista no v3. |
| |
| --- |
| |
| ## Trabalho Futuro (v3) |
| |
| - Expandir léxico de 150 para 200 expressões |
| - Retreinar com dataset híbrido atualizado |
| - Melhorar F1 de neutro (meta: > 0.40) |
| - Melhorar detecção de aspecto "entrega" (precision baixa no léxico ABSA) |
| |
| --- |
| |
| ## Equipe |
| |
| | Membro | Papel | |
| |---|---| |
| | Amanda | QA, anotação, modelagem, testes | |
| | Lucas | Backend (FastAPI) e Frontend (dashboard) | |
| | Kellvyn | Léxico (em desenvolvimento) | |
| | Ana Beatriz | Documentação | |
| |
| |
| --- |
| |
| ## Citação |
| |
| ``` |
| @misc{promosense2026, |
| title={PromoSense: Análise de Sentimento em Avaliações de E-commerce Brasileiro em Períodos Promocionais}, |
| author={Amanda and Lucas and Kellvyn and Ana Beatriz}, |
| year={2026}, |
| institution={Senac Pernambuco — Tecnólogo em Análise e Desenvolvimento de Sistemas} |
| } |
| ``` |