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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +138 -59
app.py CHANGED
@@ -1,56 +1,44 @@
1
  import gradio as gr
2
  import numpy as np
3
  from transformers import pipeline
 
4
 
5
  class DiscAnalyzer:
6
  def __init__(self):
7
  self.disc_profiles = {
8
- 'D': 'Dominance',
9
- 'I': 'Influence',
10
- 'S': 'Steadiness',
11
- 'C': 'Compliance'
12
  }
13
 
14
- # Usando um modelo mais leve e otimizado para texto
15
  self.generator = pipeline(
16
  "text-generation",
17
- model="facebook/opt-125m", # Modelo muito mais leve que o BLOOM
18
- device="cpu" # Forçando CPU para evitar problemas de CUDA
19
  )
20
 
21
  def generate_llm_report(self, scores, perfil_principal):
22
- """
23
- Gera relatório personalizado usando modelo mais leve.
24
- """
25
  prompt = f"""Analise o perfil DISC:
26
  D:{scores['D']:.1f}% I:{scores['I']:.1f}% S:{scores['S']:.1f}% C:{scores['C']:.1f}%
27
  Perfil Principal: {self.disc_profiles[perfil_principal]}
28
  """
29
-
30
  try:
31
- # Configurações otimizadas para geração mais rápida
32
  output = self.generator(
33
  prompt,
34
- max_length=300, # Reduzido para resposta mais concisa
35
  num_return_sequences=1,
36
  temperature=0.7,
37
  top_p=0.9,
38
  do_sample=True
39
  )
40
-
41
  return output[0]['generated_text'].replace(prompt, "").strip()
42
-
43
  except Exception as e:
44
  return f"Erro ao gerar relatório: {str(e)}"
45
 
46
  def avaliar_disc(self, *args):
47
- """
48
- Versão otimizada da avaliação DISC.
49
- """
50
- # Converter todos os inputs para números de uma vez
51
  responses = [int(arg) for arg in args]
52
 
