File size: 10,799 Bytes
32578e6
3d31404
 
80eb653
32578e6
3d31404
 
80eb653
3d31404
 
 
 
 
 
 
 
 
 
 
 
 
80eb653
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3d31404
 
80eb653
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3d31404
80eb653
 
 
 
 
 
 
 
 
 
 
 
3d31404
04f0dea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3d31404
04f0dea
 
3d31404
80eb653
 
 
04f0dea
 
80eb653
 
04f0dea
 
 
 
3d31404
 
80eb653
04f0dea
80eb653
 
 
04f0dea
 
 
 
 
 
3d31404
 
 
 
4085804
 
 
 
 
 
3d31404
4085804
 
 
 
 
 
 
 
3d31404
 
32578e6
ef17b94
4085804
 
 
 
 
ef17b94
 
 
04f0dea
80eb653
 
04f0dea
 
 
 
 
 
 
 
 
 
 
32578e6
3d31404
32578e6
3d31404
 
4085804
32578e6
3d31404
 
 
 
 
 
4085804
 
32578e6
3d31404
 
 
 
4085804
 
 
 
 
 
 
 
3d31404
 
 
 
 
 
 
32578e6
 
3d31404
 
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
import gradio as gr
from transformers import pipeline
import numpy as np
from typing import List, Dict

