---
license: apache-2.0
language:
- pt
base_model:
- Assaoka/Tucano2-qwen-0.5B-ReLiSA
- Assaoka/Tucano2-qwen-0.5B-FinBERT
- Assaoka/Tucano2-qwen-0.5B-Phrasebank
- Assaoka/Tucano2-qwen-0.5B-GoEmotions
pipeline_tag: text-generation
library_name: transformers
tags:
- sentiment-analysis
- slm
- eniac-2026
- knowledge-accumulation
- prior-alignment
datasets:
- brighter-dataset/BRIGHTER-emotion-categories
metrics:
- f1
- accuracy
model-index:
- name: Tucano2-qwen-0.5b-Merge-BRIGHTER
results:
- task:
type: text-generation
name: Sentiment Analysis
dataset:
name: brighter
type: brighter-dataset/BRIGHTER-emotion-categories
split: test
metrics:
- type: f1
value: 0.4335
name: Macro F1
- type: accuracy
value: 0.4946
name: Accuracy
---
# Tucano2-qwen-0.5b-Merge-BRIGHTER (Prior Model)
Este é um modelo especialista em análise de sentimento em língua portuguesa, construído usando a estratégia **Knowledge Accumulation (Prior)**. O modelo foi inicialmente pre-mesclado (*merged*) com outros especialistas usando TIES Merge e, em seguida, sofreu ajuste fino (*fine-tuning*) no conjunto de dados **brighter-dataset/BRIGHTER-emotion-categories**.
Este desenvolvimento faz parte do artigo científico submetido ao **ENIAC 2026**: *"United Experts: Merging Small Language Models for Multi-Domain Sentiment Analysis in Portuguese"*.
## 📌 Detalhes do Modelo
- **Modelos Base (Merge)**:
- `Assaoka/Tucano2-qwen-0.5B-ReLiSA`
- `Assaoka/Tucano2-qwen-0.5B-FinBERT`
- `Assaoka/Tucano2-qwen-0.5B-Phrasebank`
- `Assaoka/Tucano2-qwen-0.5B-GoEmotions`
- **Tarefa**: Detecção de múltiplas emoções simultâneas em língua portuguesa (raiva, nojo, medo, alegria, tristeza, surpresa) após alinhamento sequencial por Knowledge Accumulation (Prior).
- **Domínio**: Língua Portuguesa (PT-BR).
- **Licença**: Apache 2.0.
- **Estratégia**: Alinhamento sequencial via Knowledge Accumulation (Prior + Fine-tuning).
## 📊 Avaliação Completa (In-Domain & Out-Of-Domain)
Métricas padronizadas (Macro F1 · Micro F1 · Accuracy · Hamming Loss) calculadas sobre o conjunto de teste completo de cada domínio. A coluna **Baseline** corresponde ao modelo base `Polygl0t/Tucano2-qwen-0.5B-Instruct` sem fine-tuning.
| Dataset / Tarefa | Métrica | Valor | Baseline |
| :--- | :--- | :---: | :---: |
| **RELI-SA** | Macro F1
Micro F1
Accuracy
Hamming Loss | 43.46%
63.35%
63.35%
0.3665 | 30.66%
37.07%
37.07%
0.6293 |
| **BRIGHTER** | Macro F1
Micro F1
Accuracy
Hamming Loss | 43.35%
60.99%
49.46%
0.1183 | 33.47%
38.07%
24.66%
0.2731 |
| **FINBERT-PT-BR** | Macro F1
Micro F1
Accuracy
Hamming Loss | 71.04%
71.29%
71.29%
0.2871 | 54.77%
66.34%
66.34%
0.3366 |
| **FINANCIAL-PHRASEBANK** | Macro F1
Micro F1
Accuracy
Hamming Loss | 69.41%
75.23%
75.23%
0.2477 | 38.13%
39.32%
39.32%
0.6068 |
| **GO-EMOTIONS** | Macro F1
Micro F1
Accuracy
Hamming Loss | 16.08%
20.53%
13.31%
0.0577 | 7.59%
10.31%
6.08%
0.0720 |
## 🚀 Como utilizar o modelo (vLLM ou Transformers)
O modelo responde a prompts estruturados com instruções do sistema em português. Exemplo real de inferência estruturada:
```python
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "Assaoka/Tucano2-qwen-0.5b-Merge-Brighter"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto")
messages = [
{"role": "system", "content": "Você é um detector de emoções em português. Analise o texto fornecido e retorne a lista de emoções detectadas (pode ser vazia). As opções válidas são: 'raiva', 'nojo', 'medo', 'alegria', 'tristeza', 'surpresa'. Sua tarefa é retornar um JSON válido no seguinte formato: {"emocoes": ["emocao1", "emocao2", ..., "emocaoN"]} baseado na lista de emoções permitidas. Responda APENAS com o JSON válido."},
{"role": "user", "content": "Texto: Fiquei extremamente feliz com a aprovação da minha pesquisa, mas confesso que a ansiedade me deu um pouco de medo."}
]
prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
# Resposta esperada: {"emocoes": ["alegria", "medo"]}
```