DHEIVER commited on
Commit
3b48b04
·
verified ·
1 Parent(s): 125fe7d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +123 -455
app.py CHANGED
@@ -1,10 +1,9 @@
1
  import gradio as gr
 
2
  from sentence_transformers import SentenceTransformer
3
- from sklearn.metrics.pairwise import cosine_similarity
4
  import numpy as np
5
- import plotly.graph_objects as go
6
 
7
- # Initialize model
8
  model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
9
 
10
  # Questionário DISC
@@ -56,211 +55,71 @@ DISC_QUESTIONS = [
56
  }
57
  ]
58
 
59
- # Enhanced knowledge base
60
- DISC_PROFILES = {
61
  'D': {
62
- 'nome': 'Dominância',
63
- 'caracteristicas': {
64
- 'alto': [
65
- "Focado em resultados e ação imediata",
66
- "Direto e assertivo na comunicação",
67
- "Competitivo e determinado",
68
- "Assume naturalmente posições de liderança",
69
- "Orientado para desafios e conquistas"
70
- ],
71
- 'baixo': [
72
- "Mais colaborativo e menos confrontador",
73
- "Prefere ambientes harmoniosos",
74
- "Tende a evitar conflitos",
75
- "Mais cauteloso na tomada de decisões",
76
- "Busca consenso em vez de imposição"
77
- ]
78
- },
79
- 'ambiente_ideal': {
80
- 'alto': [
81
- "Ambientes competitivos",
82
- "Situações que exigem decisões rápidas",
83
- "Projetos desafiadores",
84
- "Autonomia na execução",
85
- "Oportunidades de liderança"
86
- ],
87
- 'baixo': [
88
- "Ambientes colaborativos",
89
- "Trabalho em equipe",
90
- "Projetos estruturados",
91
- "Suporte de liderança",
92
- "Foco em cooperação"
93
- ]
94
- },
95
- 'recomendacoes': {
96
- 'alto': [
97
- "Desenvolver mais empatia e paciência",
98
- "Praticar escuta ativa",
99
- "Considerar diferentes perspectivas",
100
- "Equilibrar assertividade com diplomacia",
101
- "Fortalecer habilidades de trabalho em equipe"
102
- ],
103
- 'baixo': [
104
- "Desenvolver mais assertividade",
105
- "Praticar tomada de decisão",
106
- "Expressar opiniões com mais confiança",
107
- "Assumir mais riscos calculados",
108
- "Fortalecer liderança situacional"
109
- ]
110
- }
111
  },
112
  'I': {
113
- 'nome': 'Influência',
114
- 'caracteristicas': {
115
- 'alto': [
116
- "Comunicativo e expressivo",
117
- "Entusiasta e otimista",
118
- "Sociável e carismático",
119
- "Persuasivo e inspirador",
120
- "Criativo e inovador"
121
- ],
122
- 'baixo': [
123
- "Mais reservado e analítico",
124
- "Prefere comunicação objetiva",
125
- "Foco em fatos e dados",
126
- "Mais formal nas relações",
127
- "Prioriza resultados sobre relacionamentos"
128
- ]
129
- },
130
- 'ambiente_ideal': {
131
- 'alto': [
132
- "Ambientes sociais e dinâmicos",
133
- "Oportunidades de networking",
134
- "Trabalho com pessoas",
135
- "Reconhecimento público",
136
- "Liberdade criativa"
137
- ],
138
- 'baixo': [
139
- "Ambientes mais formais",
140
- "Trabalho individual",
141
- "Projetos técnicos",
142
- "Foco em processos",
143
- "Estrutura definida"
144
- ]
145
- },
146
- 'recomendacoes': {
147
- 'alto': [
148
- "Desenvolver foco e organização",
149
- "Melhorar gestão do tempo",
150
- "Praticar conclusão de tarefas",
151
- "Equilibrar socialização e produtividade",
152
- "Fortalecer análise de dados"
153
- ],
154
- 'baixo': [
155
- "Desenvolver habilidades de networking",
156
- "Praticar comunicação expressiva",
157
- "Participar mais em grupos",
158
- "Explorar criatividade",
159
- "Fortalecer relações interpessoais"
160
- ]
161
- }
162
  },
163
  'S': {
164
- 'nome': 'Estabilidade',
165
- 'caracteristicas': {
166
- 'alto': [
167
- "Paciente e consistente",
168
- "Colaborativo e prestativo",
169
- "Leal e confiável",
170
- "Bom ouvinte",
171
- "Focado em harmonia"
172
- ],
173
- 'baixo': [
174
- "Mais flexível e adaptável",
175
- "Aberto a mudanças rápidas",
176
- "Multitarefa eficiente",
177
- "Dinâmico e versátil",
178
- "Aprecia variedade"
179
- ]
180
- },
181
- 'ambiente_ideal': {
182
- 'alto': [
183
- "Ambientes estáveis e previsíveis",
184
- "Trabalho em equipe",
185
- "Rotinas estabelecidas",
186
- "Mudanças graduais",
187
- "Relacionamentos duradouros"
188
- ],
189
- 'baixo': [
190
- "Ambientes dinâmicos",
191
- "Mudanças frequentes",
192
- "Projetos variados",
193
- "Novos desafios",
194
- "Flexibilidade de rotina"
195
- ]
196
- },
197
- 'recomendacoes': {
198
- 'alto': [
199
- "Desenvolver adaptabilidade",
200
- "Praticar iniciativa",
201
- "Expressar opiniões",
202
- "Lidar melhor com mudanças",
203
- "Fortalecer tomada de decisão"
204
- ],
205
- 'baixo': [
206
- "Desenvolver mais paciência",
207
- "Praticar consistência",
208
- "Fortalecer relacionamentos",
209
- "Melhorar escuta ativa",
210
- "Criar rotinas efetivas"
211
- ]
212
- }
213
  },
214
  'C': {
215
- 'nome': 'Conformidade',
216
- 'caracteristicas': {
217
- 'alto': [
218
- "Analítico e preciso",
219
- "Organizado e sistemático",
220
- "Focado em qualidade",
221
- "Atento aos detalhes",
222
- "Orientado por dados"
223
- ],
224
- 'baixo': [
225
- "Mais flexível com regras",
226
- "Foco em resultados rápidos",
227
- "Prático e objetivo",
228
- "Adaptável a mudanças",
229
- "Tolerante a ambiguidades"
230
- ]
231
- },
232
- 'ambiente_ideal': {
233
- 'alto': [
234
- "Ambientes estruturados",
235
- "Processos claros",
236
- "Foco em qualidade",
237
- "Análise detalhada",
238
- "Padrões definidos"
239
- ],
240
- 'baixo': [
241
- "Ambientes flexíveis",
242
- "Liberdade de processo",
243
- "Foco em resultados",
244
- "Decisões rápidas",
245
- "Adaptabilidade"
246
- ]
247
- },
248
- 'recomendacoes': {
249
- 'alto': [
250
- "Desenvolver flexibilidade",
251
- "Praticar decisões rápidas",
252
- "Lidar melhor com ambiguidade",
253
- "Equilibrar análise e ação",
254
- "Fortalecer relacionamentos"
255
- ],
256
- 'baixo': [
257
- "Desenvolver atenção aos detalhes",
258
- "Melhorar organização",
259
- "Criar sistemas e processos",
260
- "Fortalecer análise crítica",
261
- "Praticar planejamento"
262
- ]
263
- }
264
  }
265
  }
