Update app.py
Browse files
app.py
CHANGED
@@ -3,88 +3,210 @@ from sentence_transformers import SentenceTransformer
|
|
3 |
from sklearn.metrics.pairwise import cosine_similarity
|
4 |
import numpy as np
|
5 |
|
6 |
-
#
|
7 |
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
|
8 |
|
9 |
-
#
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
}
|
43 |
|
44 |
-
def
|
45 |
-
#
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
#
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
#
|
62 |
-
|
63 |
-
|
64 |
-
#
|
65 |
-
|
66 |
-
for
|
67 |
-
|
68 |
-
|
69 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
70 |
|
71 |
# Interface Gradio
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
)
|
|
|
|
|
|
|
|
|
|
|
|
|
88 |
|
89 |
# Iniciar a interface
|
90 |
iface.launch()
|
|
|
3 |
from sklearn.metrics.pairwise import cosine_similarity
|
4 |
import numpy as np
|
5 |
|
6 |
+
# Modelo para embeddings
|
7 |
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
|
8 |
|
9 |
+
# Questionário DISC
|
10 |
+
disc_questions = [
|
11 |
+
{
|
12 |
+
"pergunta": "Em situações de trabalho em equipe, eu geralmente:",
|
13 |
+
"opcoes": [
|
14 |
+
("D", "Assumo a liderança e tomo decisões rápidas"),
|
15 |
+
("I", "Motivo o grupo e mantenho o ambiente animado"),
|
16 |
+
("S", "Apoio os colegas e mantenho a harmonia"),
|
17 |
+
("C", "Analiso detalhadamente antes de agir")
|
18 |
+
]
|
19 |
+
},
|
20 |
+
{
|
21 |
+
"pergunta": "Quando enfrento um problema, eu:",
|
22 |
+
"opcoes": [
|
23 |
+
("D", "Enfrento diretamente e busco soluções imediatas"),
|
24 |
+
("I", "Discuto com outros e busco diferentes perspectivas"),
|
25 |
+
("S", "Mantenho a calma e sigo um processo estabelecido"),
|
26 |
+
("C", "Pesquiso todas as informações disponíveis primeiro")
|
27 |
+
]
|
28 |
+
},
|
29 |
+
{
|
30 |
+
"pergunta": "Em reuniões, eu costumo:",
|
31 |
+
"opcoes": [
|
32 |
+
("D", "Ir direto ao ponto e focar em resultados"),
|
33 |
+
("I", "Participar ativamente e compartilhar ideias"),
|
34 |
+
("S", "Ouvir atentamente e contribuir quando solicitado"),
|
35 |
+
("C", "Tomar notas e questionar os detalhes")
|
36 |
+
]
|
37 |
+
},
|
38 |
+
# Adicione mais perguntas conforme necessário
|
39 |
+
]
|
40 |
+
|
41 |
+
# Características de cada perfil para o relatório
|
42 |
+
perfis_caracteristicas = {
|
43 |
+
'D': {
|
44 |
+
'pontos_fortes': [
|
45 |
+
"Capacidade de liderança",
|
46 |
+
"Foco em resultados",
|
47 |
+
"Tomada rápida de decisão",
|
48 |
+
"Assertividade",
|
49 |
+
"Iniciativa"
|
50 |
+
],
|
51 |
+
'areas_desenvolvimento': [
|
52 |
+
"Paciência com outros",
|
53 |
+
"Sensibilidade às necessidades alheias",
|
54 |
+
"Diplomacia",
|
55 |
+
"Atenção aos detalhes"
|
56 |
+
],
|
57 |
+
'ambiente_ideal': [
|
58 |
+
"Competitivo",
|
59 |
+
"Com autonomia",
|
60 |
+
"Orientado a resultados",
|
61 |
+
"Com desafios constantes"
|
62 |
+
]
|
63 |
+
},
|
64 |
+
'I': {
|
65 |
+
'pontos_fortes': [
|
66 |
+
"Comunicação",
|
67 |
+
"Entusiasmo",
|
68 |
+
"Networking",
|
69 |
+
"Criatividade",
|
70 |
+
"Persuasão"
|
71 |
+
],
|
72 |
+
'areas_desenvolvimento': [
|
73 |
+
"Organização",
|
74 |
+
"Foco",
|
75 |
+
"Conclusão de tarefas",
|
76 |
+
"Atenção aos detalhes"
|
77 |
+
],
|
78 |
+
'ambiente_ideal': [
|
79 |
+
"Social",
|
80 |
+
"Colaborativo",
|
81 |
+
"Dinâmico",
|
82 |
+
"Com reconhecimento público"
|
83 |
+
]
|
84 |
+
},
|
85 |
+
'S': {
|
86 |
+
'pontos_fortes': [
|
87 |
+
"Estabilidade",
|
88 |
+
"Confiabilidade",
|
89 |
+
"Trabalho em equipe",
|
90 |
+
"Paciência",
|
91 |
+
"Lealdade"
|
92 |
+
],
|
93 |
+
'areas_desenvolvimento': [
|
94 |
+
"Adaptação a mudanças",
|
95 |
+
"Assertividade",
|
96 |
+
"Iniciativa",
|
97 |
+
"Tomada de decisão"
|
98 |
+
],
|
99 |
+
'ambiente_ideal': [
|
100 |
+
"Estável",
|
101 |
+
"Previsível",
|
102 |
+
"Cooperativo",
|
103 |
+
"Com rotinas claras"
|
104 |
+
]
|
105 |
+
},
|
106 |
+
'C': {
|
107 |
+
'pontos_fortes': [
|
108 |
+
"Precisão",
|
109 |
+
"Análise",
|
110 |
+
"Organização",
|
111 |
+
"Qualidade",
|
112 |
+
"Planejamento"
|
113 |
+
],
|
114 |
+
'areas_desenvolvimento': [
|
115 |
+
"Flexibilidade",
|
116 |
+
"Velocidade",
|
117 |
+
"Expressão emocional",
|
118 |
+
"Tomada de risco"
|
119 |
+
],
|
120 |
+
'ambiente_ideal': [
|
121 |
+
"Estruturado",
|
122 |
+
"Com regras claras",
|
123 |
+
"Focado em qualidade",
|
124 |
+
"Com tempo para análise"
|
125 |
+
]
|
126 |
+
}
|
127 |
}
|
128 |
|
129 |
+
def calcular_perfil(respostas):
|
130 |
+
# Contar frequência de cada perfil
|
131 |
+
contagem = {'D': 0, 'I': 0, 'S': 0, 'C': 0}
|
132 |
+
for resposta in respostas:
|
133 |
+
contagem[resposta] += 1
|
134 |
+
|
135 |
+
# Calcular porcentagens
|
136 |
+
total = sum(contagem.values())
|
137 |
+
percentuais = {k: (v/total) * 100 for k, v in contagem.items()}
|
138 |
+
|
139 |
+
return percentuais
|
140 |
+
|
141 |
+
def gerar_relatorio(percentuais):
|
142 |
+
# Ordenar perfis por porcentagem
|
143 |
+
perfis_ordenados = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True))
|
144 |
+
perfil_dominante = list(perfis_ordenados.keys())[0]
|
145 |
+
|
146 |
+
# Cabeçalho do relatório
|
147 |
+
relatorio = "RELATÓRIO DE PERFIL COMPORTAMENTAL DISC\n\n"
|
148 |
+
|
149 |
+
# Resultados percentuais
|
150 |
+
relatorio += "DISTRIBUIÇÃO DOS PERFIS:\n"
|
151 |
+
for perfil, porcentagem in perfis_ordenados.items():
|
152 |
+
relatorio += f"{perfil}: {porcentagem:.1f}%\n"
|
153 |
+
|
154 |
+
relatorio += f"\nPERFIL PREDOMINANTE: {perfil_dominante}\n\n"
|
155 |
+
|
156 |
+
# Características do perfil dominante
|
157 |
+
relatorio += "PONTOS FORTES:\n"
|
158 |
+
for ponto in perfis_caracteristicas[perfil_dominante]['pontos_fortes']:
|
159 |
+
relatorio += f"- {ponto}\n"
|
160 |
+
|
161 |
+
relatorio += "\nÁREAS DE DESENVOLVIMENTO:\n"
|
162 |
+
for area in perfis_caracteristicas[perfil_dominante]['areas_desenvolvimento']:
|
163 |
+
relatorio += f"- {area}\n"
|
164 |
+
|
165 |
+
relatorio += "\nAMBIENTE IDEAL DE TRABALHO:\n"
|
166 |
+
for caracteristica in perfis_caracteristicas[perfil_dominante]['ambiente_ideal']:
|
167 |
+
relatorio += f"- {caracteristica}\n"
|
168 |
+
|
169 |
+
# Recomendações personalizadas baseadas no modelo
|
170 |
+
texto_base = " ".join(perfis_caracteristicas[perfil_dominante]['pontos_fortes'])
|
171 |
+
embedding_base = model.encode([texto_base])[0]
|
172 |
+
|
173 |
+
return relatorio
|
174 |
+
|
175 |
+
def processar_questionario(respostas):
|
176 |
+
# Converter respostas em perfis
|
177 |
+
perfis_selecionados = [opcao.split()[0] for opcao in respostas]
|
178 |
+
|
179 |
+
# Calcular percentuais
|
180 |
+
percentuais = calcular_perfil(perfis_selecionados)
|
181 |
+
|
182 |
+
# Gerar relatório
|
183 |
+
relatorio = gerar_relatorio(percentuais)
|
184 |
+
|
185 |
+
return relatorio
|
186 |
|
187 |
# Interface Gradio
|
188 |
+
with gr.Blocks(title="Questionário DISC") as iface:
|
189 |
+
gr.Markdown("# Análise de Perfil Comportamental DISC")
|
190 |
+
|
191 |
+
with gr.Group():
|
192 |
+
respostas = []
|
193 |
+
for i, questao in enumerate(disc_questions):
|
194 |
+
gr.Markdown(f"### {questao['pergunta']}")
|
195 |
+
respostas.append(
|
196 |
+
gr.Radio(
|
197 |
+
choices=[f"{perfil} - {desc}" for perfil, desc in questao['opcoes']],
|
198 |
+
label=f"Questão {i+1}"
|
199 |
+
)
|
200 |
+
)
|
201 |
+
|
202 |
+
btn = gr.Button("Gerar Relatório")
|
203 |
+
output = gr.Textbox(label="Relatório", lines=20)
|
204 |
+
|
205 |
+
btn.click(
|
206 |
+
fn=processar_questionario,
|
207 |
+
inputs=respostas,
|
208 |
+
outputs=output
|
209 |
+
)
|
210 |
|
211 |
# Iniciar a interface
|
212 |
iface.launch()
|