DHEIVER commited on
Commit
aeb33b1
·
verified ·
1 Parent(s): ddd5e15

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +198 -76
app.py CHANGED
@@ -3,88 +3,210 @@ from sentence_transformers import SentenceTransformer
3
  from sklearn.metrics.pairwise import cosine_similarity
4
  import numpy as np
5
 
6
- # Carregar o modelo
7
  model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
8
 
9
- # Definir perfis DISC base para comparação
10
- disc_profiles = {
11
- 'D (Dominância)': '''
12
- - Direto e decisivo
13
- - Focado em resultados
14
- - Assume riscos
15
- - Gosta de desafios
16
- - Toma iniciativa
17
- ''',
18
-
19
- 'I (Influência)': '''
20
- - Otimista e entusiasta
21
- - Comunicativo
22
- - Sociável
23
- - Persuasivo
24
- - Expressivo
25
- ''',
26
-
27
- 'S (Estabilidade)': '''
28
- - Paciente e cooperativo
29
- - Leal e confiável
30
- - Calmo e consistente
31
- - Bom ouvinte
32
- - Trabalha bem em equipe
33
- ''',
34
-
35
- 'C (Conformidade)': '''
36
- - Analítico e preciso
37
- - Sistemático
38
- - Focado em qualidade
39
- - Atento aos detalhes
40
- - Segue regras e procedimentos
41
- '''
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  }
43
 
44
- def analyze_disc(user_text):
45
- # Gerar embeddings para o texto do usuário
46
- user_embedding = model.encode([user_text])[0]
47
-
48
- # Gerar embeddings para cada perfil DISC
49
- results = {}
50
- for profile_name, profile_desc in disc_profiles.items():
51
- profile_embedding = model.encode([profile_desc])[0]
52
-
53
- # Calcular similaridade
54
- similarity = cosine_similarity([user_embedding], [profile_embedding])[0][0]
55
- results[profile_name] = float(similarity)
56
-
57
- # Normalizar resultados para soma = 100%
58
- total = sum(results.values())
59
- normalized_results = {k: (v/total) * 100 for k, v in results.items()}
60
-
61
- # Ordenar resultados
62
- sorted_results = dict(sorted(normalized_results.items(), key=lambda x: x[1], reverse=True))
63
-
64
- # Formatar resultado
65
- output = "Análise do Perfil DISC:\n\n"
66
- for profile, score in sorted_results.items():
67
- output += f"{profile}: {score:.1f}%\n"
68
-
69
- return output
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
 
71
  # Interface Gradio
72
- iface = gr.Interface(
73
- fn=analyze_disc,
74
- inputs=gr.Textbox(
75
- lines=5,
76
- placeholder="Digite uma descrição do comportamento da pessoa..."
77
- ),
78
- outputs=gr.Textbox(),
79
- title="Analisador de Perfil DISC",
80
- description="Analise o perfil DISC baseado em uma descrição comportamental usando IA",
81
- examples=[
82
- ["Pessoa focada em resultados, toma decisões rápidas e gosta de desafios"],
83
- ["Muito comunicativo, alegre e gosta de trabalhar com pessoas"],
84
- ["Calmo, paciente e trabalha bem em equipe"],
85
- ["Detalhista, analítico e segue procedimentos com precisão"]
86
- ]
87
- )
 
 
 
 
 
 
88
 
89
  # Iniciar a interface
90
  iface.launch()
 
3
  from sklearn.metrics.pairwise import cosine_similarity
4
  import numpy as np
5
 
6
+ # Modelo para embeddings
7
  model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
8
 
9
+ # Questionário DISC
10
+ disc_questions = [
11
+ {
12
+ "pergunta": "Em situações de trabalho em equipe, eu geralmente:",
13
+ "opcoes": [
14
+ ("D", "Assumo a liderança e tomo decisões rápidas"),
15
+ ("I", "Motivo o grupo e mantenho o ambiente animado"),
16
+ ("S", "Apoio os colegas e mantenho a harmonia"),
17
+ ("C", "Analiso detalhadamente antes de agir")
18
+ ]
19
+ },
20
+ {
21
+ "pergunta": "Quando enfrento um problema, eu:",
22
+ "opcoes": [
23
+ ("D", "Enfrento diretamente e busco soluções imediatas"),
24
+ ("I", "Discuto com outros e busco diferentes perspectivas"),
25
+ ("S", "Mantenho a calma e sigo um processo estabelecido"),
26
+ ("C", "Pesquiso todas as informações disponíveis primeiro")
27
+ ]
28
+ },
29
+ {
30
+ "pergunta": "Em reuniões, eu costumo:",
31
+ "opcoes": [
32
+ ("D", "Ir direto ao ponto e focar em resultados"),
33
+ ("I", "Participar ativamente e compartilhar ideias"),
34
+ ("S", "Ouvir atentamente e contribuir quando solicitado"),
35
+ ("C", "Tomar notas e questionar os detalhes")
36
+ ]
37
+ },
38
+ # Adicione mais perguntas conforme necessário
39
+ ]
40
+
41
+ # Características de cada perfil para o relatório
42
+ perfis_caracteristicas = {
43
+ 'D': {
44
+ 'pontos_fortes': [
45
+ "Capacidade de liderança",
46
+ "Foco em resultados",
47
+ "Tomada rápida de decisão",
48
+ "Assertividade",
49
+ "Iniciativa"
50
+ ],
51
+ 'areas_desenvolvimento': [
52
+ "Paciência com outros",
53
+ "Sensibilidade às necessidades alheias",
54
+ "Diplomacia",
55
+ "Atenção aos detalhes"
56
+ ],
57
+ 'ambiente_ideal': [
58
+ "Competitivo",
59
+ "Com autonomia",
60
+ "Orientado a resultados",
61
+ "Com desafios constantes"
62
+ ]
63
+ },
64
+ 'I': {
65
+ 'pontos_fortes': [
66
+ "Comunicação",
67
+ "Entusiasmo",
68
+ "Networking",
69
+ "Criatividade",
70
+ "Persuasão"
71
+ ],
72
+ 'areas_desenvolvimento': [
73
+ "Organização",
74
+ "Foco",
75
+ "Conclusão de tarefas",
76
+ "Atenção aos detalhes"
77
+ ],
78
+ 'ambiente_ideal': [
79
+ "Social",
80
+ "Colaborativo",
81
+ "Dinâmico",
82
+ "Com reconhecimento público"
83
+ ]
84
+ },
85
+ 'S': {
86
+ 'pontos_fortes': [
87
+ "Estabilidade",
88
+ "Confiabilidade",
89
+ "Trabalho em equipe",
90
+ "Paciência",
91
+ "Lealdade"
92
+ ],
93
+ 'areas_desenvolvimento': [
94
+ "Adaptação a mudanças",
95
+ "Assertividade",
96
+ "Iniciativa",
97
+ "Tomada de decisão"
98
+ ],
99
+ 'ambiente_ideal': [
100
+ "Estável",
101
+ "Previsível",
102
+ "Cooperativo",
103
+ "Com rotinas claras"
104
+ ]
105
+ },
106
+ 'C': {
107
+ 'pontos_fortes': [
108
+ "Precisão",
109
+ "Análise",
110
+ "Organização",
111
+ "Qualidade",
112
+ "Planejamento"
113
+ ],
114
+ 'areas_desenvolvimento': [
115
+ "Flexibilidade",
116
+ "Velocidade",
117
+ "Expressão emocional",
118
+ "Tomada de risco"
119
+ ],
120
+ 'ambiente_ideal': [
121
+ "Estruturado",
122
+ "Com regras claras",
123
+ "Focado em qualidade",
124
+ "Com tempo para análise"
125
+ ]
126
+ }
127
  }