class SimpleTemperamentAnalyzer:
    def __init__(self):
        # Modelo para análise de sentimentos em português
        self.model = pipeline(
            "text-classification",
            model="neuralmind/bert-base-portuguese-cased",
            return_all_scores=True
        )
        
        self.temperamentos = {
            'SANGUÍNEO': ['Alegre', 'Extrovertido', 'Social', 'Otimista', 'Comunicativo'],
            'COLÉRICO': ['Líder', 'Determinado', 'Prático', 'Produtivo', 'Independente'],
            'MELANCÓLICO': ['Perfeccionista', 'Detalhista', 'Artístico', 'Sensível', 'Idealista'],
            'FLEUMÁTICO': ['Calmo', 'Pacífico', 'Objetivo', 'Diplomático', 'Organizado']
        }

        # Descrições para análise do modelo
        self.descricoes_temperamentos = {
            'SANGUÍNEO': 'pessoa extrovertida, social, otimista e comunicativa',
            'COLÉRICO': 'pessoa determinada, prática, líder e independente',
            'MELANCÓLICO': 'pessoa perfeccionista, sensível, detalhista e artística',
            'FLEUMÁTICO': 'pessoa calma, pacífica, objetiva e organizada'
        }

    def analisar_texto_caracteristicas(self, caracteristicas: List[str]) -> Dict[str, float]:
        """Usa o modelo NLP para analisar o texto das características selecionadas"""
        # Junta as características em um texto para análise
        texto_analise = " ".join(caracteristicas)
        
        # Análise para cada temperamento
        scores_temp = {}
        for temp, desc in self.descricoes_temperamentos.items():
            # Analisa a similaridade entre as características selecionadas e a descrição do temperamento
            resultado = self.model(f"Características: {texto_analise}. Descrição: {desc}")
            scores_temp[temp] = resultado[0][0]['score']  # Pega o score principal
            
        return scores_temp

    def analisar_respostas(self, respostas_marcadas: List[str]) -> Dict[str, float]:
        """Combina análise tradicional com NLP para gerar pontuações"""
        # Pontuações baseadas em contagem
        pontuacoes_contagem = {}
        for temp, caracteristicas in self.temperamentos.items():
            marcadas = sum(1 for c in caracteristicas if c in respostas_marcadas)
            pontuacoes_contagem[temp] = marcadas
        
        # Pontuações baseadas em NLP
        pontuacoes_nlp = self.analisar_texto_caracteristicas(respostas_marcadas)
        
        # Combina as pontuações (média ponderada)
        pontuacoes_finais = {}
        for temp in self.temperamentos:
            # Peso 0.6 para contagem e 0.4 para NLP
            pond_contagem = pontuacoes_contagem[temp] * 0.6
            pond_nlp = pontuacoes_nlp[temp] * 0.4
            pontuacoes_finais[temp] = pond_contagem + pond_nlp
        
        # Normaliza para 100%
        total = sum(pontuacoes_finais.values())
        if total > 0:
            for temp in pontuacoes_finais:
                pontuacoes_finais[temp] = (pontuacoes_finais[temp] / total) * 100
        
        return pontuacoes_finais

    def interpretar_combinacao(self, temp_ordenados: List[tuple]) -> str:
        """Usa o modelo para interpretar a combinação de temperamentos"""
        combinacao = f"{temp_ordenados[0][0]} com {temp_ordenados[1][0]}"
        interpretacao = self.model(
            f"Combinação de temperamentos: {combinacao}. "
            f"Características principais: {self.descricoes_temperamentos[temp_ordenados[0][0]]} "
            f"com aspectos de {self.descricoes_temperamentos[temp_ordenados[1][0]]}"
        )
        return interpretacao[0][0]['label']

    def gerar_analise(self, temperamento_dominante: str, pontuacoes: Dict[str, float]) -> Dict:
        """Gera uma análise detalhada usando o modelo NLP"""
        descricoes = {
            'SANGUÍNEO': {
                'positivo': ['sociabilidade', 'entusiasmo', 'carisma', 'energia positiva', 'facilidade de comunicação'],
                'desafios': ['tendência à dispersão', 'dificuldade com rotinas', 'pode ser superficial'],
                'profissional': 'Tende a se destacar em áreas que envolvem interação social, vendas, comunicação e trabalho em equipe.',
                'relacionamentos': 'Faz amizades facilmente e mantém um círculo social ativo. Precisa desenvolver maior profundidade nas relações.'
            },
            'COLÉRICO': {
                'positivo': ['liderança', 'determinação', 'praticidade', 'foco em resultados', 'iniciativa'],
                'desafios': ['impaciência', 'autoritarismo', 'dificuldade em demonstrar empatia'],
                'profissional': 'Excelente em posições de liderança, gestão de projetos e empreendedorismo.',
                'relacionamentos': 'Direto e objetivo nas relações, precisa desenvolver mais sensibilidade e paciência.'
            },
            'MELANCÓLICO': {
                'positivo': ['profundidade analítica', 'criatividade', 'atenção aos detalhes', 'sensibilidade', 'perfeccionismo'],
                'desafios': ['autocrítica excessiva', 'tendência à introspecção', 'dificuldade com mudanças'],
                'profissional': 'Se destaca em áreas que exigem análise detalhada, planejamento e criatividade.',
                'relacionamentos': 'Valoriza relações profundas e significativas, mas pode ter dificuldade em se abrir.'
            },
            'FLEUMÁTICO': {
                'positivo': ['equilíbrio emocional', 'diplomacia', 'organização', 'confiabilidade', 'paciência'],
                'desafios': ['passividade', 'resistência a mudanças', 'dificuldade em tomar iniciativa'],
                'profissional': 'Eficiente em funções que requerem mediação, organização e trabalho metódico.',
                'relacionamentos': 'Estável e confiável nas relações, mas pode parecer distante ou pouco expressivo.'
            }
        }

        temp_ordenados = sorted(pontuacoes.items(), key=lambda x: x[1], reverse=True)
        
        # Usa o modelo para interpretar a combinação
        interpretacao_combinacao = self.interpretar_combinacao(temp_ordenados)
        
        analise = {
            'perfil_principal': f"Seu perfil predominante é {temperamento_dominante} ({pontuacoes[temperamento_dominante]:.1f}%), ",
            'combinacao': f"com influências significativas de {' e '.join([f'{temp} ({pont:.1f}%)' for temp, pont in temp_ordenados[1:3]])}.",
            'interpretacao': interpretacao_combinacao,
            'caracteristicas': [],
            'areas_desenvolvimento': [],
            'perfil_profissional': "",
            'relacionamentos': ""
        }
        
        # Análise das características principais usando o modelo
        for temp, pont in temp_ordenados[:2]:
            if pont > 20:
                caract_temp = " ".join(descricoes[temp]['positivo'])
                analise_caract = self.model(f"Características principais: {caract_temp}")
                analise['caracteristicas'].extend(descricoes[temp]['positivo'][:3])
                analise['areas_desenvolvimento'].extend(descricoes[temp]['desafios'][:2])
                analise['perfil_profissional'] += descricoes[temp]['profissional'] + " "
                analise['relacionamentos'] += descricoes[temp]['relacionamentos'] + " "
        
        return analise