266
 
@@ -277,22 +136,20 @@ def get_intensity_level(percentual):
277
  else:
278
  return "muito baixo"
279
 
280
- def get_profile_description(perfil, percentual):
281
- """Gera descrição personalizada baseada no perfil e sua intensidade."""
282
  nivel = "alto" if percentual >= 50 else "baixo"
283
- caracteristicas = DISC_PROFILES[perfil]['caracteristicas'][nivel]
284
- ambiente = DISC_PROFILES[perfil]['ambiente_ideal'][nivel]
285
- recomendacoes = DISC_PROFILES[perfil]['recomendacoes'][nivel]
286
 
287
- intensidade = get_intensity_level(percentual)
 
288
 
289
- return {
290
- 'nome': DISC_PROFILES[perfil]['nome'],
291
- 'intensidade': intensidade,
292
- 'caracteristicas': caracteristicas,
293
- 'ambiente': ambiente,
294
- 'recomendacoes': recomendacoes
295
- }
296
 
297
  def calcular_perfil(respostas):
298
  """Calcula os percentuais de cada perfil DISC."""
@@ -312,281 +169,92 @@ def calcular_perfil(respostas):
312
  return percentuais
313
 
314
  def create_disc_plot(percentuais):
315
- """Cria um gráfico de barras para visualização do perfil DISC."""
316
- colors = {
317
- 'D': '#FF4B4B',
318
- 'I': '#FFD700',
319
- 'S': '#4CAF50',
320
- 'C': '#2196F3'
321
- }
322
 