53
- # Cálculo otimizado dos scores
54
  scores = {
55
  'D': sum(responses[i] for i in [0, 4, 8, 12]) / 16 * 100,
56
  'I': sum(responses[i] for i in [1, 5, 9, 13]) / 16 * 100,
@@ -60,61 +48,152 @@ Perfil Principal: {self.disc_profiles[perfil_principal]}
60
 
61
  perfil_principal = max(scores, key=scores.get)
62
  relatorio_llm = self.generate_llm_report(scores, perfil_principal)
 
 
 
 
 
 
 
63
 
64
  return (
65
- f"Seu perfil principal é {self.disc_profiles[perfil_principal]} ({perfil_principal})",
66
  relatorio_llm,
67
- {
68
- "Dimensão": list(scores.keys()),
69
- "Score": list(scores.values())
70
- }
71
  )
72
 
73
  def create_disc_interface():
74
  analyzer = DiscAnalyzer()
75
 
76
- with gr.Blocks(title="Análise de Perfil DISC") as interface:
77
- gr.Markdown("# Analisador de Perfil DISC com IA")
78
- gr.Markdown("Responda cada questão com valores de 1 a 4")
79
-
80
- # Criação otimizada das questões
81
- questions = [
82
- "1. Sou direto e decisivo", "2. Sou sociável e entusiasta",
83
- "3. Sou paciente e cooperativo", "4. Sou preciso e analítico",
84
- "5. Gosto de assumir riscos", "6. Sou bom comunicador",
85
- "7. Sou bom ouvinte", "8. Sou organizado",
86
- "9. Tomo iniciativa", "10. Sou persuasivo",
87
- "11. Trabalho bem em equipe", "12. Sou detalhista",
88
- "13. Busco resultados", "14. Sou motivador",
89
- "15. Sou confiável", "16. Sou sistemático"
90
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
91
 
92
- # Criando sliders em grupos de 4
93
- sliders = []
94
- for i in range(0, 16, 4):
95
- with gr.Row():
96
- with gr.Column():
97
- for j in range(4):
98
- sliders.append(gr.Slider(1, 4, value=2, step=1, label=questions[i+j]))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
 
100
- analyze_btn = gr.Button("Analisar Perfil")
 
 
 
 
 
 
 
 
 
 
 
 
 
101
 
102
- with gr.Row():
103
- perfil_output = gr.Textbox(label="Perfil Principal")
104
- relatorio_output = gr.Markdown(label="Relatório Detalhado")
 
 
105
 
106
- plot_output = gr.BarPlot(
107
- x="Dimensão",
108
- y="Score",
109
- title="Scores DISC",
110
- height=400,
111
- width=600
112
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
 
 
114
  analyze_btn.click(
115
  fn=analyzer.avaliar_disc,
116
  inputs=sliders,
117
- outputs=[perfil_output, relatorio_output, plot_output]
 
 
 
 
 
 
 
 
 
 
 
 
118
  )
119
 
120
  return interface
 
1
  import gradio as gr
2
  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 = {
9
+ 'D': 'Dominância',
10
+ 'I': 'Influência',
11
+ 'S': 'Estabilidade',
12
+ 'C': 'Conformidade'
13
  }
14
 
 
15
  self.generator = pipeline(
16
  "text-generation",
17
+ model="facebook/opt-125m",
18
+ device="cpu"
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,
31
  temperature=0.7,
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 = {
43
  'D': sum(responses[i] for i in [0, 4, 8, 12]) / 16 * 100,
44
  'I': sum(responses[i] for i in [1, 5, 9, 13]) / 16 * 100,
 
48
 
49
  perfil_principal = max(scores, key=scores.get)
50
  relatorio_llm = self.generate_llm_report(scores, perfil_principal)
51
+
52
+ # Criar DataFrame para o gráfico
53
+ df = pd.DataFrame({
54
+ "Dimensão": list(scores.keys()),
55
+ "Score": list(scores.values()),
56
+ "Descrição": [self.disc_profiles[k] for k in scores.keys()]
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
64
+ gr.update(visible=False) # Esconder questionário
 
65
  )
66
 
67
  def create_disc_interface():
68
  analyzer = DiscAnalyzer()
69
 
70
+ with gr.Blocks(
71
+ title="Análise de Perfil DISC",
72
+ theme=gr.themes.Soft(
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
95
+ - 4 = Concordo totalmente
96
+ """
97
+ )
98
 
99
+ # Questões organizadas por categoria
100
+ questions = {
101
+ "Dominância (D)": [
102
+ "Sou direto e decisivo",
103
+ "Gosto de assumir riscos",
104
+ "Tomo iniciativa",
105
+ "Busco resultados"
106
+ ],
107
+ "Influência (I)": [
108
+ "Sou sociável e entusiasta",
109
+ "Sou bom comunicador",
110
+ "Sou persuasivo",
111
+ "Sou motivador"
112
+ ],
113
+ "Estabilidade (S)": [
114
+ "Sou paciente e cooperativo",
115
+ "Sou bom ouvinte",
116
+ "Trabalho bem em equipe",
117
+ "Sou confiável"
118
+ ],
119
+ "Conformidade (C)": [
120
+ "Sou preciso e analítico",
121
+ "Sou organizado",
122
+ "Sou detalhista",
123
+ "Sou sistemático"
124
+ ]
125
+ }
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():
159
+ with gr.Column(scale=2):
160
+ plot_output = gr.BarPlot(
161
+ x="Dimensão",
162
+ y="Score",
163
+ title="Perfil DISC",
164
+ tooltip=["Descrição", "Score"],
165
+ height=400,
166
+ color="Dimensão"
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
174
+ new_test_btn = gr.Button(
175
+ "🔄 Fazer Novo Teste",
176
+ variant="secondary",
177
+ size="lg"
178
+ )
179
 
180
+ # Conexões dos botões
181
  analyze_btn.click(
182
  fn=analyzer.avaliar_disc,
183
  inputs=sliders,
184
+ outputs=[
185
+ perfil_output,
186
+ relatorio_output,
187
+ plot_output,
188
+ results_container,
189
+ questionnaire_container
190
+ ]
191
+ )
192
+
193
+ new_test_btn.click(
194
+ fn=lambda: [2] * 16 + [gr.update(visible=True), gr.update(visible=False)],
195
+ inputs=None,
196
+ outputs=sliders + [questionnaire_container, results_container]
197
  )
198
 
199
  return interface