DHEIVER commited on
Commit
f33f8df
·
verified ·
1 Parent(s): e29185d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +195 -23
app.py CHANGED
@@ -3,6 +3,65 @@ import numpy as np
3
  from transformers import pipeline
4
  import pandas as pd
5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  class DiscAnalyzer:
7
  def __init__(self):
8
  self.disc_profiles = {
@@ -12,6 +71,90 @@ class DiscAnalyzer:
12
  'C': 'Conformidade'
13
  }
14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  self.generator = pipeline(
16
  "text-generation",
17
  model="facebook/opt-125m",
@@ -19,12 +162,18 @@ class DiscAnalyzer:
19
  )
20
 
21
  def generate_llm_report(self, scores, perfil_principal):
 
 
 
 
 
 
22
  prompt = f"""Analise o perfil DISC:
23
  D:{scores['D']:.1f}% I:{scores['I']:.1f}% S:{scores['S']:.1f}% C:{scores['C']:.1f}%
24
  Perfil Principal: {self.disc_profiles[perfil_principal]}
25
  """
26
  try:
27
- output = self.generator(
28
  prompt,
29
  max_length=300,
30
  num_return_sequences=1,
@@ -32,11 +181,25 @@ Perfil Principal: {self.disc_profiles[perfil_principal]}
32
  top_p=0.9,
33
  do_sample=True
34
  )
35
- return output[0]['generated_text'].replace(prompt, "").strip()
 
 
 
 
 
 
 
 
 
 
 
36
  except Exception as e:
37
- return f"Erro ao gerar relatório: {str(e)}"
38
 
39
  def avaliar_disc(self, *args):
 
 
 
40
  responses = [int(arg) for arg in args]
41
 
42
  scores = {
@@ -57,7 +220,7 @@ Perfil Principal: {self.disc_profiles[perfil_principal]}
57
  })
58
 
59
  return (
60
- f"**{self.disc_profiles[perfil_principal]} ({perfil_principal})**",
61
  relatorio_llm,
62
  df,
63
  gr.update(visible=True), # Mostrar seção de resultados
@@ -65,6 +228,9 @@ Perfil Principal: {self.disc_profiles[perfil_principal]}
65
  )
66
 
67
  def create_disc_interface():
 
 
 
68
  analyzer = DiscAnalyzer()
69
 
70
  with gr.Blocks(
@@ -73,22 +239,24 @@ def create_disc_interface():
73
  primary_hue="blue",
74
  secondary_hue="purple",
75
  ),
 
76
  ) as interface:
77
  # Cabeçalho
78
- with gr.Box():
79
  gr.Markdown(
80
  """
81
- # 🎯 Analisador de Perfil DISC com IA
82
- #### Descubra seu estilo comportamental com análise personalizada
83
  """
84
  )
85
 
86
  # Container do questionário
