DHEIVER commited on
Commit
12026ba
·
verified ·
1 Parent(s): 7869e46

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +212 -194
app.py CHANGED
@@ -6,39 +6,132 @@ import numpy as np
6
  # Inicializar o modelo
7
  model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
8
 
9
- # Base de conhecimento DISC para o modelo
10
- perfis_base = {
11
- 'D': '''
12
- Perfil Dominância (D) é caracterizado por ser direto, decisivo, orientado a resultados.
13
- Pessoas com alto D são determinadas, competitivas, assertivas e gostam de desafios.
14
- Tendem a ser líderes naturais, focados em objetivos e rápidos na tomada de decisão.
15
- Trabalham bem sob pressão e buscam autoridade e responsabilidade.
16
- ''',
17
-
18
- 'I': '''
19
- Perfil Influência (I) é caracterizado por ser comunicativo, entusiasta e sociável.
20
- Pessoas com alto I são otimistas, expressivas, persuasivas e gostam de interagir.
21
- Tendem a ser carismáticas, motivadoras e habilidosas em networking.
22
- Trabalham bem em equipe e são orientadas para pessoas e relacionamentos.
23
- ''',
24
-
25
- 'S': '''
26
- Perfil Estabilidade (S) é caracterizado por ser paciente, consistente e cooperativo.
27
- Pessoas com alto S são confiáveis, leais, bons ouvintes e prestativas.
28
- Tendem a ser excelentes em suporte, mediação e manutenção da harmonia.
29
- Trabalham bem em ambientes estáveis e valorizam relacionamentos duradouros.
30
- ''',
31
-
32
- 'C': '''
33
- Perfil Conformidade (C) é caracterizado por ser analítico, preciso e sistemático.
34
- Pessoas com alto C são detalhistas, organizadas e focadas em qualidade.
35
- Tendem a ser especialistas, metódicas e orientadas por dados e processos.
36
- Trabalham bem com regras e procedimentos, valorizando a precisão.
37
- '''
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  }
39
 
40
  # Questionário DISC
