DHEIVER's picture
Update app.py
4085804 verified
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()