Spaces:
Sleeping
Sleeping
import gradio as gr | |
from transformers import pipeline | |
import numpy as np | |
from typing import List, Dict | |
class SimpleTemperamentAnalyzer: | |
def __init__(self): | |
# Modelo para análise de sentimentos em português | |
self.model = pipeline( | |
"text-classification", | |
model="neuralmind/bert-base-portuguese-cased", | |
return_all_scores=True | |
) | |
self.temperamentos = { | |
'SANGUÍNEO': ['Alegre', 'Extrovertido', 'Social', 'Otimista', 'Comunicativo'], | |
'COLÉRICO': ['Líder', 'Determinado', 'Prático', 'Produtivo', 'Independente'], | |
'MELANCÓLICO': ['Perfeccionista', 'Detalhista', 'Artístico', 'Sensível', 'Idealista'], | |
'FLEUMÁTICO': ['Calmo', 'Pacífico', 'Objetivo', 'Diplomático', 'Organizado'] | |
} | |
# Descrições para análise do modelo | |
self.descricoes_temperamentos = { | |
'SANGUÍNEO': 'pessoa extrovertida, social, otimista e comunicativa', | |
'COLÉRICO': 'pessoa determinada, prática, líder e independente', | |
'MELANCÓLICO': 'pessoa perfeccionista, sensível, detalhista e artística', | |
'FLEUMÁTICO': 'pessoa calma, pacífica, objetiva e organizada' | |
} | |
def analisar_texto_caracteristicas(self, caracteristicas: List[str]) -> Dict[str, float]: | |
"""Usa o modelo NLP para analisar o texto das características selecionadas""" | |
# Junta as características em um texto para análise | |
texto_analise = " ".join(caracteristicas) | |
# Análise para cada temperamento | |
scores_temp = {} | |
for temp, desc in self.descricoes_temperamentos.items(): | |
# Analisa a similaridade entre as características selecionadas e a descrição do temperamento | |
resultado = self.model(f"Características: {texto_analise}. Descrição: {desc}") | |
scores_temp[temp] = resultado[0][0]['score'] # Pega o score principal | |
return scores_temp | |
def analisar_respostas(self, respostas_marcadas: List[str]) -> Dict[str, float]: | |
"""Combina análise tradicional com NLP para gerar pontuações""" | |
# Pontuações baseadas em contagem | |
pontuacoes_contagem = {} | |
for temp, caracteristicas in self.temperamentos.items(): | |
marcadas = sum(1 for c in caracteristicas if c in respostas_marcadas) | |
pontuacoes_contagem[temp] = marcadas | |
# Pontuações baseadas em NLP | |
pontuacoes_nlp = self.analisar_texto_caracteristicas(respostas_marcadas) | |
# Combina as pontuações (média ponderada) | |
pontuacoes_finais = {} | |
for temp in self.temperamentos: | |
# Peso 0.6 para contagem e 0.4 para NLP | |
pond_contagem = pontuacoes_contagem[temp] * 0.6 | |
pond_nlp = pontuacoes_nlp[temp] * 0.4 | |
pontuacoes_finais[temp] = pond_contagem + pond_nlp | |
# Normaliza para 100% | |
total = sum(pontuacoes_finais.values()) | |
if total > 0: | |
for temp in pontuacoes_finais: | |
pontuacoes_finais[temp] = (pontuacoes_finais[temp] / total) * 100 | |
return pontuacoes_finais | |
def interpretar_combinacao(self, temp_ordenados: List[tuple]) -> str: | |
"""Usa o modelo para interpretar a combinação de temperamentos""" | |
combinacao = f"{temp_ordenados[0][0]} com {temp_ordenados[1][0]}" | |
interpretacao = self.model( | |
f"Combinação de temperamentos: {combinacao}. " | |
f"Características principais: {self.descricoes_temperamentos[temp_ordenados[0][0]]} " | |
f"com aspectos de {self.descricoes_temperamentos[temp_ordenados[1][0]]}" | |
) | |
return interpretacao[0][0]['label'] | |
def gerar_analise(self, temperamento_dominante: str, pontuacoes: Dict[str, float]) -> Dict: | |
"""Gera uma análise detalhada usando o modelo NLP""" | |
descricoes = { | |
'SANGUÍNEO': { | |
'positivo': ['sociabilidade', 'entusiasmo', 'carisma', 'energia positiva', 'facilidade de comunicação'], | |
'desafios': ['tendência à dispersão', 'dificuldade com rotinas', 'pode ser superficial'], | |
'profissional': 'Tende a se destacar em áreas que envolvem interação social, vendas, comunicação e trabalho em equipe.', | |
'relacionamentos': 'Faz amizades facilmente e mantém um círculo social ativo. Precisa desenvolver maior profundidade nas relações.' | |
}, | |
'COLÉRICO': { | |
'positivo': ['liderança', 'determinação', 'praticidade', 'foco em resultados', 'iniciativa'], | |
'desafios': ['impaciência', 'autoritarismo', 'dificuldade em demonstrar empatia'], | |
'profissional': 'Excelente em posições de liderança, gestão de projetos e empreendedorismo.', | |
'relacionamentos': 'Direto e objetivo nas relações, precisa desenvolver mais sensibilidade e paciência.' | |
}, | |
'MELANCÓLICO': { | |
'positivo': ['profundidade analítica', 'criatividade', 'atenção aos detalhes', 'sensibilidade', 'perfeccionismo'], | |
'desafios': ['autocrítica excessiva', 'tendência à introspecção', 'dificuldade com mudanças'], | |
'profissional': 'Se destaca em áreas que exigem análise detalhada, planejamento e criatividade.', | |
'relacionamentos': 'Valoriza relações profundas e significativas, mas pode ter dificuldade em se abrir.' | |
}, | |
'FLEUMÁTICO': { | |
'positivo': ['equilíbrio emocional', 'diplomacia', 'organização', 'confiabilidade', 'paciência'], | |
'desafios': ['passividade', 'resistência a mudanças', 'dificuldade em tomar iniciativa'], | |
'profissional': 'Eficiente em funções que requerem mediação, organização e trabalho metódico.', | |
'relacionamentos': 'Estável e confiável nas relações, mas pode parecer distante ou pouco expressivo.' | |
} | |
} | |
temp_ordenados = sorted(pontuacoes.items(), key=lambda x: x[1], reverse=True) | |
# Usa o modelo para interpretar a combinação | |
interpretacao_combinacao = self.interpretar_combinacao(temp_ordenados) | |
analise = { | |
'perfil_principal': f"Seu perfil predominante é {temperamento_dominante} ({pontuacoes[temperamento_dominante]:.1f}%), ", | |
'combinacao': f"com influências significativas de {' e '.join([f'{temp} ({pont:.1f}%)' for temp, pont in temp_ordenados[1:3]])}.", | |
'interpretacao': interpretacao_combinacao, | |
'caracteristicas': [], | |
'areas_desenvolvimento': [], | |
'perfil_profissional': "", | |
'relacionamentos': "" | |
} | |
# Análise das características principais usando o modelo | |
for temp, pont in temp_ordenados[:2]: | |
if pont > 20: | |
caract_temp = " ".join(descricoes[temp]['positivo']) | |
analise_caract = self.model(f"Características principais: {caract_temp}") | |
analise['caracteristicas'].extend(descricoes[temp]['positivo'][:3]) | |
analise['areas_desenvolvimento'].extend(descricoes[temp]['desafios'][:2]) | |
analise['perfil_profissional'] += descricoes[temp]['profissional'] + " " | |
analise['relacionamentos'] += descricoes[temp]['relacionamentos'] + " " | |
return analise | |
def criar_interface(): | |
analisador = SimpleTemperamentAnalyzer() | |
def validar_selecao(selecoes): | |
if len(selecoes) > 5: | |
# Retorna apenas as primeiras 5 seleções | |
return selecoes[:5], "Por favor, selecione apenas 5 características." | |
return selecoes, "" if selecoes else "Selecione até 5 características que mais combinam com você." | |
def processar_selecao(selecoes): | |
selecoes_validadas, mensagem = validar_selecao(selecoes) | |
if mensagem and "apenas" in mensagem: # Se excedeu o limite | |
return f"⚠️ {mensagem}\n\nPor favor, desmarque algumas opções para continuar." | |
if not selecoes_validadas: | |
return "Selecione algumas características para realizar a análise." | |
pontuacoes = analisador.analisar_respostas(selecoes_validadas) | |
temperamento_dominante = max(pontuacoes.items(), key=lambda x: x[1])[0] | |
analise = analisador.gerar_analise(temperamento_dominante, pontuacoes) | |
resultado = "### Resultados da Análise de Temperamento\n\n" | |
resultado += "**Características Selecionadas:**\n" | |
for caract in selecoes_validadas: | |
resultado += f"- {caract}\n" | |
resultado += "\n**Pontuações:**\n" | |
for temp, pont in pontuacoes.items(): | |
resultado += f"- {temp}: {pont:.1f}%\n" | |
resultado += f"\n**Análise Detalhada:**\n" | |
resultado += f"{analise['perfil_principal']}{analise['combinacao']}\n" | |
resultado += f"**Interpretação:** {analise['interpretacao']}\n\n" | |
resultado += "**Principais Características:**\n" | |
for caract in analise['caracteristicas']: | |
resultado += f"- {caract}\n" | |
resultado += "\n**Áreas para Desenvolvimento:**\n" | |
for area in analise['areas_desenvolvimento']: | |
resultado += f"- {area}\n" | |
resultado += f"\n**Perfil Profissional:**\n{analise['perfil_profissional']}\n\n" | |
resultado += f"**Relacionamentos:**\n{analise['relacionamentos']}\n" | |
return resultado | |
with gr.Blocks(theme=gr.themes.Soft()) as interface: | |
gr.Markdown("## Análise de Temperamento Simplificada") | |
gr.Markdown("### Selecione exatamente 5 características que mais combinam com você") | |
todas_caracteristicas = [] | |
for temp, caract in analisador.temperamentos.items(): | |
todas_caracteristicas.extend(caract) | |
selecoes = gr.CheckboxGroup( | |
choices=todas_caracteristicas, | |
label="Escolha 5 características:", | |
info="Limite: 5 características" | |
) | |
btn = gr.Button("Analisar") | |
saida = gr.Markdown() | |
# Atualiza em tempo real para validar seleções | |
selecoes.change( | |
fn=validar_selecao, | |
inputs=selecoes, | |
outputs=[selecoes, saida] | |
) | |
# Processa a análise quando o botão é clicado | |
btn.click( | |
fn=processar_selecao, | |
inputs=selecoes, | |
outputs=saida | |
) | |
return interface | |
if __name__ == "__main__": | |
interface = criar_interface() | |
interface.launch() |