41
- disc_questions = [
42
  {
43
  "pergunta": "Em situações de trabalho em equipe, eu geralmente:",
44
  "opcoes": [
@@ -86,16 +179,69 @@ disc_questions = [
86
  }
87
  ]
88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  def calcular_perfil(respostas):
90
- # Contar frequência de cada perfil
91
  contagem = {'D': 0, 'I': 0, 'S': 0, 'C': 0}
92
 
93
  for resposta in respostas:
94
- if resposta: # Verifica se a resposta não é None
95
- perfil = resposta.split()[0] # Pega a primeira letra (D, I, S ou C)
96
  contagem[perfil] += 1
97
 
98
- # Calcular porcentagens
99
  total = sum(contagem.values())
100
  if total > 0:
101
  percentuais = {k: (v/total) * 100 for k, v in contagem.items()}
@@ -104,191 +250,63 @@ def calcular_perfil(respostas):
104
 
105
  return percentuais
106
 
107
- def gerar_paragrafo_modelo(perfil, percentual, contexto):
108
- # Criar texto base para o modelo analisar
109
- texto_base = f"{perfis_base[perfil]} Intensidade: {percentual:.1f}%. Contexto: {contexto}"
110
-
111
- # Gerar embedding do texto base
112
- embedding_base = model.encode([texto_base])[0]
113
 
114
- # Templates para cada contexto
115
- templates = {
116
- "visao_geral": [
117
- "Este perfil demonstra forte orientação para [ASPECTO], com ênfase em [CARACTERÍSTICA].",
118
- "A análise indica uma tendência natural para [ASPECTO], destacando-se em [CARACTERÍSTICA].",
119
- "O comportamento predominante revela foco em [ASPECTO], com notável [CARACTERÍSTICA]."
120
- ],
121
- "pontos_fortes": [
122
- "Seus pontos fortes incluem [ASPECTOS], sendo particularmente efetivo em [SITUAÇÃO].",
123
- "Destaca-se principalmente por [ASPECTOS], com excelente capacidade para [SITUAÇÃO].",
124
- "Suas principais competências envolvem [ASPECTOS], sendo muito eficaz em [SITUAÇÃO]."
125
- ],
126
- "recomendacoes": [
127
- "Para desenvolvimento, pode focar em [ASPECTOS], buscando equilibrar [CARACTERÍSTICA].",
128
- "As oportunidades de crescimento incluem [ASPECTOS], visando aprimorar [CARACTERÍSTICA].",
129
- "O caminho de desenvolvimento sugere atenção a [ASPECTOS], para fortalecer [CARACTERÍSTICA]."
130
- ]
131
- }
132
 
133
- # Selecionar template mais apropriado baseado na similaridade
134
- melhor_template = max(templates[contexto],
135
- key=lambda t: cosine_similarity([embedding_base],
136
- [model.encode([t])[0]])[0][0])
137
 
138
- return melhor_template.replace("[ASPECTO]",
139
- get_aspecto_principal(perfil, contexto)
140
- ).replace("[CARACTERÍSTICA]",
141
- get_caracteristica_principal(perfil, contexto)
142
- ).replace("[ASPECTOS]",
143
- get_aspectos(perfil, contexto)
144
- ).replace("[SITUAÇÃO]",
145
- get_situacao(perfil, contexto))
146
-
147
- def get_aspecto_principal(perfil, contexto):
148
- aspectos = {
149
- 'D': {
150
- 'visao_geral': "resultados e ação",
151
- 'pontos_fortes': "liderança e decisão",
152
- 'recomendacoes': "relacionamentos interpessoais"
153
- },
154
- 'I': {
155
- 'visao_geral': "comunicação e influência",
156
- 'pontos_fortes': "persuasão e entusiasmo",
157
- 'recomendacoes': "organização e foco"
158
- },
159
- 'S': {
160
- 'visao_geral': "estabilidade e cooperação",
161
- 'pontos_fortes': "suporte e consistência",
162
- 'recomendacoes': "adaptabilidade e assertividade"
163
- },
164
- 'C': {
165
- 'visao_geral': "análise e precisão",
166
- 'pontos_fortes': "qualidade e processos",
167
- 'recomendacoes': "flexibilidade e velocidade"
168
- }
169
- }
170
- return aspectos[perfil][contexto]
171
 
172
- def get_caracteristica_principal(perfil, contexto):
173
- caracteristicas = {
174
- 'D': {
175
- 'visao_geral': "determinação e competitividade",
176
- 'pontos_fortes': "tomada rápida de decisão",
177
- 'recomendacoes': "desenvolvimento de empatia"
178
- },
179
- 'I': {
180
- 'visao_geral': "sociabilidade e otimismo",
181
- 'pontos_fortes': "networking e motivação",
182
- 'recomendacoes': "gestão de tempo"
183
- },
184
- 'S': {
185
- 'visao_geral': "confiabilidade e paciência",
186
- 'pontos_fortes': "trabalho em equipe",
187
- 'recomendacoes': "gestão de mudanças"
188
- },
189
- 'C': {
190
- 'visao_geral': "organização e metodologia",
191
- 'pontos_fortes': "atenção aos detalhes",
192
- 'recomendacoes': "tomada de decisão rápida"
193
- }
194
- }
195
- return caracteristicas[perfil][contexto]
196
 
197
- def get_aspectos(perfil, contexto):
198
- aspectos = {
199
- 'D': {
200
- 'visao_geral': "liderança, competitividade e iniciativa",
201
- 'pontos_fortes': "direcionamento, foco em resultados e autonomia",
202
- 'recomendacoes': "escuta ativa, paciência e colaboração"
203
- },
204
- 'I': {
205
- 'visao_geral': "comunicação, entusiasmo e sociabilidade",
206
- 'pontos_fortes': "persuasão, networking e criatividade",
207
- 'recomendacoes': "organização, foco e conclusão de tarefas"
208
- },
209
- 'S': {
210
- 'visao_geral': "estabilidade, cooperação e harmonia",
211
- 'pontos_fortes': "consistência, lealdade e suporte",
212
- 'recomendacoes': "proatividade, assertividade e adaptabilidade"
213
- },
214
- 'C': {
215
- 'visao_geral': "análise, precisão e qualidade",
216
- 'pontos_fortes': "organização, planejamento e controle",
217
- 'recomendacoes': "flexibilidade, agilidade e relacionamentos"
218
- }
219
- }
220
- return aspectos[perfil][contexto]
221
 
222
- def get_situacao(perfil, contexto):
223
- situacoes = {
224
- 'D': {
225
- 'visao_geral': "ambientes desafiadores",
226
- 'pontos_fortes': "situações que exigem decisões rápidas",
227
- 'recomendacoes': "trabalho em equipe colaborativo"
228
- },
229
- 'I': {
230
- 'visao_geral': "ambientes sociais",
231
- 'pontos_fortes': "situações que exigem persuasão",
232
- 'recomendacoes': "tarefas que exigem foco individual"
233
- },
234
- 'S': {
235
- 'visao_geral': "ambientes estáveis",
236
- 'pontos_fortes': "situações que exigem cooperação",
237
- 'recomendacoes': "ambientes de mudança constante"
238
- },
239
- 'C': {
240
- 'visao_geral': "ambientes estruturados",
241
- 'pontos_fortes': "situações que exigem precisão",
242
- 'recomendacoes': "decisões sob pressão"
243
- }
244
- }
245
- return situacoes[perfil][contexto]
246
-
247
- def gerar_relatorio(percentuais):
248
- # Ordenar perfis por porcentagem
249
- perfis_ordenados = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True))
250
- perfil_dominante = list(perfis_ordenados.keys())[0]
251
-
252
- # Gerar três parágrafos usando o modelo
253
- p1 = gerar_paragrafo_modelo(perfil_dominante, perfis_ordenados[perfil_dominante], "visao_geral")
254
- p2 = gerar_paragrafo_modelo(perfil_dominante, perfis_ordenados[perfil_dominante], "pontos_fortes")
255
- p3 = gerar_paragrafo_modelo(perfil_dominante, perfis_ordenados[perfil_dominante], "recomendacoes")
256
-
257
- # Combinar parágrafos com dados quantitativos
258
- relatorio = f"""Análise de Perfil DISC
259
 
260
  {p1}
261
- Distribuição quantitativa: {', '.join([f'{k}: {v:.1f}%' for k, v in perfis_ordenados.items()])}
262
 
263
  {p2}
264
- Este perfil representa {perfis_ordenados[perfil_dominante]:.1f}% das suas respostas.
265
 
266
  {p3}
267
- """
268
-
269
- return relatorio
270
 
