|
import gradio as gr |
|
from sentence_transformers import SentenceTransformer |
|
from sklearn.metrics.pairwise import cosine_similarity |
|
import numpy as np |
|
|
|
|
|
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2') |
|
|
|
|
|
perfis_base = { |
|
'D': ''' |
|
Perfil Dominância (D) é caracterizado por ser direto, decisivo, orientado a resultados. |
|
Pessoas com alto D são determinadas, competitivas, assertivas e gostam de desafios. |
|
Tendem a ser líderes naturais, focados em objetivos e rápidos na tomada de decisão. |
|
Trabalham bem sob pressão e buscam autoridade e responsabilidade. |
|
''', |
|
|
|
'I': ''' |
|
Perfil Influência (I) é caracterizado por ser comunicativo, entusiasta e sociável. |
|
Pessoas com alto I são otimistas, expressivas, persuasivas e gostam de interagir. |
|
Tendem a ser carismáticas, motivadoras e habilidosas em networking. |
|
Trabalham bem em equipe e são orientadas para pessoas e relacionamentos. |
|
''', |
|
|
|
'S': ''' |
|
Perfil Estabilidade (S) é caracterizado por ser paciente, consistente e cooperativo. |
|
Pessoas com alto S são confiáveis, leais, bons ouvintes e prestativas. |
|
Tendem a ser excelentes em suporte, mediação e manutenção da harmonia. |
|
Trabalham bem em ambientes estáveis e valorizam relacionamentos duradouros. |
|
''', |
|
|
|
'C': ''' |
|
Perfil Conformidade (C) é caracterizado por ser analítico, preciso e sistemático. |
|
Pessoas com alto C são detalhistas, organizadas e focadas em qualidade. |
|
Tendem a ser especialistas, metódicas e orientadas por dados e processos. |
|
Trabalham bem com regras e procedimentos, valorizando a precisão. |
|
''' |
|
} |
|
|
|
|
|
disc_questions = [ |
|
{ |
|
"pergunta": "Em situações de trabalho em equipe, eu geralmente:", |
|
"opcoes": [ |
|
("D", "Assumo a liderança e tomo decisões rápidas"), |
|
("I", "Motivo o grupo e mantenho o ambiente animado"), |
|
("S", "Apoio os colegas e mantenho a harmonia"), |
|
("C", "Analiso detalhadamente antes de agir") |
|
] |
|
}, |
|
{ |
|
"pergunta": "Quando enfrento um problema, eu:", |
|
"opcoes": [ |
|
("D", "Enfrento diretamente e busco soluções imediatas"), |
|
("I", "Discuto com outros e busco diferentes perspectivas"), |
|
("S", "Mantenho a calma e sigo um processo estabelecido"), |
|
("C", "Pesquiso todas as informações disponíveis primeiro") |
|
] |
|
}, |
|
{ |
|
"pergunta": "Em reuniões, eu costumo:", |
|
"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, eu:", |
|
"opcoes": [ |
|
("D", "Abraço a mudança e lidero a implementação"), |
|
("I", "Entusiasmo os outros sobre as novas possibilidades"), |
|
("S", "Adapto-me gradualmente seguindo o processo"), |
|
("C", "Analiso os impactos antes de aceitar") |
|
] |
|
}, |
|
{ |
|
"pergunta": "Sob pressão, eu tendo a:", |
|
"opcoes": [ |
|
("D", "Tornar-me mais direto e exigente"), |
|
("I", "Falar mais e buscar apoio dos outros"), |
|
("S", "Buscar estabilidade e manter a calma"), |
|
("C", "Focar em detalhes e procedimentos") |
|
] |
|
} |
|
] |
|
|
|
def calcular_perfil(respostas): |
|
|
|
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 gerar_paragrafo_modelo(perfil, percentual, contexto): |
|
|
|
texto_base = f"{perfis_base[perfil]} Intensidade: {percentual:.1f}%. Contexto: {contexto}" |
|
|
|
|
|
embedding_base = model.encode([texto_base])[0] |
|
|
|
|
|
templates = { |
|
"visao_geral": [ |
|
"Este perfil demonstra forte orientação para [ASPECTO], com ênfase em [CARACTERÍSTICA].", |
|
"A análise indica uma tendência natural para [ASPECTO], destacando-se em [CARACTERÍSTICA].", |
|
"O comportamento predominante revela foco em [ASPECTO], com notável [CARACTERÍSTICA]." |
|
], |
|
"pontos_fortes": [ |
|
"Seus pontos fortes incluem [ASPECTOS], sendo particularmente efetivo em [SITUAÇÃO].", |
|
"Destaca-se principalmente por [ASPECTOS], com excelente capacidade para [SITUAÇÃO].", |
|
"Suas principais competências envolvem [ASPECTOS], sendo muito eficaz em [SITUAÇÃO]." |
|
], |
|
"recomendacoes": [ |
|
"Para desenvolvimento, pode focar em [ASPECTOS], buscando equilibrar [CARACTERÍSTICA].", |
|
"As oportunidades de crescimento incluem [ASPECTOS], visando aprimorar [CARACTERÍSTICA].", |
|
"O caminho de desenvolvimento sugere atenção a [ASPECTOS], para fortalecer [CARACTERÍSTICA]." |
|
] |
|
} |
|
|
|
|
|
melhor_template = max(templates[contexto], |
|
key=lambda t: cosine_similarity([embedding_base], |
|
[model.encode([t])[0]])[0][0]) |
|
|
|
return melhor_template.replace("[ASPECTO]", |
|
get_aspecto_principal(perfil, contexto) |
|
).replace("[CARACTERÍSTICA]", |
|
get_caracteristica_principal(perfil, contexto) |
|
).replace("[ASPECTOS]", |
|
get_aspectos(perfil, contexto) |
|
).replace("[SITUAÇÃO]", |
|
get_situacao(perfil, contexto)) |
|
|
|
def get_aspecto_principal(perfil, contexto): |
|
aspectos = { |
|
'D': { |
|
'visao_geral': "resultados e ação", |
|
'pontos_fortes': "liderança e decisão", |
|
'recomendacoes': "relacionamentos interpessoais" |
|
}, |
|
'I': { |
|
'visao_geral': "comunicação e influência", |
|
'pontos_fortes': "persuasão e entusiasmo", |
|
'recomendacoes': "organização e foco" |
|
}, |
|
'S': { |
|
'visao_geral': "estabilidade e cooperação", |
|
'pontos_fortes': "suporte e consistência", |
|
'recomendacoes': "adaptabilidade e assertividade" |
|
}, |
|
'C': { |
|
'visao_geral': "análise e precisão", |
|
'pontos_fortes': "qualidade e processos", |
|
'recomendacoes': "flexibilidade e velocidade" |
|
} |
|
} |
|
return aspectos[perfil][contexto] |
|
|
|
def get_caracteristica_principal(perfil, contexto): |
|
caracteristicas = { |
|
'D': { |
|
'visao_geral': "determinação e competitividade", |
|
'pontos_fortes': "tomada rápida de decisão", |
|
'recomendacoes': "desenvolvimento de empatia" |
|
}, |
|
'I': { |
|
'visao_geral': "sociabilidade e otimismo", |
|
'pontos_fortes': "networking e motivação", |
|
'recomendacoes': "gestão de tempo" |
|
}, |
|
'S': { |
|
'visao_geral': "confiabilidade e paciência", |
|
'pontos_fortes': "trabalho em equipe", |
|
'recomendacoes': "gestão de mudanças" |
|
}, |
|
'C': { |
|
'visao_geral': "organização e metodologia", |
|
'pontos_fortes': "atenção aos detalhes", |
|
'recomendacoes': "tomada de decisão rápida" |
|
} |
|
} |
|
return caracteristicas[perfil][contexto] |
|
|
|
def get_aspectos(perfil, contexto): |
|
aspectos = { |
|
'D': { |
|
'visao_geral': "liderança, competitividade e iniciativa", |
|
'pontos_fortes': "direcionamento, foco em resultados e autonomia", |
|
'recomendacoes': "escuta ativa, paciência e colaboração" |
|
}, |
|
'I': { |
|
'visao_geral': "comunicação, entusiasmo e sociabilidade", |
|
'pontos_fortes': "persuasão, networking e criatividade", |
|
'recomendacoes': "organização, foco e conclusão de tarefas" |
|
}, |
|
'S': { |
|
'visao_geral': "estabilidade, cooperação e harmonia", |
|
'pontos_fortes': "consistência, lealdade e suporte", |
|
'recomendacoes': "proatividade, assertividade e adaptabilidade" |
|
}, |
|
'C': { |
|
'visao_geral': "análise, precisão e qualidade", |
|
'pontos_fortes': "organização, planejamento e controle", |
|
'recomendacoes': "flexibilidade, agilidade e relacionamentos" |
|
} |
|
} |
|
return aspectos[perfil][contexto] |
|
|
|
def get_situacao(perfil, contexto): |
|
situacoes = { |
|
'D': { |
|
'visao_geral': "ambientes desafiadores", |
|
'pontos_fortes': "situações que exigem decisões rápidas", |
|
'recomendacoes': "trabalho em equipe colaborativo" |
|
}, |
|
'I': { |
|
'visao_geral': "ambientes sociais", |
|
'pontos_fortes': "situações que exigem persuasão", |
|
'recomendacoes': "tarefas que exigem foco individual" |
|
}, |
|
'S': { |
|
'visao_geral': "ambientes estáveis", |
|
'pontos_fortes': "situações que exigem cooperação", |
|
'recomendacoes': "ambientes de mudança constante" |
|
}, |
|
'C': { |
|
'visao_geral': "ambientes estruturados", |
|
'pontos_fortes': "situações que exigem precisão", |
|
'recomendacoes': "decisões sob pressão" |
|
} |
|
} |
|
return situacoes[perfil][contexto] |
|
|
|
def gerar_relatorio(percentuais): |
|
|
|
perfis_ordenados = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True)) |
|
perfil_dominante = list(perfis_ordenados.keys())[0] |
|
|
|
|
|
p1 = gerar_paragrafo_modelo(perfil_dominante, perfis_ordenados[perfil_dominante], "visao_geral") |
|
p2 = gerar_paragrafo_modelo(perfil_dominante, perfis_ordenados[perfil_dominante], "pontos_fortes") |
|
p3 = gerar_paragrafo_modelo(perfil_dominante, perfis_ordenados[perfil_dominante], "recomendacoes") |
|
|
|
|
|
relatorio = f"""Análise de Perfil DISC |
|
|
|
{p1} |
|
Distribuição quantitativa: {', '.join([f'{k}: {v:.1f}%' for k, v in perfis_ordenados.items()])} |
|
|
|
{p2} |
|
Este perfil representa {perfis_ordenados[perfil_dominante]:.1f}% das suas respostas. |
|
|
|
{p3} |
|
""" |
|
|
|
return relatorio |
|
|
|
def processar_questionario(*args): |
|
|
|
respostas = list(args) |
|
|
|
|
|
percentuais = calcular_perfil(respostas) |
|
|
|
|
|
relatorio = gerar_relatorio(percentuais) |
|
|
|
return relatorio |
|
|
|
|
|
with gr.Blocks(title="Análise de Perfil DISC") as iface: |
|
gr.Markdown("# Análise de Perfil Comportamental DISC") |
|
|
|
|
|
radio_components = [] |
|
|
|
|
|
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) |
|
|
|
|
|
output = gr.Textbox(label="Relatório de Perfil DISC", lines=20) |
|
|
|
|
|
btn = gr.Button("Gerar Relatório") |
|
|
|
|
|
btn.click( |
|
fn=processar_questionario, |
|
inputs=radio_components, |
|
outputs=output |
|
) |
|
|
|
|
|
iface.launch() |