323
  fig = go.Figure(data=[
324
  go.Bar(
325
  x=list(percentuais.keys()),
326
  y=list(percentuais.values()),
327
- marker_color=[colors[k] for k in percentuais.keys()],
328
  text=[f'{v:.1f}%' for v in percentuais.values()],
329
  textposition='auto',
330
  )
331
  ])
332
 
333
  fig.update_layout(
334
- title='Distribuição do Perfil DISC',
335
- yaxis_title='Percentual (%)',
336
  yaxis_range=[0, 100],
337
- showlegend=False,
338
  template='plotly_white',
339
  height=400
340
  )
341
-
342
  return fig
343
 
344
- def gerar_relatorio_personalizado(percentuais):
345
- """Gera relatório detalhado e personalizado baseado nos percentuais DISC."""
346
- perfis_ordenados = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True))
347
- perfis_desc = {k: get_profile_description(k, v) for k, v in perfis_ordenados.items()}
 
348
 
349
- perfil_dominante = list(perfis_ordenados.keys())[0]
350
- perfil_secundario = list(perfis_ordenados.keys())[1]
 
351
 
352
- relatorio = f"""ANÁLISE DE PERFIL COMPORTAMENTAL DISC
353
-
354
- VISÃO GERAL
355
- Seu perfil apresenta uma combinação única de características, com {perfis_desc[perfil_dominante]['nome']} ({perfil_dominante}) como traço dominante em nível {perfis_desc[perfil_dominante]['intensidade']} ({perfis_ordenados[perfil_dominante]:.1f}%), seguido por {perfis_desc[perfil_secundario]['nome']} ({perfil_secundario}) em nível {perfis_desc[perfil_secundario]['intensidade']} ({perfis_ordenados[perfil_secundario]:.1f}%).
356
-
357
- CARACTERÍSTICAS PRINCIPAIS
358
- Seu estilo comportamental é marcado por:
359
- • {' e '.join(perfis_desc[perfil_dominante]['caracteristicas'][:3])}
360
- • Com influência secundária de: {' e '.join(perfis_desc[perfil_secundario]['caracteristicas'][:2])}
361
 
362
- AMBIENTE IDEAL DE TRABALHO
363
- Você tende a prosperar em ambientes que oferecem:
364
- {' e '.join(perfis_desc[perfil_dominante]['ambiente'][:3])}
365
- • Complementados por: {' e '.join(perfis_desc[perfil_secundario]['ambiente'][:2])}
366
 
367
- RECOMENDAÇÕES PARA DESENVOLVIMENTO
368
- Para maximizar seu potencial, considere:
369
- • {' e '.join(perfis_desc[perfil_dominante]['recomendacoes'][:3])}
370
- • Adicionalmente: {' e '.join(perfis_desc[perfil_secundario]['recomendacoes'][:2])}
371
 
372
- DISTRIBUIÇÃO COMPLETA DO PERFIL DISC:
373
- {', '.join([f'{k} ({DISC_PROFILES[k]["nome"]}): {v:.1f}%' for k, v in perfis_ordenados.items()])}
374
 
375
- OBSERVAÇÃO: Este perfil representa suas tendências comportamentais naturais. Lembre-se que comportamentos podem ser adaptados conforme o contexto e as necessidades específicas de cada situação."""
376
-
377
- return relatorio
378
-
379
- # Temas e estilos personalizados
380
- CUSTOM_CSS = """
381
- .container {
382
- max-width: 800px;
383
- margin: auto;
384
- }
385
- .question-card {
386
- padding: 20px;
387
- margin: 15px 0;
388
- border-radius: 10px;
389
- background-color: #f8f9fa;
390
- }
391
- .result-card {
392
- padding: 25px;
393
- margin-top: 20px;
394
- border-radius: 10px;
395
- background-color: #ffffff;
396
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
397
- }
398
- .progress-bar {
399
- margin: 20px 0;
400
- padding: 10px;
401
- background: #eef2ff;
402
- border-radius: 8px;
403
- }
404
- .footer {
405
- margin-top: 30px;
406
- text-align: center;
407
- font-size: 0.9em;
408
- color: #666;
409
- }
410
- """
411
 