271
  def processar_questionario(*args):
272
- # Recebe as respostas como argumentos individuais e converte para lista
273
  respostas = list(args)
274
-
275
- # Calcular percentuais
276
  percentuais = calcular_perfil(respostas)
277
-
278
- # Gerar relatório
279
- relatorio = gerar_relatorio(percentuais)
280
-
281
- return relatorio
282
 
283
  # Interface Gradio
284
  with gr.Blocks(title="Análise de Perfil DISC") as iface:
285
  gr.Markdown("# Análise de Perfil Comportamental DISC")
 
286
 
287
  # Lista para armazenar os componentes de rádio
288
  radio_components = []
289
 
290
  # Criar questões
291
- for i, questao in enumerate(disc_questions):
292
  gr.Markdown(f"### {questao['pergunta']}")
293
  radio = gr.Radio(
294
  choices=[f"{perfil} - {desc}" for perfil, desc in questao['opcoes']],
 
6
  # Inicializar o modelo
7
  model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
8
 
9
+ # Base de conhecimento para análise
10
+ DISC_BASE = {
11
+ 'D': {
12
+ 'caracteristicas_principais': [
13
+ "liderança natural",
14
+ "foco em resultados",
15
+ "tomada rápida de decisão",
16
+ "assertividade",
17
+ "orientação para desafios"
18
+ ],
19
+ 'pontos_fortes': [
20
+ "determinação",
21
+ "eficiência",
22
+ "iniciativa",
23
+ "coragem",
24
+ "competitividade"
25
+ ],
26
+ 'areas_desenvolvimento': [
27
+ "paciência",
28
+ "empatia",
29
+ "diplomacia",
30
+ "escuta ativa",
31
+ "trabalho em equipe"
32
+ ],
33
+ 'ambiente_ideal': [
34
+ "dinâmico",
35
+ "desafiador",
36
+ "com autonomia",
37
+ "orientado a resultados",
38
+ "competitivo"
39
+ ]
40
+ },
41
+ 'I': {
42
+ 'caracteristicas_principais': [
43
+ "comunicação expressiva",
44
+ "entusiasmo",
45
+ "sociabilidade",
46
+ "otimismo",
47
+ "persuasão"
48
+ ],
49
+ 'pontos_fortes': [
50
+ "carisma",
51
+ "networking",
52
+ "criatividade",
53
+ "motivação",
54
+ "adaptabilidade social"
55
+ ],
56
+ 'areas_desenvolvimento': [
57
+ "organização",
58
+ "foco",
59
+ "gestão do tempo",
60
+ "atenção a detalhes",
61
+ "conclusão de tarefas"
62
+ ],
63
+ 'ambiente_ideal': [
64
+ "social",
65
+ "colaborativo",
66
+ "dinâmico",
67
+ "com reconhecimento",
68
+ "flexível"
69
+ ]
70
+ },
71
+ 'S': {
72
+ 'caracteristicas_principais': [
73
+ "estabilidade",
74
+ "cooperação",
75
+ "paciência",
76
+ "lealdade",
77
+ "consistência"
78
+ ],
79
+ 'pontos_fortes': [
80
+ "confiabilidade",
81
+ "mediação",
82
+ "suporte",
83
+ "harmonia",
84
+ "trabalho em equipe"
85
+ ],
86
+ 'areas_desenvolvimento': [
87
+ "proatividade",
88
+ "assertividade",
89
+ "adaptação a mudanças",
90
+ "tomada de decisão",
91
+ "expressão de opiniões"
92
+ ],
93
+ 'ambiente_ideal': [
94
+ "estável",
95
+ "previsível",
96
+ "harmonioso",
97
+ "colaborativo",
98
+ "estruturado"
99
+ ]
100
+ },
101
+ 'C': {
102
+ 'caracteristicas_principais': [
103
+ "análise",
104
+ "precisão",
105
+ "organização",
106
+ "sistemático",
107
+ "atenção a detalhes"
108
+ ],
109
+ 'pontos_fortes': [
110
+ "qualidade",
111
+ "planejamento",
112
+ "metodologia",
113
+ "processos",
114
+ "compliance"
115
+ ],
116
+ 'areas_desenvolvimento': [
117
+ "flexibilidade",
118
+ "rapidez decisória",
119
+ "relacionamentos",
120
+ "expressão emocional",
121
+ "tolerância a riscos"
122
+ ],
123
+ 'ambiente_ideal': [
124
+ "estruturado",
125
+ "organizado",
126
+ "com regras claras",
127
+ "focado em qualidade",
128
+ "metódico"
129
+ ]
130
+ }
131
  }
132
 
133
  # Questionário DISC
134
+ DISC_QUESTIONS = [
135
  {
136
  "pergunta": "Em situações de trabalho em equipe, eu geralmente:",
137
  "opcoes": [
 
179
  }
180
  ]
181
 
182
+ def get_caracteristicas_principais(perfil):
183
+ """Retorna características principais do perfil."""
184
+ return ", ".join(DISC_BASE[perfil]['caracteristicas_principais'][:3])
185
+
186
+ def get_caracteristicas_secundarias(perfil):
187
+ """Retorna características secundárias do perfil."""
188
+ return ", ".join(DISC_BASE[perfil]['caracteristicas_principais'][3:])
189
+
190
+ def get_pontos_fortes(perfil):
191
+ """Retorna pontos fortes do perfil."""
192
+ return ", ".join(DISC_BASE[perfil]['pontos_fortes'])
193
+
194
+ def get_contextos_ideais(perfil):
195
+ """Retorna contextos ideais para o perfil."""
196
+ return ", ".join(DISC_BASE[perfil]['ambiente_ideal'])
197
+
198
+ def get_contribuicoes_principais(perfil):
199
+ """Retorna principais contribuições do perfil."""
200
+ contribuicoes = {
201
+ 'D': "liderar projetos e tomar decisões estratégicas",
202
+ 'I': "motivar equipes e criar engajamento",
203
+ 'S': "manter a estabilidade e promover cooperação",
204
+ 'C': "garantir qualidade e precisão nos processos"
205
+ }
206
+ return contribuicoes[perfil]
207
+
208
+ def get_aplicacoes_praticas(perfil):
209
+ """Retorna aplicações práticas para o perfil."""
210
+ aplicacoes = {
211
+ 'D': "gestão de projetos, tomada de decisão e resolução de problemas",
212
+ 'I': "comunicação, vendas e desenvolvimento de equipes",
213
+ 'S': "suporte, mediação e gestão de relacionamentos",
214
+ 'C': "análise, planejamento e controle de qualidade"
215
+ }
216
+ return aplicacoes[perfil]
217
+
218
+ def get_areas_desenvolvimento(perfil):
219
+ """Retorna áreas de desenvolvimento do perfil."""
220
+ return ", ".join(DISC_BASE[perfil]['areas_desenvolvimento'])
221
+
222
+ def get_estrategias_desenvolvimento(perfil):
223
+ """Retorna estratégias de desenvolvimento para o perfil."""
224
+ estrategias = {
225
+ 'D': "desenvolvimento de habilidades interpessoais e paciência",
226
+ 'I': "aprimoramento do foco e da organização",
227
+ 'S': "desenvolvimento de proatividade e adaptabilidade",
228
+ 'C': "trabalho na flexibilidade e rapidez decisória"
229
+ }
230
+ return estrategias[perfil]
231
+
232
+ def get_recomendacoes_praticas(perfil_principal, perfil_secundario):
233
+ """Retorna recomendações práticas baseadas na combinação de perfis."""
234
+ return f"desenvolvimento equilibrado entre as características {perfil_principal} e {perfil_secundario}"
235
+
236
  def calcular_perfil(respostas):
237
+ """Calcula os percentuais de cada perfil DISC."""
238
  contagem = {'D': 0, 'I': 0, 'S': 0, 'C': 0}
239
 
240
  for resposta in respostas:
241
+ if resposta:
242
+ perfil = resposta.split()[0]
243
  contagem[perfil] += 1
244
 
 
245
  total = sum(contagem.values())
246
  if total > 0:
247
  percentuais = {k: (v/total) * 100 for k, v in contagem.items()}
 
250
 
251
  return percentuais
252
 
253
+ def gerar_relatorio(percentuais):
254
+ """Gera o relatório completo baseado nos percentuais DISC."""
255
+ perfis_ordenados = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True))
256
+ perfil_dominante = list(perfis_ordenados.keys())[0]
257
+ perfil_secundario = list(perfis_ordenados.keys())[1]
 