def criar_interface():
    analisador = SimpleTemperamentAnalyzer()
    
    def validar_selecao(selecoes):
        if len(selecoes) > 5:
            # Retorna apenas as primeiras 5 seleções
            return selecoes[:5], "Por favor, selecione apenas 5 características."
        return selecoes, "" if selecoes else "Selecione até 5 características que mais combinam com você."
    
    def processar_selecao(selecoes):
        selecoes_validadas, mensagem = validar_selecao(selecoes)
        if mensagem and "apenas" in mensagem:  # Se excedeu o limite
            return f"⚠️ {mensagem}\n\nPor favor, desmarque algumas opções para continuar."
        
        if not selecoes_validadas:
            return "Selecione algumas características para realizar a análise."
            
        pontuacoes = analisador.analisar_respostas(selecoes_validadas)
        temperamento_dominante = max(pontuacoes.items(), key=lambda x: x[1])[0]
        analise = analisador.gerar_analise(temperamento_dominante, pontuacoes)
        
        resultado = "### Resultados da Análise de Temperamento\n\n"
        resultado += "**Características Selecionadas:**\n"
        for caract in selecoes_validadas:
            resultado += f"- {caract}\n"
            
        resultado += "\n**Pontuações:**\n"
        for temp, pont in pontuacoes.items():
            resultado += f"- {temp}: {pont:.1f}%\n"
        
        resultado += f"\n**Análise Detalhada:**\n"
        resultado += f"{analise['perfil_principal']}{analise['combinacao']}\n"
        resultado += f"**Interpretação:** {analise['interpretacao']}\n\n"
        
        resultado += "**Principais Características:**\n"
        for caract in analise['caracteristicas']:
            resultado += f"- {caract}\n"
            
        resultado += "\n**Áreas para Desenvolvimento:**\n"
        for area in analise['areas_desenvolvimento']:
            resultado += f"- {area}\n"
            
        resultado += f"\n**Perfil Profissional:**\n{analise['perfil_profissional']}\n\n"
        resultado += f"**Relacionamentos:**\n{analise['relacionamentos']}\n"
        
        return resultado

    with gr.Blocks(theme=gr.themes.Soft()) as interface:
        gr.Markdown("## Análise de Temperamento Simplificada")
        gr.Markdown("### Selecione exatamente 5 características que mais combinam com você")
        
        todas_caracteristicas = []
        for temp, caract in analisador.temperamentos.items():
            todas_caracteristicas.extend(caract)
        
        selecoes = gr.CheckboxGroup(
            choices=todas_caracteristicas,
            label="Escolha 5 características:",
            info="Limite: 5 características"
        )
        
        btn = gr.Button("Analisar")
        saida = gr.Markdown()
        
        # Atualiza em tempo real para validar seleções
        selecoes.change(
            fn=validar_selecao,
            inputs=selecoes,
            outputs=[selecoes, saida]
        )
        
        # Processa a análise quando o botão é clicado
        btn.click(
            fn=processar_selecao,
            inputs=selecoes,
            outputs=saida
        )
    
    return interface

if __name__ == "__main__":
    interface = criar_interface()
    interface.launch()