|
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"], |
|
'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"]}, |
|
'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"], |
|
'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"]}, |
|
'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"], |
|
'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"]}, |
|
'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"], |
|
'baixo': ["Você demonstra flexibilidade com regras e processos", |
|
"Sua praticidade favorece resultados rápidos", |
|
"Você se adapta bem a ambientes menos estruturados"]} |
|
} |
|
|
|
def get_intensity_level(percentual): |
|
if percentual >= 75: return "muito alto" |
|
elif percentual >= 60: return "alto" |
|
elif percentual >= 40: return "moderado" |
|
elif percentual >= 25: return "baixo" |
|
return "muito baixo" |
|
|
|
def generate_semantic_insights(perfil, percentual): |
|
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]) |
|
return [insights[i] for i in similarities.argsort()[-3:]] |
|
|
|
def calcular_perfil(respostas): |
|
contagem = {k: sum(1 for r in respostas if r and r.startswith(k)) for k in 'DISC'} |
|
total = sum(contagem.values()) |
|
return {k: (v/total)*100 if total > 0 else 0 for k, v in contagem.items()} |
|
|
|
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') |
|
|
|
|
|
|
|
def create_disc_plot(percentuais): |
|
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={ |
|
'text': 'Perfil DISC', |
|
'y':0.95, |
|
'x':0.5, |
|
'xanchor': 'center', |
|
'yanchor': 'top', |
|
'font': {'size': 24, 'color': '#333333'} |
|
}, |
|
yaxis_range=[0, 100], |
|
template='plotly_white', |
|
height=400, |
|
margin=dict(l=40, r=40, t=60, b=40), |
|
paper_bgcolor='rgba(0,0,0,0)', |
|
plot_bgcolor='rgba(0,0,0,0)', |
|
yaxis_title="Percentual (%)", |
|
xaxis_title="Dimensões DISC" |
|
) |
|
|
|
return fig |
|
|
|
def create_interface(): |
|
with gr.Blocks(theme=gr.themes.Soft( |
|
primary_hue="blue", |
|
secondary_hue="purple", |
|
neutral_hue="slate", |
|
font=["Inter", "ui-sans-serif", "system-ui"] |
|
)) as iface: |
|
gr.Markdown( |
|
""" |
|
# 🎯 Análise de Perfil DISC |
|
### Descubra suas características comportamentais dominantes |
|
|
|
Este teste ajuda a identificar seu estilo comportamental baseado na metodologia DISC: |
|
- **D (Dominância)**: Foco em resultados e assertividade |
|
- **I (Influência)**: Foco em relacionamentos e comunicação |
|
- **S (Estabilidade)**: Foco em cooperação e consistência |
|
- **C (Conformidade)**: Foco em qualidade e precisão |
|
""") |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
radios = [] |
|
for i, q in enumerate(DISC_QUESTIONS): |
|
with gr.Box(): |
|
radio = gr.Radio( |
|
choices=[f"{p} - {d}" for p, d in q['opcoes']], |
|
label=f"{i+1}. {q['pergunta']}", |
|
container=True |
|
) |
|
radios.append(radio) |
|
|
|
with gr.Row(): |
|
analyze_btn = gr.Button("📊 Analisar Perfil", size="lg", variant="primary") |
|
reset_btn = gr.Button("🔄 Novo Teste", size="lg", variant="secondary") |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
plot = gr.Plot(label="Gráfico de Perfil DISC") |
|
|
|
with gr.Row(): |
|
output = gr.Markdown() |
|
|
|
def process_results(*answers): |
|
if any(a is None for a in answers): |
|
gr.Warning("Por favor, responda todas as questões antes de prosseguir.") |
|
return None, None |
|
|
|
perfil = calcular_perfil(answers) |
|
plot = create_disc_plot(perfil) |
|
report = gerar_relatorio(perfil) |
|
|
|
return plot, report |
|
|
|
analyze_btn.click( |
|
fn=process_results, |
|
inputs=radios, |
|
outputs=[plot, output], |
|
api_name="analyze" |
|
) |
|
|
|
reset_btn.click( |
|
fn=lambda: [None]*(len(radios)+2), |
|
outputs=radios+[plot, output], |
|
api_name="reset" |
|
) |
|
|
|
|
|
gr.Examples( |
|
examples=[ |
|
["D - Assume a liderança e toma decisões rápidas", |
|
"I - Discute com outros e busca diferentes perspectivas", |
|
"S - Ouvir atentamente e contribuir quando solicitado", |
|
"C - Analisa os impactos antes de aceitar", |
|
"D - Tornar-se mais direto e focado em resultados"] |
|
], |
|
inputs=radios, |
|
outputs=[plot, output], |
|
fn=process_results, |
|
label="Exemplo de Respostas" |
|
) |
|
|
|
return iface |
|
|
|
if __name__ == "__main__": |
|
iface = create_interface() |
|
iface.launch( |
|
share=True, |
|
show_error=True, |
|
server_name="0.0.0.0", |
|
server_port=7860, |
|
) |