87
- with gr.Box() as questionnaire_container:
88
  gr.Markdown(
89
  """
90
  ### 📝 Questionário DISC
91
  Avalie cada afirmação de acordo com sua identificação:
 
92
  - 1 = Discordo totalmente
93
  - 2 = Discordo parcialmente
94
  - 3 = Concordo parcialmente
@@ -126,33 +294,36 @@ def create_disc_interface():
126
 
127
  sliders = []
128
  for categoria, perguntas in questions.items():
129
- with gr.Box():
130
- gr.Markdown(f"#### {categoria}")
131
  for i, pergunta in enumerate(perguntas, 1):
132
- slider = gr.Slider(
133
- minimum=1,
134
- maximum=4,
135
- value=2,
136
- step=1,
137
- label=pergunta,
138
- interactive=True
139
- )
140
- sliders.append(slider)
 
141
 
142
  analyze_btn = gr.Button(
143
  "📊 Analisar Perfil",
144
  variant="primary",
 
145
  size="lg"
146
  )
147
 
148
  # Container dos resultados (inicialmente oculto)
149
- with gr.Box(visible=False) as results_container:
150
- gr.Markdown("### 📊 Resultados da Análise")
151
 
152
  with gr.Row():
153
  with gr.Column(scale=1):
154
  perfil_output = gr.Markdown(
155
- label="Perfil Principal"
 
156
  )
157
 
158
  with gr.Row():
@@ -167,7 +338,8 @@ def create_disc_interface():
167
  )
168
  with gr.Column(scale=3):
169
  relatorio_output = gr.Markdown(
170
- label="Análise Detalhada"
 
171
  )
172
 
173
  # Botão para novo teste
 
3
  from transformers import pipeline
4
  import pandas as pd
5
 
6
+ # CSS personalizado para melhorar a aparência
7
+ CUSTOM_CSS = """
8
+ .container {
9
+ max-width: 1200px;
10
+ margin: 0 auto;
11
+ padding: 20px;
12
+ }
13
+ .header-box {
14
+ background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
15
+ color: white;
16
+ padding: 2rem;
17
+ border-radius: 10px;
18
+ margin-bottom: 2rem;
19
+ text-align: center;
20
+ }
21
+ .question-box {
22
+ background: #f8f9fa;
23
+ border: 1px solid #e9ecef;
24
+ border-radius: 8px;
25
+ padding: 1.5rem;
26
+ margin-bottom: 1rem;
27
+ box-shadow: 0 2px 4px rgba(0,0,0,0.05);
28
+ }
29
+ .category-title {
30
+ color: #2a5298;
31
+ border-bottom: 2px solid #2a5298;
32
+ padding-bottom: 0.5rem;
33
+ margin-bottom: 1rem;
34
+ }
35
+ .results-container {
36
+ background: white;
37
+ border-radius: 10px;
38
+ padding: 2rem;
39
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
40
+ }
41
+ .profile-card {
42
+ background: #f8f9fa;
43
+ border-radius: 8px;
44
+ padding: 1.5rem;
45
+ margin-bottom: 1rem;
46
+ text-align: center;
47
+ }
48
+ .slider-container {
49
+ margin: 10px 0;
50
+ }
51
+ .button-primary {
52
+ background: #2a5298 !important;
53
+ color: white !important;
54
+ padding: 12px 24px !important;
55
+ font-weight: bold !important;
56
+ }
57
+ .results-title {
58
+ font-size: 1.5rem;
59
+ color: #2a5298;
60
+ text-align: center;
61
+ margin-bottom: 1rem;
62
+ }
63
+ """
64
+
65
  class DiscAnalyzer:
66
  def __init__(self):
67
  self.disc_profiles = {
 
71
  'C': 'Conformidade'
72
  }
73
 
74
+ self.profile_descriptions = {
75
+ 'D': """
76
+ ## Perfil Dominância (D)
77
+
78
+ ### Características Principais:
79
+ - Direto e decisivo
80
+ - Focado em resultados
81
+ - Assume riscos calculados
82
+ - Forte senso de liderança
83
+
84
+ ### Pontos Fortes:
85
+ - Tomada de decisão rápida
86
+ - Determinação
87
+ - Orientação para resultados
88
+ - Iniciativa
89
+
90
+ ### Sugestões de Desenvolvimento:
91
+ - Desenvolver paciência
92
+ - Considerar opiniões alheias
93
+ - Praticar escuta ativa
94
+ """,
95
+ 'I': """
96
+ ## Perfil Influência (I)
97
+
98
+ ### Características Principais:
99
+ - Comunicativo e entusiasta
100
+ - Sociável e otimista
101
+ - Persuasivo
102
+ - Foco em relacionamentos
103
+
104
+ ### Pontos Fortes:
105
+ - Networking
106
+ - Comunicação
107
+ - Motivação de equipes
108
+ - Criatividade
109
+
110
+ ### Sugestões de Desenvolvimento:
111
+ - Melhorar organização
112
+ - Focar em detalhes
113
+ - Gerenciar melhor o tempo
114
+ """,
115
+ 'S': """
116
+ ## Perfil Estabilidade (S)
117
+
118
+ ### Características Principais:
119
+ - Paciente e consistente
120
+ - Bom ouvinte
121
+ - Leal e confiável
122
+ - Trabalho em equipe
123
+
124
+ ### Pontos Fortes:
125
+ - Cooperação
126
+ - Confiabilidade
127
+ - Suporte a equipe
128
+ - Planejamento
129
+
130
+ ### Sugestões de Desenvolvimento:
131
+ - Ser mais assertivo
132
+ - Adaptar-se a mudanças
133
+ - Expressar opiniões
134
+ """,
135
+ 'C': """
136
+ ## Perfil Conformidade (C)
137
+
138
+ ### Características Principais:
139
+ - Analítico e preciso
140
+ - Foco em qualidade
141
+ - Organizado
142
+ - Atenção aos detalhes
143
+
144
+ ### Pontos Fortes:
145
+ - Análise crítica
146
+ - Precisão
147
+ - Organização
148
+ - Controle de qualidade
149
+
150
+ ### Sugestões de Desenvolvimento:
151
+ - Ser mais flexível
152
+ - Tomar decisões mais rápidas
153
+ - Desenvolver habilidades sociais
154
+ """
155
+ }
156
+
157
+ # Inicializar modelo
158
  self.generator = pipeline(
159
  "text-generation",
160
  model="facebook/opt-125m",
 
162
  )
163
 
164
  def generate_llm_report(self, scores, perfil_principal):
165
+ """
166
+ Gera relatório personalizado usando modelo do Hugging Face baseado nos scores DISC.
167
+ Combina a saída do modelo com descrições predefinidas para maior qualidade.
168
+ """
169
+ base_description = self.profile_descriptions[perfil_principal]
170
+
171
  prompt = f"""Analise o perfil DISC:
172
  D:{scores['D']:.1f}% I:{scores['I']:.1f}% S:{scores['S']:.1f}% C:{scores['C']:.1f}%
173
  Perfil Principal: {self.disc_profiles[perfil_principal]}
174
  """
175
  try:
176
+ llm_output = self.generator(
177
  prompt,
178
  max_length=300,
179
  num_return_sequences=1,
 
181
  top_p=0.9,
182
  do_sample=True
183
  )
184
+
185
+ ai_insights = llm_output[0]['generated_text'].replace(prompt, "").strip()
186
+
187
+ # Combinar descrição base com insights da IA
188
+ complete_report = f"""
189
+ {base_description}
190
+
191
+ ### Análise Personalizada:
192
+ {ai_insights}
193
+ """
194
+ return complete_report
195
+
196
  except Exception as e:
197
+ return base_description
198
 
199
  def avaliar_disc(self, *args):
200
+ """
201
+ Avalia o perfil DISC baseado nas respostas do questionário.
202
+ """
203
  responses = [int(arg) for arg in args]
204
 
205
  scores = {
 
220
  })
221
 
222
  return (
223
+ f"### Seu perfil principal é: {self.disc_profiles[perfil_principal]} ({perfil_principal})",
224
  relatorio_llm,
225
  df,
226
  gr.update(visible=True), # Mostrar seção de resultados
 
228
  )
229
 
230
  def create_disc_interface():
231
+ """
232
+ Cria a interface Gradio para o analisador DISC.
233
+ """
234
  analyzer = DiscAnalyzer()
235
 
236
  with gr.Blocks(
 
239
  primary_hue="blue",
240
  secondary_hue="purple",
241
  ),
242
+ css=CUSTOM_CSS
243
  ) as interface:
244
  # Cabeçalho
245
+ with gr.Box(elem_classes=["header-box"]):
246
  gr.Markdown(
247
  """
248
+ # 🎯 Análise de Perfil DISC Profissional
249
+ #### Descubra suas características comportamentais através de IA
250
  """
251
  )
252
 
253
  # Container do questionário
254
+ with gr.Box(elem_classes=["container"]) as questionnaire_container:
255
  gr.Markdown(
256
  """
257
  ### 📝 Questionário DISC
258
  Avalie cada afirmação de acordo com sua identificação:
259
+
260
  - 1 = Discordo totalmente
261
  - 2 = Discordo parcialmente
262
  - 3 = Concordo parcialmente
 
294
 
295
  sliders = []
296
  for categoria, perguntas in questions.items():
297
+ with gr.Box(elem_classes=["question-box"]):
298
+ gr.Markdown(f"#### {categoria}", elem_classes=["category-title"])
299
  for i, pergunta in enumerate(perguntas, 1):
300
+ with gr.Box(elem_classes=["slider-container"]):
301
+ slider = gr.Slider(
302
+ minimum=1,
303
+ maximum=4,
304
+ value=2,
305
+ step=1,
306
+ label=pergunta,
307
+ interactive=True
308
+ )
309
+ sliders.append(slider)
310
 
311
  analyze_btn = gr.Button(
312
  "📊 Analisar Perfil",
313
  variant="primary",
314
+ elem_classes=["button-primary"],
315
  size="lg"
316
  )
317
 
318
  # Container dos resultados (inicialmente oculto)
319
+ with gr.Box(visible=False, elem_classes=["results-container"]) as results_container:
320
+ gr.Markdown("### 📊 Resultados da Análise", elem_classes=["results-title"])
321
 
322
  with gr.Row():
323
  with gr.Column(scale=1):
324
  perfil_output = gr.Markdown(
325
+ label="Perfil Principal",
326
+ elem_classes=["profile-card"]
327
  )
328
 
329
  with gr.Row():
 
338
  )
339
  with gr.Column(scale=3):
340
  relatorio_output = gr.Markdown(
341
+ label="Análise Detalhada",
342
+ elem_classes=["report-content"]
343
  )
344
 
345
  # Botão para novo teste