|
import gradio as gr |
|
import plotly.graph_objects as go |
|
from sentence_transformers import SentenceTransformer |
|
import numpy as np |
|
|
|
|
|
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2') |
|
|
|
|
|
DISC_QUESTIONS = [ |
|
{ |
|
"pergunta": "Em situações de trabalho em equipe, você geralmente:", |
|
"opcoes": [ |
|
("D", "Assume a liderança e toma decisões rápidas"), |
|
("I", "Motiva o grupo e mantém o ambiente animado"), |
|
("S", "Apoia os colegas e mantém a harmonia"), |
|
("C", "Analisa detalhadamente antes de agir") |
|
] |
|
}, |
|
{ |
|
"pergunta": "Quando enfrenta um desafio no trabalho, você:", |
|
"opcoes": [ |
|
("D", "Enfrenta diretamente e busca soluções imediatas"), |
|
("I", "Discute com outros e busca diferentes perspectivas"), |
|
("S", "Mantém a calma e segue um processo estabelecido"), |
|
("C", "Pesquisa todas as informações disponíveis primeiro") |
|
] |
|
}, |
|
{ |
|
"pergunta": "Em reuniões profissionais, você costuma:", |
|
"opcoes": [ |
|
("D", "Ir direto ao ponto e focar em resultados"), |
|
("I", "Participar ativamente e compartilhar ideias"), |
|
("S", "Ouvir atentamente e contribuir quando solicitado"), |
|
("C", "Tomar notas e questionar os detalhes") |
|
] |
|
}, |
|
{ |
|
"pergunta": "Ao lidar com mudanças no ambiente de trabalho, você:", |
|
"opcoes": [ |
|
("D", "Abraça a mudança e lidera a implementação"), |
|
("I", "Entusiasma os outros sobre as novas possibilidades"), |
|
("S", "Adapta-se gradualmente seguindo o processo"), |
|
("C", "Analisa os impactos antes de aceitar") |
|
] |
|
}, |
|
{ |
|
"pergunta": "Sob pressão no trabalho, você tende a:", |
|
"opcoes": [ |
|
("D", "Tornar-se mais direto e focado em resultados"), |
|
("I", "Buscar apoio e interação com a equipe"), |
|
("S", "Manter a calma e seguir metodicamente"), |
|
("C", "Concentrar-se em detalhes e procedimentos") |
|
] |
|
} |
|
] |
|
|
|
|
|
DISC_INSIGHTS = { |
|
'D': { |
|
'alto': [ |
|
"Você demonstra forte capacidade de liderança e tomada de decisão", |
|
"Sua orientação para resultados é uma característica marcante", |
|
"Você tende a enfrentar desafios de forma direta e decisiva", |
|
"Sua assertividade pode ser um grande diferencial em momentos críticos", |
|
"Você naturalmente assume o controle em situações desafiadoras" |
|
], |
|
'baixo': [ |
|
"Você prefere uma abordagem mais colaborativa e consensual", |
|
"Sua tendência é buscar harmonia nas relações profissionais", |
|
"Você demonstra cuidado ao tomar decisões importantes", |
|
"Sua abordagem mais ponderada favorece o trabalho em equipe", |
|
"Você valoriza a construção de consenso nas decisões" |
|
] |
|
}, |
|
'I': { |
|
'alto': [ |
|
"Seu entusiasmo e otimismo são características marcantes", |
|
"Você tem grande habilidade para inspirar e motivar pessoas", |
|
"Sua comunicação expressiva é um diferencial importante", |
|
"Você naturalmente cria conexões positivas com as pessoas", |
|
"Sua criatividade se destaca em situações sociais" |
|
], |
|
'baixo': [ |
|
"Você prefere uma comunicação mais objetiva e focada", |
|
"Sua abordagem analítica favorece resultados concretos", |
|
"Você valoriza dados e fatos em suas interações", |
|
"Sua comunicação tende a ser mais formal e estruturada", |
|
"Você prioriza eficiência sobre interações sociais" |
|
] |
|
}, |
|
'S': { |
|
'alto': [ |
|
"Sua consistência e confiabilidade são pontos fortes", |
|
"Você demonstra grande habilidade para trabalho em equipe", |
|
"Sua paciência e capacidade de escuta são diferenciais", |
|
"Você contribui para a estabilidade do ambiente", |
|
"Sua lealdade é uma característica muito valorizada" |
|
], |
|
'baixo': [ |
|
"Você se adapta facilmente a mudanças e novos cenários", |
|
"Sua flexibilidade é um ponto forte em ambientes dinâmicos", |
|
"Você lida bem com múltiplas tarefas simultâneas", |
|
"Sua versatilidade permite rápidas adaptações", |
|
"Você aprecia variedade e novos desafios" |
|
] |
|
}, |
|
'C': { |
|
'alto': [ |
|
"Sua precisão e atenção aos detalhes são notáveis", |
|
"Você tem forte capacidade analítica e organizacional", |
|
"Sua busca por qualidade é uma característica marcante", |
|
"Você valoriza processos bem estruturados", |
|
"Sua abordagem sistemática garante resultados consistentes" |
|
], |
|
'baixo': [ |
|
"Você demonstra flexibilidade com regras e processos", |
|
"Sua praticidade favorece resultados rápidos", |
|
"Você se adapta bem a ambientes menos estruturados", |
|
"Sua tolerância à ambiguidade é um diferencial", |
|
"Você equilibra qualidade com agilidade" |
|
] |
|
} |
|
} |
|
|
|
def get_intensity_level(percentual): |
|
"""Determina o nível de intensidade baseado no percentual.""" |
|
if percentual >= 75: |
|
return "muito alto" |
|
elif percentual >= 60: |
|
return "alto" |
|
elif percentual >= 40: |
|
return "moderado" |
|
elif percentual >= 25: |
|
return "baixo" |
|
else: |
|
return "muito baixo" |
|
|
|
def generate_semantic_insights(perfil, percentual): |
|
"""Gera insights baseados em análise semântica.""" |
|
nivel = "alto" if percentual >= 50 else "baixo" |
|
insights = DISC_INSIGHTS[perfil][nivel] |
|
|
|
|
|
profile_embedding = model.encode(" ".join(insights)) |
|
|
|
|
|
similarities = np.array([np.dot(profile_embedding, model.encode(insight)) |
|
for insight in insights]) |
|
top_insights = [insights[i] for i in similarities.argsort()[-3:]] |
|
|
|
return top_insights |
|
|
|
def calcular_perfil(respostas): |
|
"""Calcula os percentuais de cada perfil DISC.""" |
|
contagem = {'D': 0, 'I': 0, 'S': 0, 'C': 0} |
|
|
|
for resposta in respostas: |
|
if resposta: |
|
perfil = resposta.split()[0] |
|
contagem[perfil] += 1 |
|
|
|
total = sum(contagem.values()) |
|
if total > 0: |
|
percentuais = {k: (v/total) * 100 for k, v in contagem.items()} |
|
else: |
|
percentuais = {k: 0 for k in contagem.keys()} |
|
|
|
return percentuais |
|
|
|
def create_disc_plot(percentuais): |
|
"""Cria visualização do perfil DISC.""" |
|
cores = {'D': '#FF4B4B', 'I': '#FFD700', 'S': '#4CAF50', 'C': '#2196F3'} |
|
|
|
fig = go.Figure(data=[ |
|
go.Bar( |
|
x=list(percentuais.keys()), |
|
y=list(percentuais.values()), |
|
marker_color=[cores[k] for k in percentuais.keys()], |
|
text=[f'{v:.1f}%' for v in percentuais.values()], |
|
textposition='auto', |
|
) |
|
]) |
|
|
|
fig.update_layout( |
|
title='Perfil DISC', |
|
yaxis_range=[0, 100], |
|
template='plotly_white', |
|
height=400 |
|
) |
|
return fig |
|
|
|
def gerar_relatorio(percentuais): |
|
"""Gera relatório detalhado com insights baseados em NLP.""" |
|
perfis = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True)) |
|
principal = list(perfis.keys())[0] |
|
secundario = list(perfis.keys())[1] |
|
|
|
|
|
principal_insights = generate_semantic_insights(principal, perfis[principal]) |
|
secundario_insights = generate_semantic_insights(secundario, perfis[secundario]) |
|
|
|
|
|
insights_principais = "\n".join([f"• {insight}" for insight in principal_insights]) |
|
insights_secundarios = "\n".join([f"• {insight}" for insight in secundario_insights]) |
|
|
|
report = f"""# Análise de Perfil DISC |
|
|
|
## Visão Geral |
|
Seu perfil principal é {principal} com {perfis[principal]:.1f}% (nível {get_intensity_level(perfis[principal])}) |
|
Perfil secundário: {secundario} com {perfis[secundario]:.1f}% (nível {get_intensity_level(perfis[secundario])}) |
|
|
|
## Insights Principais |
|
{insights_principais} |
|
|
|
## Influências Secundárias |
|
{insights_secundarios} |
|
|
|
## Distribuição DISC Completa: |
|
{', '.join([f'{k}: {v:.1f}%' for k, v in perfis.items()])} |
|
|
|
## Observação |
|
Este perfil representa suas tendências comportamentais naturais. |
|
Os comportamentos podem ser adaptados conforme o contexto e as necessidades específicas.""" |
|
|
|
return report |
|
|
|
import gradio as gr |
|
import plotly.graph_objects as go |
|
from sentence_transformers import SentenceTransformer |
|
import numpy as np |
|
|
|
|
|
|
|
def create_interface(): |
|
"""Cria interface moderna do teste.""" |
|
with gr.Blocks() as iface: |
|
gr.Markdown("# 🎯 Análise de Perfil DISC") |
|
|
|
|
|
radios = [] |
|
for i, q in enumerate(DISC_QUESTIONS, 1): |
|
gr.Markdown(f"### {i}. {q['pergunta']}") |
|
radio = gr.Radio( |
|
choices=[f"{p} - {d}" for p, d in q['opcoes']], |
|
label=f"Questão {i}" |
|
) |
|
radios.append(radio) |
|
|
|
|
|
plot = gr.Plot() |
|
output = gr.Markdown() |
|
|
|
|
|
analyze_btn = gr.Button("Analisar Perfil") |
|
reset_btn = gr.Button("Novo Teste") |
|
|
|
def process_results(*answers): |
|
|
|
if any(answer is None for answer in answers): |
|
return None, "Por favor, responda todas as questões antes de analisar." |
|
|
|
perc = calcular_perfil(answers) |
|
return create_disc_plot(perc), gerar_relatorio(perc) |
|
|
|
def reset_form(): |
|
return [None] * len(radios) + [None, None] |
|
|
|
|
|
analyze_btn.click( |
|
fn=process_results, |
|
inputs=radios, |
|
outputs=[plot, output], |
|
api_name="analyze" |
|
) |
|
|
|
reset_btn.click( |
|
fn=reset_form, |
|
inputs=None, |
|
outputs=radios + [plot, output], |
|
api_name="reset" |
|
) |
|
|
|
return iface |
|
|
|
if __name__ == "__main__": |
|
iface = create_interface() |
|
iface.launch(show_error=True) |