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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +84 -286
app.py CHANGED
@@ -3,65 +3,6 @@ import numpy as np
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,90 +12,7 @@ class DiscAnalyzer:
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,18 +20,12 @@ class DiscAnalyzer:
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,25 +33,11 @@ Perfil Principal: {self.disc_profiles[perfil_principal]}
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 = {
@@ -212,7 +50,6 @@ Perfil Principal: {self.disc_profiles[perfil_principal]}
212
  perfil_principal = max(scores, key=scores.get)
213
  relatorio_llm = self.generate_llm_report(scores, perfil_principal)
214
 
215
- # Criar DataFrame para o gráfico
216
  df = pd.DataFrame({
217
  "Dimensão": list(scores.keys()),
218
  "Score": list(scores.values()),
@@ -220,136 +57,97 @@ Perfil Principal: {self.disc_profiles[perfil_principal]}
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
227
- gr.update(visible=False) # Esconder questionário
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(
237
- title="Análise de Perfil DISC",
238
- theme=gr.themes.Soft(
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
263
- - 4 = Concordo totalmente
264
- """
265
- )
266
-
267
- # Questões organizadas por categoria
268
- questions = {
269
- "Dominância (D)": [
270
- "Sou direto e decisivo",
271
- "Gosto de assumir riscos",
272
- "Tomo iniciativa",
273
- "Busco resultados"
274
- ],
275
- "Influência (I)": [
276
- "Sou sociável e entusiasta",
277
- "Sou bom comunicador",
278
- "Sou persuasivo",
279
- "Sou motivador"
280
- ],
281
- "Estabilidade (S)": [
282
- "Sou paciente e cooperativo",
283
- "Sou bom ouvinte",
284
- "Trabalho bem em equipe",
285
- "Sou confiável"
286
- ],
287
- "Conformidade (C)": [
288
- "Sou preciso e analítico",
289
- "Sou organizado",
290
- "Sou detalhista",
291
- "Sou sistemático"
292
- ]
293
- }
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():
330
- with gr.Column(scale=2):
331
- plot_output = gr.BarPlot(
332
- x="Dimensão",
333
- y="Score",
334
- title="Perfil DISC",
335
- tooltip=["Descrição", "Score"],
336
- height=400,
337
- color="Dimensão"
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
346
- new_test_btn = gr.Button(
347
- "🔄 Fazer Novo Teste",
348
- variant="secondary",
349
- size="lg"
350
- )
351
 
352
- # Conexões dos botões
353
  analyze_btn.click(
354
  fn=analyzer.avaliar_disc,
355
  inputs=sliders,
 
3
  from transformers import pipeline
4
  import pandas as pd
5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  class DiscAnalyzer:
7
  def __init__(self):
8
  self.disc_profiles = {
 
12
  'C': 'Conformidade'
13
  }
14
 
15
+ # Inicializar modelo mais leve
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  self.generator = pipeline(
17
  "text-generation",
18
  model="facebook/opt-125m",
 
20
  )
21
 
22
  def generate_llm_report(self, scores, perfil_principal):
 
 
 
 
 
 
23
  prompt = f"""Analise o perfil DISC:
24
  D:{scores['D']:.1f}% I:{scores['I']:.1f}% S:{scores['S']:.1f}% C:{scores['C']:.1f}%
25
  Perfil Principal: {self.disc_profiles[perfil_principal]}
26
  """
27
  try:
28
+ output = self.generator(
29
  prompt,
30
  max_length=300,
31
  num_return_sequences=1,
 
33
  top_p=0.9,
34
  do_sample=True
35
  )
36
+ return output[0]['generated_text'].replace(prompt, "").strip()
 
 
 
 
 
 
 
 
 
 
 
37
  except Exception as e:
38
+ return f"Erro ao gerar relatório: {str(e)}"
39
 
40
  def avaliar_disc(self, *args):
 
 
 
41
  responses = [int(arg) for arg in args]
42
 
43
  scores = {
 
50
  perfil_principal = max(scores, key=scores.get)
51
  relatorio_llm = self.generate_llm_report(scores, perfil_principal)
52
 
 
53
  df = pd.DataFrame({
54
  "Dimensão": list(scores.keys()),
55
  "Score": list(scores.values()),
 
57
  })
58
 
59
  return (
60
+ f"**{self.disc_profiles[perfil_principal]} ({perfil_principal})**",
61
  relatorio_llm,
62
  df,
63
+ gr.update(visible=True),
64
+ gr.update(visible=False)
65
  )
66
 
67
  def create_disc_interface():
 
 
 
68
  analyzer = DiscAnalyzer()
69
 
70
+ with gr.Blocks(title="Análise de Perfil DISC") as interface:
71
+ gr.Markdown(
72
+ """
73
+ # 🎯 Analisador de Perfil DISC
74
+ #### Descubra seu perfil comportamental
75
+ """
76
+ )
 
 
 
 
 
 
 
 
 
77
 
78
+ with gr.Row() as questionnaire_container:
79
+ with gr.Column():
80
+ gr.Markdown(
81
+ """
82
+ ### Questionário DISC
83
+ Avalie cada afirmação (1 = Discordo totalmente, 4 = Concordo totalmente)
84
+ """
85
+ )
86
+
87
+ questions = {
88
+ "Dominância (D)": [
89
+ "Sou direto e decisivo",
90
+ "Gosto de assumir riscos",
91
+ "Tomo iniciativa",
92
+ "Busco resultados"
93
+ ],
94
+ "Influência (I)": [
95
+ "Sou sociável e entusiasta",
96
+ "Sou bom comunicador",
97
+ "Sou persuasivo",
98
+ "Sou motivador"
99
+ ],
100
+ "Estabilidade (S)": [
101
+ "Sou paciente e cooperativo",
102
+ "Sou bom ouvinte",
103
+ "Trabalho bem em equipe",
104
+ "Sou confiável"
105
+ ],
106
+ "Conformidade (C)": [
107
+ "Sou preciso e analítico",
108
+ "Sou organizado",
109
+ "Sou detalhista",
110
+ "Sou sistemático"
111
+ ]
112
+ }
113
+
114
+ sliders = []
115
+ for categoria, perguntas in questions.items():
116
+ gr.Markdown(f"#### {categoria}")
117
+ for pergunta in perguntas:
118
+ slider = gr.Slider(
119
+ minimum=1,
120
+ maximum=4,
121
+ value=2,
122
+ step=1,
123
+ label=pergunta
124
+ )
125
+ sliders.append(slider)
126
+
127
+ analyze_btn = gr.Button("Analisar Perfil", variant="primary")
128
+
129
+ # Resultados (inicialmente ocultos)
130
+ with gr.Row(visible=False) as results_container:
131
+ with gr.Column():
132
+ gr.Markdown("### Resultados da Análise")
133
 
134
+ perfil_output = gr.Markdown(label="Perfil Principal")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
 
136
+ with gr.Row():
137
+ with gr.Column():
138
+ plot_output = gr.BarPlot(
139
+ x="Dimensão",
140
+ y="Score",
141
+ title="Perfil DISC",
142
+ tooltip=["Descrição", "Score"],
143
+ height=400,
144
+ width=600
145
+ )
146
+ with gr.Column():
147
+ relatorio_output = gr.Markdown(label="Análise Detalhada")
148
+
149
+ new_test_btn = gr.Button("Fazer Novo Teste", variant="secondary")
 
 
 
 
 
 
 
 
150
 
 
151
  analyze_btn.click(
152
  fn=analyzer.avaliar_disc,
153
  inputs=sliders,