DHEIVER commited on
Commit
240c707
·
verified ·
1 Parent(s): e21ed46

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +170 -209
app.py CHANGED
@@ -5,231 +5,189 @@ import numpy as np
5
 
6
  model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
7
 
8
- def generate_profile_analysis(perfil_data):
9
  """
10
- Gera análise detalhada baseada nos percentuais DISC usando embeddings
11
  """
12
- # Base de conhecimento para análise DISC
13
- disc_knowledge = {
14
- 'D': {
15
- 'alto': {
16
- 'caracteristicas': [
17
- "Forte capacidade de liderança e decisão",
18
- "Orientação para resultados e ação rápida",
19
- "Assertividade e competitividade elevadas"
20
- ],
21
- 'desenvolvimento': [
22
- "Desenvolver mais paciência e empatia",
23
- "Praticar escuta ativa",
24
- "Considerar impactos nas pessoas"
25
- ],
26
- 'carreiras': [
27
- "Gestão executiva",
28
- "Empreendedorismo",
29
- "Gestão de projetos"
30
- ]
31
- },
32
- 'baixo': {
33
- 'caracteristicas': [
34
- "Abordagem colaborativa e consensual",
35
- "Foco em harmonia e cooperação",
36
- "Decisões cuidadosas e ponderadas"
37
- ],
38
- 'desenvolvimento': [
39
- "Desenvolver mais assertividade",
40
- "Praticar tomada de decisão",
41
- "Expressar opiniões com mais frequência"
42
- ],
43
- 'carreiras': [
44
- "Análise e planejamento",
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
- # Determina o perfil dominante e análise correspondente
161
- perfil_ordenado = sorted(perfil_data.items(), key=lambda x: x[1], reverse=True)
162
- perfil_principal = perfil_ordenado[0][0]
163
- nivel = 'alto' if perfil_ordenado[0][1] >= 50 else 'baixo'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
164
 
165
- # Gera embeddings para características do perfil
166
- profile_data = disc_knowledge[perfil_principal][nivel]
 
 
 
 
 
 
 
 
 
167
 
168
- # Constrói análise personalizada
169
- analise = f"""# Análise Detalhada do Perfil DISC
170
 
171
  ## Características Principais
172
- {chr(10).join([f"• {c}" for c in profile_data['caracteristicas']])}
 
173
 
174
- ## Áreas para Desenvolvimento
175
- {chr(10).join([f"• {d}" for d in profile_data['desenvolvimento']])}
 
176
 
177
- ## Carreiras e Funções Recomendadas
178
- {chr(10).join([f"• {c}" for c in profile_data['carreiras']])}
179
 
180
- ## Análise de Combinação
181
- Seu perfil {perfil_principal} {nivel} ({perfil_ordenado[0][1]:.1f}%) combinado com {perfil_ordenado[1][0]} secundário ({perfil_ordenado[1][1]:.1f}%) sugere:
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
- {generate_communication_style(perfil_principal, nivel)}
 
 
 
189
  """
190
- return analise
191
 
192
- def generate_team_contribution(perfil, nivel):
193
- contribuicoes = {
194
- 'D': {
195
- 'alto': "Traz direção clara e foco em resultados para a equipe",
196
- 'baixo': "Contribui com abordagem colaborativa e ponderada"
197
- },
198
- 'I': {
199
- 'alto': "Promove entusiasmo e mantém a equipe motivada",
200
- 'baixo': "Traz objetividade e foco para as discussões"
201
- },
202
- 'S': {
203
- 'alto': "Proporciona estabilidade e suporte consistente",
204
- 'baixo': "Adiciona dinamismo e adaptabilidade ao grupo"
205
- },
206
- 'C': {
207
- 'alto': "Garante qualidade e precisão nas entregas",
208
- 'baixo': "Traz praticidade e flexibilidade aos processos"
209
- }
210
- }
211
- return contribuicoes[perfil][nivel]
212
 
213
- def generate_communication_style(perfil, nivel):
214
- estilos = {
215
- 'D': {
216
- 'alto': "Comunicação direta e focada em resultados",
217
- 'baixo': "Comunicação colaborativa e consensual"
218
- },
219
- 'I': {
220
- 'alto': "Comunicação expressiva e entusiasta",
221
- 'baixo': "Comunicação objetiva e baseada em fatos"
222
- },
223
- 'S': {
224
- 'alto': "Comunicação paciente e atenciosa",
225
- 'baixo': "Comunicação adaptável e flexível"
226
- },
227
- 'C': {
228
- 'alto': "Comunicação precisa e detalhada",
229
- 'baixo': "Comunicação prática e objetiva"
230
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
231
  }
232
- return estilos[perfil][nivel]
 
 
 
 
 
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 = calcular_perfil(answers)
 
 
 
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