DISC.ai / app.py
DHEIVER's picture
Update app.py
ea388f3 verified
raw
history blame
11.7 kB
import gradio as gr
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# Initialize model
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
# Enhanced knowledge base with more detailed descriptions and combinations
DISC_PROFILES = {
'D': {
'nome': 'Dominância',
'caracteristicas': {
'alto': [
"Focado em resultados e ação imediata",
"Direto e assertivo na comunicação",
"Competitivo e determinado",
"Assume naturalmente posições de liderança",
"Orientado para desafios e conquistas"
],
'baixo': [
"Mais colaborativo e menos confrontador",
"Prefere ambientes harmoniosos",
"Tende a evitar conflitos",
"Mais cauteloso na tomada de decisões",
"Busca consenso em vez de imposição"
]
},
'ambiente_ideal': {
'alto': [
"Ambientes competitivos",
"Situações que exigem decisões rápidas",
"Projetos desafiadores",
"Autonomia na execução",
"Oportunidades de liderança"
],
'baixo': [
"Ambientes colaborativos",
"Trabalho em equipe",
"Projetos estruturados",
"Suporte de liderança",
"Foco em cooperação"
]
},
'recomendacoes': {
'alto': [
"Desenvolver mais empatia e paciência",
"Praticar escuta ativa",
"Considerar diferentes perspectivas",
"Equilibrar assertividade com diplomacia",
"Fortalecer habilidades de trabalho em equipe"
],
'baixo': [
"Desenvolver mais assertividade",
"Praticar tomada de decisão",
"Expressar opiniões com mais confiança",
"Assumir mais riscos calculados",
"Fortalecer liderança situacional"
]
}
},
'I': {
'nome': 'Influência',
'caracteristicas': {
'alto': [
"Comunicativo e expressivo",
"Entusiasta e otimista",
"Sociável e carismático",
"Persuasivo e inspirador",
"Criativo e inovador"
],
'baixo': [
"Mais reservado e analítico",
"Prefere comunicação objetiva",
"Foco em fatos e dados",
"Mais formal nas relações",
"Prioriza resultados sobre relacionamentos"
]
},
'ambiente_ideal': {
'alto': [
"Ambientes sociais e dinâmicos",
"Oportunidades de networking",
"Trabalho com pessoas",
"Reconhecimento público",
"Liberdade criativa"
],
'baixo': [
"Ambientes mais formais",
"Trabalho individual",
"Projetos técnicos",
"Foco em processos",
"Estrutura definida"
]
},
'recomendacoes': {
'alto': [
"Desenvolver foco e organização",
"Melhorar gestão do tempo",
"Praticar conclusão de tarefas",
"Equilibrar socialização e produtividade",
"Fortalecer análise de dados"
],
'baixo': [
"Desenvolver habilidades de networking",
"Praticar comunicação expressiva",
"Participar mais em grupos",
"Explorar criatividade",
"Fortalecer relações interpessoais"
]
}
},
'S': {
'nome': 'Estabilidade',
'caracteristicas': {
'alto': [
"Paciente e consistente",
"Colaborativo e prestativo",
"Leal e confiável",
"Bom ouvinte",
"Focado em harmonia"
],
'baixo': [
"Mais flexível e adaptável",
"Aberto a mudanças rápidas",
"Multitarefa eficiente",
"Dinâmico e versátil",
"Aprecia variedade"
]
},
'ambiente_ideal': {
'alto': [
"Ambientes estáveis e previsíveis",
"Trabalho em equipe",
"Rotinas estabelecidas",
"Mudanças graduais",
"Relacionamentos duradouros"
],
'baixo': [
"Ambientes dinâmicos",
"Mudanças frequentes",
"Projetos variados",
"Novos desafios",
"Flexibilidade de rotina"
]
},
'recomendacoes': {
'alto': [
"Desenvolver adaptabilidade",
"Praticar iniciativa",
"Expressar opiniões",
"Lidar melhor com mudanças",
"Fortalecer tomada de decisão"
],
'baixo': [
"Desenvolver mais paciência",
"Praticar consistência",
"Fortalecer relacionamentos",
"Melhorar escuta ativa",
"Criar rotinas efetivas"
]
}
},
'C': {
'nome': 'Conformidade',
'caracteristicas': {
'alto': [
"Analítico e preciso",
"Organizado e sistemático",
"Focado em qualidade",
"Atento aos detalhes",
"Orientado por dados"
],
'baixo': [
"Mais flexível com regras",
"Foco em resultados rápidos",
"Prático e objetivo",
"Adaptável a mudanças",
"Tolerante a ambiguidades"
]
},
'ambiente_ideal': {
'alto': [
"Ambientes estruturados",
"Processos claros",
"Foco em qualidade",
"Análise detalhada",
"Padrões definidos"
],
'baixo': [
"Ambientes flexíveis",
"Liberdade de processo",
"Foco em resultados",
"Decisões rápidas",
"Adaptabilidade"
]
},
'recomendacoes': {
'alto': [
"Desenvolver flexibilidade",
"Praticar decisões rápidas",
"Lidar melhor com ambiguidade",
"Equilibrar análise e ação",
"Fortalecer relacionamentos"
],
'baixo': [
"Desenvolver atenção aos detalhes",
"Melhorar organização",
"Criar sistemas e processos",
"Fortalecer análise crítica",
"Praticar planejamento"
]
}
}
}
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 get_profile_description(perfil, percentual):
"""Gera descrição personalizada baseada no perfil e sua intensidade."""
nivel = "alto" if percentual >= 50 else "baixo"
caracteristicas = DISC_PROFILES[perfil]['caracteristicas'][nivel]
ambiente = DISC_PROFILES[perfil]['ambiente_ideal'][nivel]
recomendacoes = DISC_PROFILES[perfil]['recomendacoes'][nivel]
intensidade = get_intensity_level(percentual)
return {
'nome': DISC_PROFILES[perfil]['nome'],
'intensidade': intensidade,
'caracteristicas': caracteristicas,
'ambiente': ambiente,
'recomendacoes': recomendacoes
}
def gerar_relatorio_personalizado(percentuais):
"""Gera relatório detalhado e personalizado baseado nos percentuais DISC."""
perfis_ordenados = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True))
perfis_desc = {k: get_profile_description(k, v) for k, v in perfis_ordenados.items()}
# Perfil dominante e secundário
perfil_dominante = list(perfis_ordenados.keys())[0]
perfil_secundario = list(perfis_ordenados.keys())[1]
# Gerar relatório
relatorio = f"""ANÁLISE DE PERFIL COMPORTAMENTAL DISC
VISÃO GERAL
Seu perfil apresenta uma combinação única de características, com {perfis_desc[perfil_dominante]['nome']} ({perfil_dominante}) como traço dominante em nível {perfis_desc[perfil_dominante]['intensidade']} ({perfis_ordenados[perfil_dominante]:.1f}%), seguido por {perfis_desc[perfil_secundario]['nome']} ({perfil_secundario}) em nível {perfis_desc[perfil_secundario]['intensidade']} ({perfis_ordenados[perfil_secundario]:.1f}%).
CARACTERÍSTICAS PRINCIPAIS
Seu estilo comportamental é marcado por:
{' e '.join(perfis_desc[perfil_dominante]['caracteristicas'][:3])}
• Com influência secundária de: {' e '.join(perfis_desc[perfil_secundario]['caracteristicas'][:2])}
AMBIENTE IDEAL DE TRABALHO
Você tende a prosperar em ambientes que oferecem:
{' e '.join(perfis_desc[perfil_dominante]['ambiente'][:3])}
• Complementados por: {' e '.join(perfis_desc[perfil_secundario]['ambiente'][:2])}
RECOMENDAÇÕES PARA DESENVOLVIMENTO
Para maximizar seu potencial, considere:
{' e '.join(perfis_desc[perfil_dominante]['recomendacoes'][:3])}
• Adicionalmente: {' e '.join(perfis_desc[perfil_secundario]['recomendacoes'][:2])}
DISTRIBUIÇÃO COMPLETA DO PERFIL DISC:
{', '.join([f'{k} ({DISC_PROFILES[k]["nome"]}): {v:.1f}%' for k, v in perfis_ordenados.items()])}
OBSERVAÇÃO: Este perfil representa suas tendências comportamentais naturais. Lembre-se que comportamentos podem ser adaptados conforme o contexto e as necessidades específicas de cada situação."""
return relatorio
# Atualizar a função de processamento do questionário
def processar_questionario(*args):
"""Processa as respostas do questionário e gera o relatório personalizado."""
respostas = list(args)
percentuais = calcular_perfil(respostas)
return gerar_relatorio_personalizado(percentuais)
# Manter o resto do código original (interface Gradio) como está...
# Interface Gradio
with gr.Blocks(title="Análise de Perfil DISC") as iface:
gr.Markdown("# Análise de Perfil Comportamental DISC")
gr.Markdown("### Responda às questões abaixo conforme seu comportamento mais natural")
# Lista para armazenar os componentes de rádio
radio_components = []
# Criar questões
for i, questao in enumerate(DISC_QUESTIONS):
gr.Markdown(f"### {questao['pergunta']}")
radio = gr.Radio(
choices=[f"{perfil} - {desc}" for perfil, desc in questao['opcoes']],
label=f"Questão {i+1}"
)
radio_components.append(radio)
# Saída
output = gr.Textbox(label="Relatório de Perfil DISC", lines=20)
# Botão
btn = gr.Button("Gerar Relatório")
# Conectar função aos componentes
btn.click(
fn=processar_questionario,
inputs=radio_components,
outputs=output
)
# Iniciar a interface
iface.launch()