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()