File size: 10,799 Bytes
fcc1cf1
3b48b04
ddd5e15
d10af90
fcc1cf1
3b48b04
ddd5e15
d10af90
81baf26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3b48b04
 
12026ba
3b48b04
 
 
 
 
 
 
 
 
 
 
 
 
 
12026ba
 
3b48b04
 
 
 
 
 
 
 
 
 
 
 
 
 
12026ba
 
3b48b04
 
 
 
 
 
 
 
 
 
 
 
 
 
12026ba
 
3b48b04
 
 
 
 
 
 
 
 
 
 
 
 
 
12026ba
7869e46
 
ea388f3
 
 
 
 
 
 
 
 
 
 
 
12026ba
3b48b04
 
ea388f3
3b48b04
aeb33b1
3b48b04
 
aeb33b1
3b48b04
 
 
 
 
 
aeb33b1
81baf26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3b48b04
 
81baf26
 
 
 
 
3b48b04
81baf26
 
 
 
 
 
3b48b04
81baf26
 
 
 
 
 
3b48b04
 
 
 
 
ea388f3
3b48b04
 
 
aeb33b1
1c4c4e9
 
 
 
3b48b04
7869e46
3b48b04
 
 
7869e46
3b48b04
1c4c4e9
7869e46
3b48b04
1c4c4e9
7869e46
3b48b04
 
5bfab3a
3b48b04
a4dfbde
 
1c4c4e9
3b48b04
81baf26
dadf642
 
 
 
 
 
 
5bfab3a
3b48b04
 
 
5bfab3a
3b48b04
 
 
 
dadf642
 
 
 
3b48b04
81baf26
3b48b04
dadf642
 
81baf26
3b48b04
 
 
81baf26
3b48b04
dadf642
 
 
 
3b48b04
 
 
dadf642
 
 
 
3b48b04
dadf642
3b48b04
dadf642
 
3b48b04
81baf26
dadf642
 
 
 
 
 
5bfab3a
 
fcc1cf1
5bfab3a
 
dadf642
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
import gradio as gr
import plotly.graph_objects as go
from sentence_transformers import SentenceTransformer
import numpy as np

# Initialize the model
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')

# Questionário DISC
DISC_QUESTIONS = [
    {
        "pergunta": "Em situações de trabalho em equipe, você geralmente:",
        "opcoes": [
            ("D", "Assume a liderança e toma decisões rápidas"),
            ("I", "Motiva o grupo e mantém o ambiente animado"),
            ("S", "Apoia os colegas e mantém a harmonia"),
            ("C", "Analisa detalhadamente antes de agir")
        ]
    },
    {
        "pergunta": "Quando enfrenta um desafio no trabalho, você:",
        "opcoes": [
            ("D", "Enfrenta diretamente e busca soluções imediatas"),
            ("I", "Discute com outros e busca diferentes perspectivas"),
            ("S", "Mantém a calma e segue um processo estabelecido"),
            ("C", "Pesquisa todas as informações disponíveis primeiro")
        ]
    },
    {
        "pergunta": "Em reuniões profissionais, você costuma:",
        "opcoes": [
            ("D", "Ir direto ao ponto e focar em resultados"),
            ("I", "Participar ativamente e compartilhar ideias"),
            ("S", "Ouvir atentamente e contribuir quando solicitado"),
            ("C", "Tomar notas e questionar os detalhes")
        ]
    },
    {
        "pergunta": "Ao lidar com mudanças no ambiente de trabalho, você:",
        "opcoes": [
            ("D", "Abraça a mudança e lidera a implementação"),
            ("I", "Entusiasma os outros sobre as novas possibilidades"),
            ("S", "Adapta-se gradualmente seguindo o processo"),
            ("C", "Analisa os impactos antes de aceitar")
        ]
    },
    {
        "pergunta": "Sob pressão no trabalho, você tende a:",
        "opcoes": [
            ("D", "Tornar-se mais direto e focado em resultados"),
            ("I", "Buscar apoio e interação com a equipe"),
            ("S", "Manter a calma e seguir metodicamente"),
            ("C", "Concentrar-se em detalhes e procedimentos")
        ]
    }
]