412
- # Configuração do tema
413
- THEME = gr.themes.Soft(
414
- primary_hue="blue",
415
- secondary_hue="gray",
416
- neutral_hue="slate",
417
- font=["Source Sans Pro", "ui-sans-serif", "system-ui"]
418
- ).set(
419
- button_primary_background_fill="*primary_500",
420
- button_primary_background_fill_hover="*primary_600",
421
- button_secondary_background_fill="*neutral_100",
422
- block_label_text_size="lg",
423
- block_title_text_size="xl",
424
- )
425
 
426
- def update_progress(progress):
427
- """Atualiza o texto de progresso."""
428
- answered = sum(1 for p in progress if p is not None)
429
- return f"{answered}/5 questões respondidas"
430
 
431
  def create_interface():
432
- """Cria interface moderna do Gradio."""
433
- with gr.Blocks(theme=THEME, css=CUSTOM_CSS) as iface:
434
- # Cabeçalho
435
- with gr.Row():
436
- with gr.Column():
437
- gr.Markdown("""
438
- # 🎯 Análise de Perfil Comportamental DISC
439
-
440
- ### Descubra seu perfil comportamental único!
441
-
442
- Este teste ajudará você a entender melhor seu estilo de comportamento natural
443
- e como você pode aproveitar seus pontos fortes no ambiente profissional.
444
-
445
- #### Instruções:
446
- - Responda todas as questões pensando em seu comportamento mais natural
447
- - Não existe resposta certa ou errada
448
- - Escolha a opção que melhor representa como você normalmente age
449
- """)
450
 
