DHEIVER commited on
Commit
7869e46
·
verified ·
1 Parent(s): 60d3016

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +206 -109
app.py CHANGED
@@ -1,10 +1,42 @@
1
  import gradio as gr
2
  from sentence_transformers import SentenceTransformer
 
3
  import numpy as np
4
 
5
- # Modelo para embeddings
6
  model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  # Questionário DISC
9
  disc_questions = [
10
  {
@@ -33,95 +65,26 @@ disc_questions = [
33
  ("S", "Ouvir atentamente e contribuir quando solicitado"),
34
  ("C", "Tomar notas e questionar os detalhes")
35
  ]
36
- }
37
- ]
38
-
39
- perfis_caracteristicas = {
40
- 'D': {
41
- 'pontos_fortes': [
42
- "Capacidade de liderança",
43
- "Foco em resultados",
44
- "Tomada rápida de decisão",
45
- "Assertividade",
46
- "Iniciativa"
47
- ],
48
- 'areas_desenvolvimento': [
49
- "Paciência com outros",
50
- "Sensibilidade às necessidades alheias",
51
- "Diplomacia",
52
- "Atenção aos detalhes"
53
- ],
54
- 'ambiente_ideal': [
55
- "Competitivo",
56
- "Com autonomia",
57
- "Orientado a resultados",
58
- "Com desafios constantes"
59
- ]
60
  },
61
- 'I': {
62
- 'pontos_fortes': [
63
- "Comunicação",
64
- "Entusiasmo",
65
- "Networking",
66
- "Criatividade",
67
- "Persuasão"
68
- ],
69
- 'areas_desenvolvimento': [
70
- "Organização",
71
- "Foco",
72
- "Conclusão de tarefas",
73
- "Atenção aos detalhes"
74
- ],
75
- 'ambiente_ideal': [
76
- "Social",
77
- "Colaborativo",
78
- "Dinâmico",
79
- "Com reconhecimento público"
80
- ]
81
- },
82
- 'S': {
83
- 'pontos_fortes': [
84
- "Estabilidade",
85
- "Confiabilidade",
86
- "Trabalho em equipe",
87
- "Paciência",
88
- "Lealdade"
89
- ],
90
- 'areas_desenvolvimento': [
91
- "Adaptação a mudanças",
92
- "Assertividade",
93
- "Iniciativa",
94
- "Tomada de decisão"
95
- ],
96
- 'ambiente_ideal': [
97
- "Estável",
98
- "Previsível",
99
- "Cooperativo",
100
- "Com rotinas claras"
101
  ]
102
  },
103
- 'C': {
104
- 'pontos_fortes': [
105
- "Precisão",
106
- "Análise",
107
- "Organização",
108
- "Qualidade",
109
- "Planejamento"
110
- ],
111
- 'areas_desenvolvimento': [
112
- "Flexibilidade",
113
- "Velocidade",
114
- "Expressão emocional",
115
- "Tomada de risco"
116
- ],
117
- 'ambiente_ideal': [
118
- "Estruturado",
119
- "Com regras claras",
120
- "Focado em qualidade",
121
- "Com tempo para análise"
122
  ]
123
  }
124
- }
125
 
126
  def calcular_perfil(respostas):
127
  # Contar frequência de cada perfil
@@ -134,40 +97,174 @@ def calcular_perfil(respostas):
134
 
135
  # Calcular porcentagens
136
  total = sum(contagem.values())
137
- if total > 0: # Evita divisão por zero
138
  percentuais = {k: (v/total) * 100 for k, v in contagem.items()}
139
  else:
140
  percentuais = {k: 0 for k in contagem.keys()}
141
 
142
  return percentuais
143
 
144
- def gerar_relatorio(percentuais):
145
- # Ordenar perfis por porcentagem
146
- perfis_ordenados = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True))
147
- perfil_dominante = list(perfis_ordenados.keys())[0]
148
 
149
- # Cabeçalho do relatório
150
- relatorio = "RELATÓRIO DE PERFIL COMPORTAMENTAL DISC\n\n"
151
 
152
- # Resultados percentuais
153
- relatorio += "DISTRIBUIÇÃO DOS PERFIS:\n"
154
- for perfil, porcentagem in perfis_ordenados.items():
155
- relatorio += f"{perfil}: {porcentagem:.1f}%\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
 
157
- relatorio += f"\nPERFIL PREDOMINANTE: {perfil_dominante}\n\n"
 
 
 
158
 
159
- # Características do perfil dominante
160
- relatorio += "PONTOS FORTES:\n"
161
- for ponto in perfis_caracteristicas[perfil_dominante]['pontos_fortes']:
162
- relatorio += f"- {ponto}\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
 
164
- relatorio += "\nÁREAS DE DESENVOLVIMENTO:\n"
165
- for area in perfis_caracteristicas[perfil_dominante]['areas_desenvolvimento']:
166
- relatorio += f"- {area}\n"
 
167
 
168
- relatorio += "\nAMBIENTE IDEAL DE TRABALHO:\n"
169
- for caracteristica in perfis_caracteristicas[perfil_dominante]['ambiente_ideal']:
170
- relatorio += f"- {caracteristica}\n"
 
 
 
 
 
 
 
 
171
 
172
  return relatorio
173
 
@@ -184,7 +281,7 @@ def processar_questionario(*args):
184
  return relatorio
185
 
186
  # Interface Gradio
187
- with gr.Blocks(title="Questionário DISC") as iface:
188
  gr.Markdown("# Análise de Perfil Comportamental DISC")
189
 
190
  # Lista para armazenar os componentes de rádio
@@ -200,7 +297,7 @@ with gr.Blocks(title="Questionário DISC") as iface:
200
  radio_components.append(radio)
201
 
202
  # Saída
203
- output = gr.Textbox(label="Relatório", lines=20)
204
 
205
  # Botão
206
  btn = gr.Button("Gerar Relatório")
 
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
 
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
  {
 
65
  ("S", "Ouvir atentamente e contribuir quando solicitado"),
66
  ("C", "Tomar notas e questionar os detalhes")
67
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  },
69
+ {
70
+ "pergunta": "Ao lidar com mudanças, eu:",
71
+ "opcoes": [
72
+ ("D", "Abraço a mudança e lidero a implementação"),
73
+ ("I", "Entusiasmo os outros sobre as novas possibilidades"),
74
+ ("S", "Adapto-me gradualmente seguindo o processo"),
75
+ ("C", "Analiso os impactos antes de aceitar")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  ]
77
  },
78
+ {
79
+ "pergunta": "Sob pressão, eu tendo a:",
80
+ "opcoes": [
81
+ ("D", "Tornar-me mais direto e exigente"),
82
+ ("I", "Falar mais e buscar apoio dos outros"),
83
+ ("S", "Buscar estabilidade e manter a calma"),
84
+ ("C", "Focar em detalhes e procedimentos")
 
 
 
 
 
 
 
 
 
 
 
 
85
  ]
86
  }
87
+ ]
88
 
89
  def calcular_perfil(respostas):
90
  # Contar frequência de cada perfil
 
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()}
102
  else:
103
  percentuais = {k: 0 for k in contagem.keys()}
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
 
 
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
 
297
  radio_components.append(radio)
298
 
299
  # Saída
300
+ output = gr.Textbox(label="Relatório de Perfil DISC", lines=20)
301
 
302
  # Botão
303
  btn = gr.Button("Gerar Relatório")