Update app.py
Browse files
app.py
CHANGED
@@ -5,231 +5,189 @@ import numpy as np
|
|
5 |
|
6 |
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
|
7 |
|
8 |
-
def
|
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 |
-
|
45 |
-
"Suporte e consultoria",
|
46 |
-
"Desenvolvimento especializado"
|
47 |
-
]
|
48 |
-
}
|
49 |
-
},
|
50 |
-
'I': {
|
51 |
-
'alto': {
|
52 |
-
'caracteristicas': [
|
53 |
-
"Excelente comunicação e sociabilidade",
|
54 |
-
"Entusiasmo e otimismo naturais",
|
55 |
-
"Capacidade de influenciar e motivar"
|
56 |
-
],
|
57 |
-
'desenvolvimento': [
|
58 |
-
"Focar mais em detalhes e organização",
|
59 |
-
"Gerenciar melhor o tempo",
|
60 |
-
"Equilibrar socialização e entregas"
|
61 |
-
],
|
62 |
-
'carreiras': [
|
63 |
-
"Vendas e marketing",
|
64 |
-
"Relações públicas",
|
65 |
-
"Treinamento e desenvolvimento"
|
66 |
-
]
|
67 |
-
},
|
68 |
-
'baixo': {
|
69 |
-
'caracteristicas': [
|
70 |
-
"Comunicação objetiva e focada",
|
71 |
-
"Preferência por dados e fatos",
|
72 |
-
"Abordagem analítica"
|
73 |
-
],
|
74 |
-
'desenvolvimento': [
|
75 |
-
"Desenvolver networking",
|
76 |
-
"Praticar comunicação expressiva",
|
77 |
-
"Participar mais em grupos"
|
78 |
-
],
|
79 |
-
'carreiras': [
|
80 |
-
"Pesquisa e análise",
|
81 |
-
"Desenvolvimento técnico",
|
82 |
-
"Gestão de processos"
|
83 |
-
]
|
84 |
-
}
|
85 |
-
},
|
86 |
-
'S': {
|
87 |
-
'alto': {
|
88 |
-
'caracteristicas': [
|
89 |
-
"Alta consistência e confiabilidade",
|
90 |
-
"Excelente trabalho em equipe",
|
91 |
-
"Paciência e estabilidade"
|
92 |
-
],
|
93 |
-
'desenvolvimento': [
|
94 |
-
"Lidar melhor com mudanças",
|
95 |
-
"Desenvolver mais flexibilidade",
|
96 |
-
"Expressar mais opiniões"
|
97 |
-
],
|
98 |
-
'carreiras': [
|
99 |
-
"Recursos humanos",
|
100 |
-
"Suporte ao cliente",
|
101 |
-
"Gestão operacional"
|
102 |
-
]
|
103 |
-
},
|
104 |
-
'baixo': {
|
105 |
-
'caracteristicas': [
|
106 |
-
"Adaptabilidade a mudanças",
|
107 |
-
"Flexibilidade com rotinas",
|
108 |
-
"Multitarefa eficiente"
|
109 |
-
],
|
110 |
-
'desenvolvimento': [
|
111 |
-
"Desenvolver mais consistência",
|
112 |
-
"Manter compromissos de longo prazo",
|
113 |
-
"Fortalecer relacionamentos"
|
114 |
-
],
|
115 |
-
'carreiras': [
|
116 |
-
"Gestão de mudanças",
|
117 |
-
"Inovação e desenvolvimento",
|
118 |
-
"Consultoria"
|
119 |
-
]
|
120 |
-
}
|
121 |
-
},
|
122 |
-
'C': {
|
123 |
-
'alto': {
|
124 |
-
'caracteristicas': [
|
125 |
-
"Alta precisão e atenção aos detalhes",
|
126 |
-
"Excelente capacidade analítica",
|
127 |
-
"Foco em qualidade e processos"
|
128 |
-
],
|
129 |
-
'desenvolvimento': [
|
130 |
-
"Desenvolver flexibilidade",
|
131 |
-
"Aceitar mais riscos",
|
132 |
-
"Tomar decisões mais rápidas"
|
133 |
-
],
|
134 |
-
'carreiras': [
|
135 |
-
"Análise de dados",
|
136 |
-
"Controle de qualidade",
|
137 |
-
"Planejamento estratégico"
|
138 |
-
]
|
139 |
-
},
|
140 |
-
'baixo': {
|
141 |
-
'caracteristicas': [
|
142 |
-
"Flexibilidade com regras",
|
143 |
-
"Foco em resultados práticos",
|
144 |
-
"Adaptabilidade a mudanças"
|
145 |
-
],
|
146 |
-
'desenvolvimento': [
|
147 |
-
"Melhorar organização",
|
148 |
-
"Aumentar atenção aos detalhes",
|
149 |
-
"Desenvolver análise crítica"
|
150 |
-
],
|
151 |
-
'carreiras': [
|
152 |
-
"Gestão criativa",
|
153 |
-
"Desenvolvimento de produtos",
|
154 |
-
"Vendas consultivas"
|
155 |
-
]
|
156 |
-
}
|
157 |
-
}
|
158 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
159 |
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
164 |
|
165 |
-
# Gera
|
166 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
167 |
|
168 |
-
#
|
169 |
-
analise = f"""# Análise Detalhada do Perfil DISC
|
170 |
|
171 |
## Características Principais
|
172 |
-
|
|
|
173 |
|
174 |
-
##
|
175 |
-
|
|
|
176 |
|
177 |
-
##
|
178 |
-
|
179 |
|
180 |
-
##
|
181 |
-
|
182 |
-
• {'Forte capacidade de liderança com foco em pessoas' if perfil_ordenado[1][0] == 'I' else 'Capacidade analítica com orientação para resultados' if perfil_ordenado[1][0] == 'C' else 'Estabilidade com foco em entregas' if perfil_ordenado[1][0] == 'S' else 'Dinamismo com assertividade'}
|
183 |
-
|
184 |
-
## Contribuições para Equipe
|
185 |
-
• {generate_team_contribution(perfil_principal, nivel)}
|
186 |
|
187 |
## Estilo de Comunicação
|
188 |
-
|
|
|
|
|
|
|
189 |
"""
|
190 |
-
return analise
|
191 |
|
192 |
-
def
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
}
|
210 |
-
}
|
211 |
-
return contribuicoes[perfil][nivel]
|
212 |
|
213 |
-
def
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
231 |
}
|
232 |
-
|
|
|
|
|
|
|
|
|
|
|
233 |
|
234 |
def gerar_relatorio(percentuais):
|
235 |
"""
|
@@ -317,7 +275,10 @@ def process_results(*answers):
|
|
317 |
gr.Warning("Por favor, responda todas as questões antes de prosseguir.")
|
318 |
return None, None
|
319 |
|
320 |
-
perfil
|
|
|
|
|
|
|
321 |
plot = create_disc_plot(perfil)
|
322 |
report = gerar_relatorio(perfil)
|
323 |
|
|
|
5 |
|
6 |
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
|
7 |
|
8 |
+
def get_semantic_similarity(text1, text2):
|
9 |
"""
|
10 |
+
Calcula similaridade semântica entre dois textos usando SentenceTransformer
|
11 |
"""
|
12 |
+
embedding1 = model.encode(text1)
|
13 |
+
embedding2 = model.encode(text2)
|
14 |
+
return np.dot(embedding1, embedding2) / (np.linalg.norm(embedding1) * np.linalg.norm(embedding2))
|
15 |
+
|
16 |
+
def get_profile_description(perfil, percentual):
|
17 |
+
"""
|
18 |
+
Gera descrição do perfil baseada na similaridade semântica
|
19 |
+
"""
|
20 |
+
base_descriptions = {
|
21 |
+
'D': [
|
22 |
+
"Focado em resultados e ação direta",
|
23 |
+
"Orientado a desafios e competição",
|
24 |
+
"Busca controle e liderança",
|
25 |
+
"Direto e assertivo nas interações"
|
26 |
+
],
|
27 |
+
'I': [
|
28 |
+
"Comunicativo e entusiasta",
|
29 |
+
"Focado em relacionamentos e interações",
|
30 |
+
"Otimista e motivador",
|
31 |
+
"Expressivo e sociável"
|
32 |
+
],
|
33 |
+
'S': [
|
34 |
+
"Estável e consistente",
|
35 |
+
"Focado em cooperação e harmonia",
|
36 |
+
"Paciente e confiável",
|
37 |
+
"Bom ouvinte e apoiador"
|
38 |
+
],
|
39 |
+
'C': [
|
40 |
+
"Analítico e preciso",
|
41 |
+
"Focado em qualidade e precisão",
|
42 |
+
"Sistemático e organizado",
|
43 |
+
"Detalhista e criterioso"
|
44 |
+
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
}
|
46 |
+
|
47 |
+
# Cria descrição contextual baseada no percentual
|
48 |
+
context = f"Perfil {perfil} com intensidade de {percentual:.1f}%"
|
49 |
+
|
50 |
+
# Encontra as descrições mais semanticamente relevantes
|
51 |
+
descriptions = base_descriptions[perfil]
|
52 |
+
similarities = [get_semantic_similarity(context, desc) for desc in descriptions]
|
53 |
+
most_relevant = [desc for _, desc in sorted(zip(similarities, descriptions), reverse=True)]
|
54 |
+
|
55 |
+
return most_relevant[:2]
|
56 |
|
57 |
+
def generate_profile_analysis(perfil_data):
|
58 |
+
"""
|
59 |
+
Gera análise detalhada usando embeddings para personalização
|
60 |
+
"""
|
61 |
+
# Ordena perfis por percentual
|
62 |
+
perfis_ordenados = sorted(perfil_data.items(), key=lambda x: x[1], reverse=True)
|
63 |
+
perfil_principal = perfis_ordenados[0]
|
64 |
+
perfil_secundario = perfis_ordenados[1]
|
65 |
+
|
66 |
+
# Gera descrições personalizadas usando embeddings
|
67 |
+
descricoes_principais = get_profile_description(perfil_principal[0], perfil_principal[1])
|
68 |
+
descricoes_secundarias = get_profile_description(perfil_secundario[0], perfil_secundario[1])
|
69 |
+
|
70 |
+
# Gera análise de combinação usando similaridade semântica
|
71 |
+
combinacao_context = f"""
|
72 |
+
Perfil principal {perfil_principal[0]} ({perfil_principal[1]:.1f}%)
|
73 |
+
combinado com {perfil_secundario[0]} ({perfil_secundario[1]:.1f}%)
|
74 |
+
"""
|
75 |
+
|
76 |
+
combination_templates = [
|
77 |
+
f"Combina {descricoes_principais[0].lower()} com {descricoes_secundarias[0].lower()}",
|
78 |
+
f"Une capacidade de {descricoes_principais[1].lower()} com {descricoes_secundarias[1].lower()}",
|
79 |
+
]
|
80 |
+
|
81 |
+
# Seleciona o template mais relevante baseado na similaridade semântica
|
82 |
+
combination_similarities = [get_semantic_similarity(combinacao_context, template)
|
83 |
+
for template in combination_templates]
|
84 |
+
best_combination = combination_templates[np.argmax(combination_similarities)]
|
85 |
|
86 |
+
# Gera recomendações personalizadas
|
87 |
+
career_recommendations = generate_career_recommendations(
|
88 |
+
perfil_principal[0], perfil_secundario[0],
|
89 |
+
perfil_principal[1], perfil_secundario[1]
|
90 |
+
)
|
91 |
+
|
92 |
+
# Gera análise de comunicação personalizada
|
93 |
+
communication_style = generate_communication_analysis(
|
94 |
+
perfil_principal[0], perfil_secundario[0],
|
95 |
+
perfil_principal[1], perfil_secundario[1]
|
96 |
+
)
|
97 |
|
98 |
+
return f"""# Análise Detalhada do Perfil DISC
|
|
|
99 |
|
100 |
## Características Principais
|
101 |
+
• {descricoes_principais[0]}
|
102 |
+
• {descricoes_principais[1]}
|
103 |
|
104 |
+
## Influência Secundária
|
105 |
+
• {descricoes_secundarias[0]}
|
106 |
+
• {descricoes_secundarias[1]}
|
107 |
|
108 |
+
## Combinação de Perfis
|
109 |
+
• {best_combination}
|
110 |
|
111 |
+
## Recomendações de Carreira
|
112 |
+
{career_recommendations}
|
|
|
|
|
|
|
|
|
113 |
|
114 |
## Estilo de Comunicação
|
115 |
+
{communication_style}
|
116 |
+
|
117 |
+
## Desenvolvimento Sugerido
|
118 |
+
{generate_development_suggestions(perfil_principal[0], perfil_principal[1])}
|
119 |
"""
|
|
|
120 |
|
121 |
+
def generate_career_recommendations(primary_profile, secondary_profile, primary_value, secondary_value):
|
122 |
+
"""
|
123 |
+
Gera recomendações de carreira usando similaridade semântica
|
124 |
+
"""
|
125 |
+
context = f"Perfil {primary_profile}({primary_value:.1f}%) com {secondary_profile}({secondary_value:.1f}%)"
|
126 |
+
|
127 |
+
career_options = [
|
128 |
+
"• Ideal para papéis de liderança e gestão de projetos",
|
129 |
+
"• Excelente para funções que exigem comunicação e relacionamento",
|
130 |
+
"• Ótimo para posições que necessitam consistência e confiabilidade",
|
131 |
+
"• Adequado para funções analíticas e de planejamento"
|
132 |
+
]
|
133 |
+
|
134 |
+
similarities = [get_semantic_similarity(context, option) for option in career_options]
|
135 |
+
best_matches = [career_options[i] for i in np.argsort(similarities)[-2:]]
|
136 |
+
|
137 |
+
return "\n".join(best_matches)
|
|
|
|
|
|
|
138 |
|
139 |
+
def generate_communication_analysis(primary_profile, secondary_profile, primary_value, secondary_value):
|
140 |
+
"""
|
141 |
+
Gera análise de comunicação usando similaridade semântica
|
142 |
+
"""
|
143 |
+
context = f"Estilo de comunicação {primary_profile}({primary_value:.1f}%) com {secondary_profile}({secondary_value:.1f}%)"
|
144 |
+
|
145 |
+
communication_styles = [
|
146 |
+
"• Comunicação direta e orientada a resultados",
|
147 |
+
"• Comunicação expressiva e entusiasta",
|
148 |
+
"• Comunicação paciente e atenciosa",
|
149 |
+
"• Comunicação precisa e detalhada"
|
150 |
+
]
|
151 |
+
|
152 |
+
similarities = [get_semantic_similarity(context, style) for style in communication_styles]
|
153 |
+
best_match = communication_styles[np.argmax(similarities)]
|
154 |
+
|
155 |
+
return best_match
|
156 |
+
|
157 |
+
def generate_development_suggestions(profile, value):
|
158 |
+
"""
|
159 |
+
Gera sugestões de desenvolvimento usando similaridade semântica
|
160 |
+
"""
|
161 |
+
context = f"Desenvolvimento para perfil {profile} com {value:.1f}%"
|
162 |
+
|
163 |
+
development_options = {
|
164 |
+
'D': [
|
165 |
+
"• Desenvolver mais paciência e empatia nas interações",
|
166 |
+
"• Praticar escuta ativa e consideração por outras perspectivas",
|
167 |
+
"• Balancear assertividade com colaboração"
|
168 |
+
],
|
169 |
+
'I': [
|
170 |
+
"• Desenvolver foco em detalhes e organização",
|
171 |
+
"• Praticar análise mais profunda antes de agir",
|
172 |
+
"• Equilibrar entusiasmo com pragmatismo"
|
173 |
+
],
|
174 |
+
'S': [
|
175 |
+
"• Desenvolver mais flexibilidade com mudanças",
|
176 |
+
"• Praticar tomada de decisão mais rápida",
|
177 |
+
"��� Expressar opiniões com mais frequência"
|
178 |
+
],
|
179 |
+
'C': [
|
180 |
+
"• Desenvolver mais flexibilidade com regras",
|
181 |
+
"• Praticar decisões com menos análise",
|
182 |
+
"• Balancear perfeccionismo com praticidade"
|
183 |
+
]
|
184 |
}
|
185 |
+
|
186 |
+
options = development_options[profile]
|
187 |
+
similarities = [get_semantic_similarity(context, option) for option in options]
|
188 |
+
best_matches = [options[i] for i in np.argsort(similarities)[-2:]]
|
189 |
+
|
190 |
+
return "\n".join(best_matches)
|
191 |
|
192 |
def gerar_relatorio(percentuais):
|
193 |
"""
|
|
|
275 |
gr.Warning("Por favor, responda todas as questões antes de prosseguir.")
|
276 |
return None, None
|
277 |
|
278 |
+
# Extrai apenas a letra do perfil das respostas
|
279 |
+
respostas_processadas = [a.split(' - ')[0] if a else None for a in answers]
|
280 |
+
|
281 |
+
perfil = calcular_perfil(respostas_processadas)
|
282 |
plot = create_disc_plot(perfil)
|
283 |
report = gerar_relatorio(perfil)
|
284 |
|