451
- # Container principal
452
- with gr.Column(elem_classes="container"):
453
- # Indicador de progresso
454
- progress_text = gr.Markdown("0/5 questões respondidas")
455
-
456
- # Questões
457
- radio_components = []
458
- for i, questao in enumerate(DISC_QUESTIONS, 1):
459
- with gr.Group(elem_classes="question-card"):
460
- gr.Markdown(f"### Questão {i}: {questao['pergunta']}")
461
- radio = gr.Radio(
462
- choices=[f"{perfil} - {desc}" for perfil, desc in questao['opcoes']],
463
- label="Selecione a opção mais adequada:",
464
- interactive=True
465
- )
466
- radio_components.append(radio)
467
-
468
- # Botão de análise
469
- analyze_btn = gr.Button(
470
- "📊 Analisar Perfil",
471
- variant="primary"
472
- )
473
-
474
- # Área de resultados
475
- with gr.Group(visible=False) as result_box:
476
- gr.Markdown("## 📊 Resultado da Análise")
477
-
478
- with gr.Row():
479
- # Gráfico de distribuição
480
- plot = gr.Plot(label="Distribuição DISC")
481
-
482
- # Métricas principais
483
- with gr.Column():
484
- gr.Markdown("### Perfis Principais")
485
- perfil_dominante = gr.Textbox(
486
- label="Perfil Dominante",
487
- show_label=True,
488
- interactive=False
489
- )
490
- perfil_secundario = gr.Textbox(
491
- label="Perfil Secundário",
492
- show_label=True,
493
- interactive=False
494
- )
495
-
496
- # Relatório detalhado
497
- gr.Markdown("### 📝 Relatório Detalhado")
498
- output = gr.Markdown()
499
-
500
- # Botões de ação
501
- with gr.Row():
502
- reset_btn = gr.Button("🔄 Fazer Novo Teste", variant="secondary")
503
- share_btn = gr.Button("📤 Compartilhar Resultado", variant="secondary")
504
-
505
- # Footer
506
- with gr.Row():
507
- gr.Markdown("""
508
- 💡 **Observação:** Este é um teste comportamental indicativo.
509
- Os resultados representam tendências naturais de comportamento.
510
- """)
511
-
512
- # Event handlers
513
- def process_and_visualize(*answers):
514
- """Processa respostas e gera visualizações."""
515
- percentuais = calcular_perfil(answers)
516
- fig = create_disc_plot(percentuais)
517
- report = gerar_relatorio_personalizado(percentuais)
518
-
519
- sorted_profiles = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True))
520
- main_profile = list(sorted_profiles.keys())[0]
521
- secondary_profile = list(sorted_profiles.keys())[1]
522
-
523
- return {
524
- plot: fig,
525
- perfil_dominante: f"{main_profile} ({sorted_profiles[main_profile]:.1f}%)",
526
- perfil_secundario: f"{secondary_profile} ({sorted_profiles[secondary_profile]:.1f}%)",
527
- output: report
528
- }
529
-
530
- def update_display(*answers):
531
- """Atualiza a visibilidade dos componentes baseado nas respostas."""
532
- if all(a is not None for a in answers):
533
- return {
534
- result_box: gr.update(visible=True),
535
- analyze_btn: gr.update(interactive=False)
536
- }
537
- return {
538
- result_box: gr.update(visible=False),
539
- analyze_btn: gr.update(interactive=True)
540
- }
541
-
542
- def reset_interface():
543
- """Reinicia a interface para um novo teste."""
544
- return [None] * len(radio_components) + [
545
- gr.update(visible=False),
546
- gr.update(interactive=True),
547
- None, None, None, None,
548
- "0/5 questões respondidas"
549
- ]
550
-
551
- # Event bindings
552
- for radio in radio_components:
553
- radio.change(
554
- lambda *args: update_progress(args),
555
- inputs=radio_components,
556
- outputs=progress_text
557
- )
558
- radio.change(
559
- update_display,
560
- inputs=radio_components,
561
- outputs=[result_box, analyze_btn]
562
- )
563
 
564
- analyze_btn.click(
565
- process_and_visualize,
566
- inputs=radio_components,
567
- outputs=[plot, perfil_dominante, perfil_secundario, output]
568
- )
569
 
570
- reset_btn.click(
571
- reset_interface,
572
- outputs=radio_components + [
573
- result_box,
574
- analyze_btn,
575
- plot,
576
- perfil_dominante,
577
- perfil_secundario,
578
- output,
579
- progress_text
580
- ]
581
- )
582
 
583
- def share_results():
584
- return gr.Info("Link de compartilhamento copiado!")
 
 
 
 
 
 
 
585
 
586
- share_btn.click(share_results)
587
 
588
  return iface
589
 
590
  if __name__ == "__main__":
591
  iface = create_interface()
592
- iface.launch(show_error=True)
 
1
  import gradio as gr
2
+ import plotly.graph_objects as go
3
  from sentence_transformers import SentenceTransformer
 
4
  import numpy as np
 
5
 
6
+ # Initialize the model
7
  model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
8
 
9
  # Questionário DISC
 
55
  }
56
  ]
57
 