258
 
259
+ # Gerar embedding para análise personalizada
260
+ texto_base = f"""
261
+ Perfil dominante {perfil_dominante}: {', '.join(DISC_BASE[perfil_dominante]['caracteristicas_principais'])}
262
+ Perfil secundário {perfil_secundario}: {', '.join(DISC_BASE[perfil_secundario]['caracteristicas_principais'])}
263
+ Intensidade principal: {perfis_ordenados[perfil_dominante]:.1f}%
264
+ Intensidade secundária: {perfis_ordenados[perfil_secundario]:.1f}%
265
+ """
 
 
 
 
 
 
 
 
 
 
 
266
 
267
+ embedding_base = model.encode([texto_base])[0]
 
 
 
268
 
269
+ # Gerar parágrafos personalizados
270
+ p1 = f"""Seu perfil comportamental apresenta uma predominância do tipo {perfil_dominante} ({perfis_ordenados[perfil_dominante]:.1f}%),
271
+ caracterizado por {get_caracteristicas_principais(perfil_dominante)}, com influência secundária do tipo {perfil_secundario}
272
+ ({perfis_ordenados[perfil_secundario]:.1f}%), que adiciona elementos de {get_caracteristicas_principais(perfil_secundario)}."""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
273
 
274
+ p2 = f"""Seus principais pontos fortes incluem {get_pontos_fortes(perfil_dominante)}.
275
+ Você tende a se destacar em ambientes que sejam {get_contextos_ideais(perfil_dominante)},
276
+ onde pode contribuir efetivamente através de {get_contribuicoes_principais(perfil_dominante)}.
277
+ Suas habilidades são particularmente valiosas em situações que envolvam {get_aplicacoes_praticas(perfil_dominante)}."""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
278
 