# Base de conhecimento enriquecida para análise semântica
DISC_INSIGHTS = {
    'D': {
        'alto': [
            "Você demonstra forte capacidade de liderança e tomada de decisão",
            "Sua orientação para resultados é uma característica marcante",
            "Você tende a enfrentar desafios de forma direta e decisiva",
            "Sua assertividade pode ser um grande diferencial em momentos críticos",
            "Você naturalmente assume o controle em situações desafiadoras"
        ],
        'baixo': [
            "Você prefere uma abordagem mais colaborativa e consensual",
            "Sua tendência é buscar harmonia nas relações profissionais",
            "Você demonstra cuidado ao tomar decisões importantes",
            "Sua abordagem mais ponderada favorece o trabalho em equipe",
            "Você valoriza a construção de consenso nas decisões"
        ]
    },
    'I': {
        'alto': [
            "Seu entusiasmo e otimismo são características marcantes",
            "Você tem grande habilidade para inspirar e motivar pessoas",
            "Sua comunicação expressiva é um diferencial importante",
            "Você naturalmente cria conexões positivas com as pessoas",
            "Sua criatividade se destaca em situações sociais"
        ],
        'baixo': [
            "Você prefere uma comunicação mais objetiva e focada",
            "Sua abordagem analítica favorece resultados concretos",
            "Você valoriza dados e fatos em suas interações",
            "Sua comunicação tende a ser mais formal e estruturada",
            "Você prioriza eficiência sobre interações sociais"
        ]
    },
    'S': {
        'alto': [
            "Sua consistência e confiabilidade são pontos fortes",
            "Você demonstra grande habilidade para trabalho em equipe",
            "Sua paciência e capacidade de escuta são diferenciais",
            "Você contribui para a estabilidade do ambiente",
            "Sua lealdade é uma característica muito valorizada"
        ],
        'baixo': [
            "Você se adapta facilmente a mudanças e novos cenários",
            "Sua flexibilidade é um ponto forte em ambientes dinâmicos",
            "Você lida bem com múltiplas tarefas simultâneas",
            "Sua versatilidade permite rápidas adaptações",
            "Você aprecia variedade e novos desafios"
        ]
    },
    'C': {
        'alto': [
            "Sua precisão e atenção aos detalhes são notáveis",
            "Você tem forte capacidade analítica e organizacional",
            "Sua busca por qualidade é uma característica marcante",
            "Você valoriza processos bem estruturados",
            "Sua abordagem sistemática garante resultados consistentes"
        ],
        'baixo': [
            "Você demonstra flexibilidade com regras e processos",
            "Sua praticidade favorece resultados rápidos",
            "Você se adapta bem a ambientes menos estruturados",
            "Sua tolerância à ambiguidade é um diferencial",
            "Você equilibra qualidade com agilidade"
        ]
    }
}

def get_intensity_level(percentual):
    """Determina o nível de intensidade baseado no percentual."""
    if percentual >= 75:
        return "muito alto"
    elif percentual >= 60:
        return "alto"
    elif percentual >= 40:
        return "moderado"
    elif percentual >= 25:
        return "baixo"
    else:
        return "muito baixo"

def generate_semantic_insights(perfil, percentual):
    """Gera insights baseados em análise semântica."""
    nivel = "alto" if percentual >= 50 else "baixo"
    insights = DISC_INSIGHTS[perfil][nivel]
    
    # Criar embedding do perfil
    profile_embedding = model.encode(" ".join(insights))
    
    # Selecionar insights mais relevantes baseado em similaridade
    similarities = np.array([np.dot(profile_embedding, model.encode(insight)) 
                           for insight in insights])
    top_insights = [insights[i] for i in similarities.argsort()[-3:]]
    
    return top_insights

