DISC.ai / app.py
DHEIVER's picture
Update app.py
dadf642 verified
raw
history blame
10.8 kB
import gradio as gr
import plotly.graph_objects as go
from sentence_transformers import SentenceTransformer
import numpy as np
# Initialize the model
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
# Questionário DISC
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")
]
}
]
# Base de conhecimento enriquecida para análise semântica
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]
# Criar embedding do perfil
profile_embedding = model.encode(" ".join(insights))
# Selecionar insights mais relevantes baseado em similaridade
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]
# Gerar insights semânticos
principal_insights = generate_semantic_insights(principal, perfis[principal])
secundario_insights = generate_semantic_insights(secundario, perfis[secundario])
# Criar listas formatadas de insights
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
# [Previous code remains the same until create_interface function]
def create_interface():
"""Cria interface moderna do teste."""
with gr.Blocks() as iface:
gr.Markdown("# 🎯 Análise de Perfil DISC")
# Questões
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}" # Added label for better accessibility
)
radios.append(radio)
# Resultados
plot = gr.Plot()
output = gr.Markdown()
# Botões
analyze_btn = gr.Button("Analisar Perfil")
reset_btn = gr.Button("Novo Teste")
def process_results(*answers):
# Validate if all questions are answered
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]
# Connect the buttons to their respective functions
analyze_btn.click(
fn=process_results,
inputs=radios,
outputs=[plot, output],
api_name="analyze" # Added API name for better tracking
)
reset_btn.click(
fn=reset_form,
inputs=None,
outputs=radios + [plot, output],
api_name="reset" # Added API name for better tracking
)
return iface
if __name__ == "__main__":
iface = create_interface()
iface.launch(show_error=True) # Added show_error for better debugging