DISC.ai / app.py
DHEIVER's picture
Update app.py
7869e46 verified
raw
history blame
12.2 kB
import gradio as gr
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# Inicializar o modelo
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
# Base de conhecimento DISC para o modelo
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.
'''
}
# Questionário DISC
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):
# Contar frequência de cada perfil
contagem = {'D': 0, 'I': 0, 'S': 0, 'C': 0}
for resposta in respostas:
if resposta: # Verifica se a resposta não é None
perfil = resposta.split()[0] # Pega a primeira letra (D, I, S ou C)
contagem[perfil] += 1
# Calcular porcentagens
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):
# Criar texto base para o modelo analisar
texto_base = f"{perfis_base[perfil]} Intensidade: {percentual:.1f}%. Contexto: {contexto}"
# Gerar embedding do texto base
embedding_base = model.encode([texto_base])[0]
# Templates para cada contexto
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]."
]
}
# Selecionar template mais apropriado baseado na similaridade
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):
# Ordenar perfis por porcentagem
perfis_ordenados = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True))
perfil_dominante = list(perfis_ordenados.keys())[0]
# Gerar três parágrafos usando o modelo
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")
# Combinar parágrafos com dados quantitativos
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):
# Recebe as respostas como argumentos individuais e converte para lista
respostas = list(args)
# Calcular percentuais
percentuais = calcular_perfil(respostas)
# Gerar relatório
relatorio = gerar_relatorio(percentuais)
return relatorio
# Interface Gradio
with gr.Blocks(title="Análise de Perfil DISC") as iface:
gr.Markdown("# Análise de Perfil Comportamental DISC")
# 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()