def calcular_perfil(respostas):
    """Calcula os percentuais de cada perfil DISC."""
    contagem = {'D': 0, 'I': 0, 'S': 0, 'C': 0}
    
    for resposta in respostas:
        if resposta:
            perfil = resposta.split()[0]
            contagem[perfil] += 1
    
    total = sum(contagem.values())
    if total > 0:
        percentuais = {k: (v/total) * 100 for k, v in contagem.items()}
    else:
        percentuais = {k: 0 for k in contagem.keys()}
    
    return percentuais

def create_disc_plot(percentuais):
    """Cria visualização do perfil DISC."""
    cores = {'D': '#FF4B4B', 'I': '#FFD700', 'S': '#4CAF50', 'C': '#2196F3'}
    
    fig = go.Figure(data=[
        go.Bar(
            x=list(percentuais.keys()),
            y=list(percentuais.values()),
            marker_color=[cores[k] for k in percentuais.keys()],
            text=[f'{v:.1f}%' for v in percentuais.values()],
            textposition='auto',
        )
    ])
    
    fig.update_layout(
        title='Perfil DISC',
        yaxis_range=[0, 100],
        template='plotly_white',
        height=400
    )
    return fig

def gerar_relatorio(percentuais):
    """Gera relatório detalhado com insights baseados em NLP."""
    perfis = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True))
    principal = list(perfis.keys())[0]
    secundario = list(perfis.keys())[1]
    
    # Gerar insights semânticos
    principal_insights = generate_semantic_insights(principal, perfis[principal])
    secundario_insights = generate_semantic_insights(secundario, perfis[secundario])
    
    # Criar listas formatadas de insights
    insights_principais = "\n".join([f"• {insight}" for insight in principal_insights])
    insights_secundarios = "\n".join([f"• {insight}" for insight in secundario_insights])
    
    report = f"""# Análise de Perfil DISC

## Visão Geral
Seu perfil principal é {principal} com {perfis[principal]:.1f}% (nível {get_intensity_level(perfis[principal])})
Perfil secundário: {secundario} com {perfis[secundario]:.1f}% (nível {get_intensity_level(perfis[secundario])})

## Insights Principais
{insights_principais}

## Influências Secundárias
{insights_secundarios}

## Distribuição DISC Completa:
{', '.join([f'{k}: {v:.1f}%' for k, v in perfis.items()])}

## Observação
Este perfil representa suas tendências comportamentais naturais. 
Os comportamentos podem ser adaptados conforme o contexto e as necessidades específicas."""

    return report

import gradio as gr
import plotly.graph_objects as go
from sentence_transformers import SentenceTransformer
import numpy as np

# [Previous code remains the same until create_interface function]

def create_interface():
    """Cria interface moderna do teste."""
    with gr.Blocks() as iface:
        gr.Markdown("# 🎯 Análise de Perfil DISC")
        
        # Questões
        radios = []
        for i, q in enumerate(DISC_QUESTIONS, 1):
            gr.Markdown(f"### {i}. {q['pergunta']}")
            radio = gr.Radio(
                choices=[f"{p} - {d}" for p, d in q['opcoes']],
                label=f"Questão {i}"  # Added label for better accessibility
            )
            radios.append(radio)
        
        # Resultados
        plot = gr.Plot()
        output = gr.Markdown()
        
        # Botões
        analyze_btn = gr.Button("Analisar Perfil")
        reset_btn = gr.Button("Novo Teste")
        
        def process_results(*answers):
            # Validate if all questions are answered
            if any(answer is None for answer in answers):
                return None, "Por favor, responda todas as questões antes de analisar."
                
            perc = calcular_perfil(answers)
            return create_disc_plot(perc), gerar_relatorio(perc)
        
        def reset_form():
            return [None] * len(radios) + [None, None]
        
        # Connect the buttons to their respective functions
        analyze_btn.click(
            fn=process_results,
            inputs=radios,
            outputs=[plot, output],
            api_name="analyze"  # Added API name for better tracking
        )
        
        reset_btn.click(
            fn=reset_form,
            inputs=None,
            outputs=radios + [plot, output],
            api_name="reset"  # Added API name for better tracking
        )

    return iface

if __name__ == "__main__":
    iface = create_interface()
    iface.launch(show_error=True)  # Added show_error for better debugging