128
 
129
+ def calcular_perfil(respostas):
130
+ # Contar frequência de cada perfil
131
+ contagem = {'D': 0, 'I': 0, 'S': 0, 'C': 0}
132
+ for resposta in respostas:
133
+ contagem[resposta] += 1
134
+
135
+ # Calcular porcentagens
136
+ total = sum(contagem.values())
137
+ percentuais = {k: (v/total) * 100 for k, v in contagem.items()}
138
+
139
+ return percentuais
140
+
141
+ def gerar_relatorio(percentuais):
142
+ # Ordenar perfis por porcentagem
143
+ perfis_ordenados = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True))
144
+ perfil_dominante = list(perfis_ordenados.keys())[0]
145
+
146
+ # Cabeçalho do relatório
147
+ relatorio = "RELATÓRIO DE PERFIL COMPORTAMENTAL DISC\n\n"
148
+
149
+ # Resultados percentuais
150
+ relatorio += "DISTRIBUIÇÃO DOS PERFIS:\n"
151
+ for perfil, porcentagem in perfis_ordenados.items():
152
+ relatorio += f"{perfil}: {porcentagem:.1f}%\n"
153
+
154
+ relatorio += f"\nPERFIL PREDOMINANTE: {perfil_dominante}\n\n"
155
+
156
+ # Características do perfil dominante
157
+ relatorio += "PONTOS FORTES:\n"
158
+ for ponto in perfis_caracteristicas[perfil_dominante]['pontos_fortes']:
159
+ relatorio += f"- {ponto}\n"
160
+
161
+ relatorio += "\nÁREAS DE DESENVOLVIMENTO:\n"
162
+ for area in perfis_caracteristicas[perfil_dominante]['areas_desenvolvimento']:
163
+ relatorio += f"- {area}\n"
164
+
165
+ relatorio += "\nAMBIENTE IDEAL DE TRABALHO:\n"
166
+ for caracteristica in perfis_caracteristicas[perfil_dominante]['ambiente_ideal']:
167
+ relatorio += f"- {caracteristica}\n"
168
+
169
+ # Recomendações personalizadas baseadas no modelo
170
+ texto_base = " ".join(perfis_caracteristicas[perfil_dominante]['pontos_fortes'])
171
+ embedding_base = model.encode([texto_base])[0]
172
+
173
+ return relatorio
174
+
175
+ def processar_questionario(respostas):
176
+ # Converter respostas em perfis
177
+ perfis_selecionados = [opcao.split()[0] for opcao in respostas]
178
+
179
+ # Calcular percentuais
180
+ percentuais = calcular_perfil(perfis_selecionados)
181
+
182
+ # Gerar relatório
183
+ relatorio = gerar_relatorio(percentuais)
184
+
185
+ return relatorio
186
 
187
  # Interface Gradio
188
+ with gr.Blocks(title="Questionário DISC") as iface:
189
+ gr.Markdown("# Análise de Perfil Comportamental DISC")
190
+
191
+ with gr.Group():
192
+ respostas = []
193
+ for i, questao in enumerate(disc_questions):
194
+ gr.Markdown(f"### {questao['pergunta']}")
195
+ respostas.append(
196
+ gr.Radio(
197
+ choices=[f"{perfil} - {desc}" for perfil, desc in questao['opcoes']],
198
+ label=f"Questão {i+1}"
199
+ )
200
+ )
201
+
202
+ btn = gr.Button("Gerar Relatório")
203
+ output = gr.Textbox(label="Relatório", lines=20)
204
+
205
+ btn.click(
206
+ fn=processar_questionario,
207
+ inputs=respostas,
208
+ outputs=output
209
+ )
210
 
211
  # Iniciar a interface
212
  iface.launch()