Reenquadramento positivo em português com PTT5
A ausência de um recurso equivalente em português para reenquadramento positivo controlado motivou este projeto. Traduzi e adaptei dados de terceiros, ajustei um PTT5 e publiquei checkpoint, dataset, notebook e interface Gradio. A contribuição é permitir que uma frase e estratégias explícitas orientem uma formulação mais construtiva, sem que isso garanta a preservação do sentido [3, 4, 5, 6].
O repositório GitHub de apoio é DominguesM/positive-reframing-ptbr; nele o README fica como WIP e registra basicamente a estrutura do projeto, não os detalhes completos do fluxo original. Para a parte técnica do fluxo de treino e dados, sigo usando o que está no dataset, no modelo e no notebook já citados [3, 4, 5, 6].
Essa definição vem do artigo Inducing Positive Perspectives with Text Reframing, premiado como Outstanding Paper na ACL 2022. O trabalho contrasta reenquadramento com transferência de sentimento: transformar “o prato estava sem graça” em “o prato estava delicioso” muda uma condição de verdade; dizer “já preparei pratos muito mais saborosos” mantém implícita a insatisfação e desloca o foco. Preservar sentido enquanto se introduz conteúdo novo torna a tarefa mais difícil que parafrasear ou inverter polaridade [1].
Sejam s o texto-fonte, Ψ o conjunto de estratégias e t o reenquadramento. Implementei a geração controlada:
A restrição à direita expressa a intenção, não uma garantia do checkpoint: a saída não deveria implicar a negação da fonte. O artigo original encontrou contradições, autocontradições e alucinações até no melhor baseline; eu ainda não publiquei uma avaliação que demonstre ter resolvido esses problemas na versão PT-BR [1, 3, 5].
Renderizando diagrama...
As seis estratégias
Os rótulos são multilabel: um exemplo pode combinar várias estratégias. A taxonomia e as definições abaixo são as do artigo e dos cards, não diagnósticos psicológicos [1, 3].
| Rótulo de controle | Interpretação operacional | Exemplo ilustrativo |
|---|---|---|
growth | Tratar desafio ou revés como oportunidade específica de aprender, melhorar ou agir. | “Não consigo organizar meu tempo” → “Posso aprender a planejar uma tarefa por vez.” |
impermanence | Marcar a dificuldade como finita, passível de melhora ou compartilhada por outras pessoas. | “Esta semana não termina” → “Faltam poucos dias; esta fase vai passar.” |
neutralizing | Substituir formulações carregadas por termos neutros sem inventar um resultado favorável. | “Foi um dia terrível” → “Foi um dia longo.” |
optimism | Mudar a ênfase para aspectos favoráveis da situação ou para uma expectativa positiva, sem apagar o problema. | “A semana foi exaustiva” → “A semana foi longa; agora posso descansar.” |
self_affirmation | Recuperar forças, valores ou qualidades já atribuíveis à pessoa, como coragem e perseverança. | “Não vou aguentar” → “Estou sobrecarregado, mas já demonstrei perseverança.” |
thankfulness | Expressar gratidão por algo sustentado pelo contexto. | “Minha mãe liga quando estou mal” → “Sou grato por ela estar presente.” |
As fronteiras não são rígidas. “Isso vai passar” é impermanência; “eu consigo atravessar isso” pode ser autoafirmação; uma frase com ambas deve carregar os dois rótulos. Neutralizing também não é eufemismo irrestrito: trocar “estou com dor” por “estou ótimo” seria contradição, não neutralização. O corpus inglês contém 12.755 marcações para 8.349 pares; por isso, o número de rótulos excede o de exemplos [1].
Do corpus inglês à versão PT-BR
O Positive Psychology Frames original partiu de mais de um milhão de tweets com #stressed, publicados entre 2012 e 2021. Foram excluídos respostas, retweets, textos com menos de 30 caracteres, URLs, textos avaliados como positivos pelo TextBlob e itens marcados como ofensivos com confiança superior a 80% pelo HateSonar. Trabalhadores treinados produziram reenquadramentos, escolheram livremente uma ou mais estratégias e avaliaram positividade. Após controle de qualidade, restaram 8.349 pares. A fonte curta e informal favorece enunciados atômicos, mas concentra o domínio em usuários do Twitter que escreveram uma hashtag específica [1, 7].
Traduzi esse corpus para português brasileiro, mas não registrei sistema ou equipe de tradução, revisão humana, critérios de localização, preservação de sentido, concordância entre avaliadores, semente, deduplicação pós-tradução ou controle de qualidade linguística [4]. Também preservei referências como SAT, GCSE, pesos em libras, Gloucester, marcas e hashtags inglesas, além de construções pouco naturais e trechos truncados. Por isso, apresento o resultado como tradução de um contexto anglófono, não como coleta representativa do português brasileiro nem como adaptação cultural concluída.
Na próxima versão, pretendo conduzir uma adaptação cultural com tradutores PT-BR reexpressando gírias e instituições sem alterar fatos, revisores bilíngues verificando fonte e alvo e anotadores brasileiros marcando estratégia, naturalidade e adequação. Também pretendo adjudicar desacordos, revisar exemplos médicos, autolesivos, discriminatórios ou que normalizam álcool e automedicação e publicar instruções, taxas de concordância, decisões de localização e versões antes/depois. Esse é meu protocolo proposto, não uma etapa já executada no dataset atual.
Estrutura e serialização
Publiquei quatro strings por linha no Hub [4]:
original_text: Tenho tanta coisa para fazer antes de domingo.
reframed_text: Tenho muitas coisas a realizar e oportunidades pela frente.
strategy: ['thankfulness', 'optimism']
strategy_original_text: ['thankfulness', 'optimism']: Tenho tanta coisa para fazer antes de domingo.Usei strategy_original_text como entrada e reframed_text como alvo [5]. Colchetes, aspas simples, vírgula, ordem dos rótulos e dois-pontos fazem parte do texto de controle, não são metadados separados. Organizei os splits assim:
ou aproximadamente 80,0%, 10,0% e 10,0%. Cada split preserva as quatro colunas. Não defini uma licença para a tradução no card do dataset; o repositório original declara CC BY-SA 4.0 e publiquei o modelo sob CC BY 4.0. Antes de redistribuição ou uso comercial, é necessário verificar separadamente essa cadeia de direitos [3, 4, 7].
PTT5 e treinamento seq2seq documentado
Usei unicamp-dl/ptt5-base-portuguese-vocab como ponto de partida. PT-T5 e PTT5 designam aqui a família publicada como Portuguese T5 (aka PTT5). Ela continua o pré-treinamento da arquitetura T5 no corpus brWaC e oferece versões de 60 milhões, 220 milhões e 740 milhões de parâmetros, com vocabulário T5 ou vocabulário treinado em português. Escolhi a versão Base, com cerca de 220 milhões de parâmetros e vocabulário português [2]. O checkpoint final tem T5ForConditionalGeneration, 12 camadas de encoder, 12 de decoder, dimensão 768, 12 cabeças, camada feed-forward 3.072, vocabulário 32.128 e 222.903.552 parâmetros float32 [3].
No ajuste supervisionado, tokenizei e trunquei entrada e alvo em 1.024 tokens. Usei DataCollatorForSeq2Seq para padding dinâmico e ajustei todos os pesos por teacher forcing. Para alvo tokenizado , a perda é a entropia cruzada autoregressiva média:
Treinei em uma A100 de 40 GB com fp16=True, taxa de aprendizado 1e-4, decaimento de peso 0,01, lote 32 por dispositivo, acumulação por 2 passos, lote de avaliação 48, 30 épocas e checkpoints a cada 500 passos. O lote efetivo nominal foi 32 × 2 = 64; preservei 3.120 atualizações e 200.370 apresentações de exemplos (6.679 × 30). A execução durou 963,5 segundos e terminou com perda média de treino 1,924 [5].
Embora eu tivesse um split dev, passei tokenized_ds["test"] como eval_dataset. Esse mesmo conjunto orientou load_best_model_at_end, portanto usei o teste na escolha do checkpoint. O menor valor foi eval_loss = 2,3935 no passo 1.000, recarregado ao final. Assim, esse número não é uma estimativa independente de generalização; deixei o split de desenvolvimento fora do Trainer. Também não publiquei ROUGE, BLEU, avaliação humana, múltiplas sementes, comparação PT-BR, semente do treino ou detalhes suficientes do processo de tradução. Por isso, não atribuo ao checkpoint os resultados do paper inglês, que treinou outros modelos e usou decodificação gulosa [1, 5].
Renderizando diagrama...
Inferência reproduzível
Na implementação abaixo, uso a classe compatível que publiquei e torno a decodificação explícita. do_sample=False e num_beams=1 selecionam geração gulosa; isso evita que padrões de uma versão da biblioteca sejam confundidos com uma escolha documentada do treino.
import torch
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
MODEL_ID = "dominguesm/positive-reframing-ptbr"
ALLOWED = {
"growth",
"impermanence",
"neutralizing",
"optimism",
"self_affirmation",
"thankfulness",
}
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForSeq2SeqLM.from_pretrained(
MODEL_ID,
use_safetensors=True,
).eval()
def reframe(text: str, strategies: list[str]) -> str:
if not strategies or any(item not in ALLOWED for item in strategies):
raise ValueError("Informe uma ou mais estratégias válidas.")
serialized = f"{strategies!r}: {text.strip()}"
inputs = tokenizer(
serialized,
return_tensors="pt",
max_length=1024,
truncation=True,
)
with torch.inference_mode():
output = model.generate(
**inputs,
max_new_tokens=128,
do_sample=False,
num_beams=1,
)
return tokenizer.decode(output[0], skip_special_tokens=True)
print(reframe(
"Tenho muitas tarefas e não sei por onde começar.",
["growth", "neutralizing"],
))Nos exemplos que publiquei, usei a pipeline("summarization"), embora semanticamente seja uma tarefa text2text-generation; ambas carregam T5ForConditionalGeneration, mas o acesso direto deixa tokenização e geração visíveis [3, 5]. max_length=1024 no exemplo antigo limita o comprimento total gerado e não significa que toda resposta deva ter 1.024 tokens. No código acima, max_new_tokens=128 limita somente novos tokens. Ajustar beam search, amostragem ou penalidades muda a distribuição das saídas e exige nova avaliação.
O Space como interface do projeto
Criei o Space abaixo como interface exploratória do projeto. Nele, carrego o mesmo modelo, ofereço um botão de rádio com as seis estratégias, gero até 128 tokens e apresento tanto a resposta quanto um diff por caracteres com difflib.Differ [6]. Se estiver adormecido por inatividade, abra o Space em uma nova aba para reiniciá-lo.
Criei a interface para exploração, não para medir qualidade. O verde/vermelho do diff mostra alterações superficiais, não implicação semântica ou correção. No Space, aceitei uma única estratégia e serializei "[growth]: texto", sem aspas, enquanto no treino, no card e no dataset usei "['growth']: texto"; essa divergência pode afetar o controle. Para experimentos comparáveis, use a serialização do corpus, registre a versão do modelo e guarde estratégia, parâmetros e saída. Textos inseridos na interface são processados na infraestrutura do Space; não envie prontuários, segredos ou dados pessoais sem uma política apropriada.
Proposta de avaliação em português
Perda de validação mede previsão do próximo token, não se a saída é verdadeira, adequada e útil. Em uma próxima avaliação, pretendo reservar o test somente para o relatório final, usar dev para checkpoint e parâmetros, deduplicar fontes entre splits e comparar pelo menos: cópia da entrada, PTT5 sem ajuste, checkpoint atual e uma versão revisada culturalmente.
- Preservação semântica. Três avaliadores PT-BR pontuariam de 1 a 5 quanto os fatos centrais foram mantidos e marcariam contradição, omissão crítica, autocontradição e alucinação. BERTScore com referências pode complementar, mas sobreposição lexical não basta. Um modelo NLI em português deve calcular contradição nas duas direções; “neutro” não é automaticamente erro, pois o reenquadramento introduz uma perspectiva nova. Um portão conservador seria:
onde C é contradição e deve ser calibrado em pares anotados por humanos, não escolhido arbitrariamente.
-
Aderência à estratégia. Avaliadores marcariam quais das seis estratégias aparecem, sem ver o controle solicitado. Reporte precisão, recall e F1 por rótulo, macro-F1 e resultados para combinações. Para estratégia , ; a macro média é . Isso evita que
optimism, frequente no original, esconda limitações observadas emself_affirmation[1]. Um classificador multilabel pode acelerar triagem, mas precisa ser validado em PT-BR. -
Qualidade e segurança. Meça fluência, naturalidade brasileira, mudança de positividade e “genuinidade”: alguém naquela situação diria isso? Separe uma rubrica de segurança para conselho médico inventado, culpabilização, incentivo a substâncias, minimização de abuso, luto, crise ou risco material. Resultados devem ser estratificados por estratégia, comprimento, qualidade da tradução, tema e marcadores culturais, com intervalos de confiança e análise de desacordo.
Não convém reduzir tudo a uma média. Uma frase muito positiva que contradiz a fonte deve falhar no portão semântico; uma frase fiel mas clínica ou socialmente perigosa deve falhar no portão de segurança. O artigo original combinou BLEU, ROUGE, BERTScore, variação de TextBlob e avaliação humana de sentido, positividade e fluência, e sua análise manual encontrou 26% de mudanças insubstanciais, 9% de contradições da premissa, 6% de autocontradições e 2% de alucinações no melhor BART controlado. Esses números pertencem ao baseline inglês, não ao PTT5, mas justificam as categorias de teste [1].
Positividade tóxica e limites clínicos
Positividade tóxica ocorre quando a pressão para produzir um lado bom invalida tristeza, medo, raiva, luto ou uma ameaça real. “Sua perda vai torná-lo mais forte”, “agradeça por estar vivo” ou “tenha certeza de que o exame médico dará certo” podem soar positivos e ainda ser falsos, cruéis ou perigosos. O próprio corpus inclui saúde, peso, pânico, álcool e automedicação; exemplos públicos mostram traduções e reenquadramentos que normalizam substâncias ou inferem melhora clínica sem base [4]. A estratégia solicitada nunca deve superar os fatos nem o direito de não reenquadrar.
Não avaliei o modelo como psicoterapia, intervenção clínica, detector de crise ou dispositivo médico. Ele não conhece histórico, diagnóstico, risco, relações de poder ou contexto cultural da pessoa e não deve responder autonomamente a ideação suicida, autolesão, abuso, emergência médica ou violência. Nesses casos, considero necessário que uma aplicação interrompa a geração, preserve a fala original, ofereça encaminhamento humano e siga um protocolo local elaborado por profissionais. Mesmo fora de crise, pretendo que a interface apresente a saída como rascunho opcional, permita rejeição e edição e nunca atribua ao usuário uma força, gratidão ou esperança que ele não expressou.
Em assistentes e ferramentas de escrita, a implantação responsável exige consentimento, revisão humana, conservação do original, aviso de limitações, minimização de dados e testes no domínio real. Uma resposta segura pode ser validar primeiro (“isso parece realmente difícil”) e somente então oferecer, com permissão, uma alternativa. Demonstrei geração controlável em português; esse resultado não me permite concluir benefício psicológico e não substitui escuta, cuidado profissional ou ação sobre o problema concreto.
Conclusão
Com a tradução dos dados, o ajuste do PTT5 e a interface, produzi um primeiro artefato controlável de reenquadramento positivo em português. Apresento o resultado como experimento, não como intervenção clínica; meu principal aprendizado foi avaliar conjuntamente fidelidade, estratégia, contexto cultural e segurança humana.
Referências
- Ziems, C.; Li, M.; Zhang, A.; Yang, D. Inducing Positive Perspectives with Text Reframing. ACL 2022, p. 3682–3700. ACL Anthology, DOI.
- Carmo, D.; Piau, M.; Campiotti, I.; Nogueira, R.; Lotufo, R. PTT5: Pretraining and validating the T5 model on Brazilian Portuguese data. 2020. arXiv, modelo Base.
- Domingues, M. positive-reframing-ptbr: model card e configuração. Hugging Face, 2022. Modelo e arquivos.
- Domingues, M. positive-reframing-ptbr-dataset: dataset card, esquema e Parquets. Hugging Face, 2022. Dataset.
- Domingues, M. Train Model (T5): notebook de treinamento. GitHub, 2022. Notebook.
- Domingues, M. Positive Reframing PTBR Space:
app.pye configuração Gradio. Hugging Face Spaces, 2022. Interface, código-fonte. - SALT-NLP. Positive Psychology Frames: dados e código do artigo. GitHub. Repositório.
- Domingues, M. Repositório
DominguesM/positive-reframing-ptbr. GitHub, 2022. README WIP.
BibTeX
@inproceedings{ziems-etal-2022-inducing,
title = {Inducing Positive Perspectives with Text Reframing},
author = {Ziems, Caleb and Li, Minzhi and Zhang, Anthony and Yang, Diyi},
booktitle = {Proceedings of the 60th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)},
pages = {3682--3700},
year = {2022},
publisher = {Association for Computational Linguistics},
doi = {10.18653/v1/2022.acl-long.257},
url = {https://aclanthology.org/2022.acl-long.257/}
}
@article{carmo2020ptt5,
title = {{PTT5}: Pretraining and validating the {T5} model on {Brazilian Portuguese} data},
author = {Carmo, Diedre and Piau, Marcos and Campiotti, Israel and Nogueira, Rodrigo and Lotufo, Roberto},
journal = {arXiv preprint arXiv:2008.09144},
year = {2020},
doi = {10.48550/arXiv.2008.09144}
}
@misc{domingues2022positivereframingptbr,
author = {Domingues, Maicon},
title = {Positive Reframing PT-BR},
year = {2022},
howpublished = {Hugging Face},
url = {https://huggingface.co/dominguesm/positive-reframing-ptbr}
}