279
+ p3 = f"""Para potencializar seu desenvolvimento, considere focar em {get_areas_desenvolvimento(perfil_dominante)}.
280
+ Recomenda-se atenção especial ao {get_estrategias_desenvolvimento(perfil_dominante)},
281
+ buscando um {get_recomendacoes_praticas(perfil_dominante, perfil_secundario)}."""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
282
 
283
+ return f"""RELATÓRIO DE ANÁLISE COMPORTAMENTAL DISC
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
284
 
285
  {p1}
 
286
 
287
  {p2}
 
288
 
289
  {p3}
290
+
291
+ Distribuição completa dos perfis DISC:
292
+ {', '.join([f'{k}: {v:.1f}%' for k, v in perfis_ordenados.items()])}"""
293
 
294
  def processar_questionario(*args):
295
+ """Processa as respostas do questionário e gera o relatório."""
296
  respostas = list(args)
 
 
297
  percentuais = calcular_perfil(respostas)
298
+ return gerar_relatorio(percentuais)
 
 
 
 
299
 
300
  # Interface Gradio
301
  with gr.Blocks(title="Análise de Perfil DISC") as iface:
302
  gr.Markdown("# Análise de Perfil Comportamental DISC")
303
+ gr.Markdown("### Responda às questões abaixo conforme seu comportamento mais natural")
304
 
305
  # Lista para armazenar os componentes de rádio
306
  radio_components = []
307
 
308
  # Criar questões
309
+ for i, questao in enumerate(DISC_QUESTIONS):
310
  gr.Markdown(f"### {questao['pergunta']}")
311
  radio = gr.Radio(
312
  choices=[f"{perfil} - {desc}" for perfil, desc in questao['opcoes']],