58
+ # Base de conhecimento enriquecida para análise semântica
59
+ DISC_INSIGHTS = {
60
  'D': {
61
+ 'alto': [
62
+ "Você demonstra forte capacidade de liderança e tomada de decisão",
63
+ "Sua orientação para resultados é uma característica marcante",
64
+ "Você tende a enfrentar desafios de forma direta e decisiva",
65
+ "Sua assertividade pode ser um grande diferencial em momentos críticos",
66
+ "Você naturalmente assume o controle em situações desafiadoras"
67
+ ],
68
+ 'baixo': [
69
+ "Você prefere uma abordagem mais colaborativa e consensual",
70
+ "Sua tendência é buscar harmonia nas relações profissionais",
71
+ "Você demonstra cuidado ao tomar decisões importantes",
72
+ "Sua abordagem mais ponderada favorece o trabalho em equipe",
73
+ "Você valoriza a construção de consenso nas decisões"
74
+ ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  },
76
  'I': {
77
+ 'alto': [
78
+ "Seu entusiasmo e otimismo são características marcantes",
79
+ "Você tem grande habilidade para inspirar e motivar pessoas",
80
+ "Sua comunicação expressiva é um diferencial importante",
81
+ "Você naturalmente cria conexões positivas com as pessoas",
82
+ "Sua criatividade se destaca em situações sociais"
83
+ ],
84
+ 'baixo': [
85
+ "Você prefere uma comunicação mais objetiva e focada",
86
+ "Sua abordagem analítica favorece resultados concretos",
87
+ "Você valoriza dados e fatos em suas interações",
88
+ "Sua comunicação tende a ser mais formal e estruturada",
89
+ "Você prioriza eficiência sobre interações sociais"
90
+ ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
  },
92
  'S': {
93
+ 'alto': [
94
+ "Sua consistência e confiabilidade são pontos fortes",
95
+ "Você demonstra grande habilidade para trabalho em equipe",
96
+ "Sua paciência e capacidade de escuta são diferenciais",
97
+ "Você contribui para a estabilidade do ambiente",
98
+ "Sua lealdade é uma característica muito valorizada"
99
+ ],
100
+ 'baixo': [
101
+ "Você se adapta facilmente a mudanças e novos cenários",
102
+ "Sua flexibilidade é um ponto forte em ambientes dinâmicos",
103
+ "Você lida bem com múltiplas tarefas simultâneas",
104
+ "Sua versatilidade permite rápidas adaptações",
105
+ "Você aprecia variedade e novos desafios"
106
+ ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
  },
108
  'C': {
109
+ 'alto': [
110
+ "Sua precisão e atenção aos detalhes são notáveis",
111
+ "Você tem forte capacidade analítica e organizacional",
112
+ "Sua busca por qualidade é uma característica marcante",
113
+ "Você valoriza processos bem estruturados",
114
+ "Sua abordagem sistemática garante resultados consistentes"
115
+ ],
116
+ 'baixo': [
117
+ "Você demonstra flexibilidade com regras e processos",
118
+ "Sua praticidade favorece resultados rápidos",
119
+ "Você se adapta bem a ambientes menos estruturados",
120
+ "Sua tolerância à ambiguidade é um diferencial",
121
+ "Você equilibra qualidade com agilidade"
122
+ ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
  }
124
  }
125
 
 
136
  else:
137
  return "muito baixo"
138
 
139
+ def generate_semantic_insights(perfil, percentual):
140
+ """Gera insights baseados em análise semântica."""
141
  nivel = "alto" if percentual >= 50 else "baixo"
142
+ insights = DISC_INSIGHTS[perfil][nivel]
 
 
143
 
144
+ # Criar embedding do perfil
145
+ profile_embedding = model.encode(" ".join(insights))
146
 
147
+ # Selecionar insights mais relevantes baseado em similaridade
148
+ similarities = np.array([np.dot(profile_embedding, model.encode(insight))
149
+ for insight in insights])
150
+ top_insights = [insights[i] for i in similarities.argsort()[-3:]]
151
+
152
+ return top_insights
 
153
 
154
  def calcular_perfil(respostas):
155
  """Calcula os percentuais de cada perfil DISC."""
 
169
  return percentuais
170
 
171
  def create_disc_plot(percentuais):
172
+ """Cria visualização do perfil DISC."""
173
+ cores = {'D': '#FF4B4B', 'I': '#FFD700', 'S': '#4CAF50', 'C': '#2196F3'}
 
 
 
 
 
174
 
175
  fig = go.Figure(data=[
176
  go.Bar(
177
  x=list(percentuais.keys()),
178
  y=list(percentuais.values()),
179
+ marker_color=[cores[k] for k in percentuais.keys()],
180
  text=[f'{v:.1f}%' for v in percentuais.values()],
181
  textposition='auto',
182
  )
183
  ])
184
 
185
  fig.update_layout(
186
+ title='Perfil DISC',
 
187
  yaxis_range=[0, 100],
 
188
  template='plotly_white',
189
  height=400
190
  )
 
191
  return fig
192
 
193
+ def gerar_relatorio(percentuais):
194
+ """Gera relatório detalhado com insights baseados em NLP."""
195
+ perfis = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True))
196
+ principal = list(perfis.keys())[0]
197
+ secundario = list(perfis.keys())[1]
198
 
199
+ # Gerar insights semânticos
200
+ principal_insights = generate_semantic_insights(principal, perfis[principal])
201
+ secundario_insights = generate_semantic_insights(secundario, perfis[secundario])
202
 
203
+ report = f"""# Análise de Perfil DISC
 
 
 
 
 
 
 
 
204
 
205
+ ## Visão Geral
206
+ Seu perfil principal é {principal} com {perfis[principal]:.1f}% (nível {get_intensity_level(perfis[principal])})
207
+ Perfil secundário: {secundario} com {perfis[secundario]:.1f}% (nível {get_intensity_level(perfis[secundario])})
 
208
 
209
+ ## Insights Principais
210
+ {' '.join([f'• {insight}\n' for insight in principal_insights])}
 
 
211
 
212
+ ## Influências Secundárias
213
+ {' '.join([f' {insight}\n' for insight in secundario_insights])}
214
 
215
+ ## Distribuição DISC Completa:
216
+ {', '.join([f'{k}: {v:.1f}%' for k, v in perfis.items()])}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217
 
218
+ ## Observação
219
+ Este perfil representa suas tendências comportamentais naturais. Os comportamentos podem ser adaptados conforme o contexto e as necessidades específicas."""
 
 
 
 
 
 
 
 
 
 
 
220
 
221
+ return report
 
 
 
222
 
223
  def create_interface():
224
+ """Cria interface moderna do teste."""
225
+ with gr.Blocks() as iface:
226
+ gr.Markdown("# 🎯 Análise de Perfil DISC")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
227
 
228
+ # Questões
229
+ radios = []
230
+ for i, q in enumerate(DISC_QUESTIONS, 1):
231
+ gr.Markdown(f"### {i}. {q['pergunta']}")
232
+ radio = gr.Radio([f"{p} - {d}" for p, d in q['opcoes']])
233
+ radios.append(radio)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234
 
235
+ # Resultados
236
+ with gr.Group(visible=False) as result_box:
237
+ plot = gr.Plot()
238
+ output = gr.Markdown()
 
239
 
240
+ # Botões
241
+ analyze_btn = gr.Button("Analisar Perfil")
242
+ reset_btn = gr.Button("Novo Teste")
 
 
 
 
 
 
 
 
 
243
 
244
+ def process_results(*answers):
245
+ perc = calcular_perfil(answers)
246
+ return create_disc_plot(perc), gerar_relatorio(perc)
247
+
248
+ analyze_btn.click(
249
+ process_results,
250
+ inputs=radios,
251
+ outputs=[plot, output]
252
+ )
253
 
254
+ reset_btn.click(lambda: [None]*7, outputs=radios + [plot, output])
255
 
256
  return iface
257
 
258
  if __name__ == "__main__":
259
  iface = create_interface()
260
+ iface.launch()