Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,9 +1,11 @@
|
|
1 |
import gradio as gr
|
2 |
from transformers import pipeline
|
3 |
import numpy as np
|
|
|
4 |
|
5 |
class SimpleTemperamentAnalyzer:
|
6 |
def __init__(self):
|
|
|
7 |
self.model = pipeline(
|
8 |
"text-classification",
|
9 |
model="neuralmind/bert-base-portuguese-cased",
|
@@ -17,25 +19,67 @@ class SimpleTemperamentAnalyzer:
|
|
17 |
'FLEUMÁTICO': ['Calmo', 'Pacífico', 'Objetivo', 'Diplomático', 'Organizado']
|
18 |
}
|
19 |
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
for temp, caracteristicas in self.temperamentos.items():
|
26 |
marcadas = sum(1 for c in caracteristicas if c in respostas_marcadas)
|
27 |
-
|
28 |
-
|
29 |
-
#
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
|
37 |
-
def
|
38 |
-
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
descricoes = {
|
40 |
'SANGUÍNEO': {
|
41 |
'positivo': ['sociabilidade', 'entusiasmo', 'carisma', 'energia positiva', 'facilidade de comunicação'],
|
@@ -63,23 +107,26 @@ class SimpleTemperamentAnalyzer:
|
|
63 |
}
|
64 |
}
|
65 |
|
66 |
-
# Ordena os temperamentos por pontuação
|
67 |
temp_ordenados = sorted(pontuacoes.items(), key=lambda x: x[1], reverse=True)
|
68 |
|
69 |
-
#
|
|
|
|
|
70 |
analise = {
|
71 |
'perfil_principal': f"Seu perfil predominante é {temperamento_dominante} ({pontuacoes[temperamento_dominante]:.1f}%), ",
|
72 |
-
'combinacao': "com influências significativas de
|
73 |
-
|
74 |
'caracteristicas': [],
|
75 |
'areas_desenvolvimento': [],
|
76 |
'perfil_profissional': "",
|
77 |
'relacionamentos': ""
|
78 |
}
|
79 |
|
80 |
-
#
|
81 |
for temp, pont in temp_ordenados[:2]:
|
82 |
-
if pont > 20:
|
|
|
|
|
83 |
analise['caracteristicas'].extend(descricoes[temp]['positivo'][:3])
|
84 |
analise['areas_desenvolvimento'].extend(descricoes[temp]['desafios'][:2])
|
85 |
analise['perfil_profissional'] += descricoes[temp]['profissional'] + " "
|
@@ -91,23 +138,18 @@ def criar_interface():
|
|
91 |
analisador = SimpleTemperamentAnalyzer()
|
92 |
|
93 |
def processar_selecao(selecoes):
|
94 |
-
# Calcula pontuações
|
95 |
pontuacoes = analisador.analisar_respostas(selecoes)
|
96 |
-
|
97 |
-
# Identifica temperamento dominante
|
98 |
temperamento_dominante = max(pontuacoes.items(), key=lambda x: x[1])[0]
|
99 |
-
|
100 |
-
# Gera análise
|
101 |
analise = analisador.gerar_analise(temperamento_dominante, pontuacoes)
|
102 |
|
103 |
-
# Formata resultado
|
104 |
resultado = "### Resultados da Análise de Temperamento\n\n"
|
105 |
resultado += "**Pontuações:**\n"
|
106 |
for temp, pont in pontuacoes.items():
|
107 |
resultado += f"- {temp}: {pont:.1f}%\n"
|
108 |
|
109 |
resultado += f"\n**Análise Detalhada:**\n"
|
110 |
-
resultado += f"{analise['perfil_principal']}{analise['combinacao']}\n
|
|
|
111 |
|
112 |
resultado += "**Principais Características:**\n"
|
113 |
for caract in analise['caracteristicas']:
|
@@ -122,7 +164,6 @@ def criar_interface():
|
|
122 |
|
123 |
return resultado
|
124 |
|
125 |
-
# Interface Gradio
|
126 |
with gr.Blocks(theme=gr.themes.Soft()) as interface:
|
127 |
gr.Markdown("## Análise de Temperamento Simplificada")
|
128 |
|
|
|
1 |
import gradio as gr
|
2 |
from transformers import pipeline
|
3 |
import numpy as np
|
4 |
+
from typing import List, Dict
|
5 |
|
6 |
class SimpleTemperamentAnalyzer:
|
7 |
def __init__(self):
|
8 |
+
# Modelo para análise de sentimentos em português
|
9 |
self.model = pipeline(
|
10 |
"text-classification",
|
11 |
model="neuralmind/bert-base-portuguese-cased",
|
|
|
19 |
'FLEUMÁTICO': ['Calmo', 'Pacífico', 'Objetivo', 'Diplomático', 'Organizado']
|
20 |
}
|
21 |
|
22 |
+
# Descrições para análise do modelo
|
23 |
+
self.descricoes_temperamentos = {
|
24 |
+
'SANGUÍNEO': 'pessoa extrovertida, social, otimista e comunicativa',
|
25 |
+
'COLÉRICO': 'pessoa determinada, prática, líder e independente',
|
26 |
+
'MELANCÓLICO': 'pessoa perfeccionista, sensível, detalhista e artística',
|
27 |
+
'FLEUMÁTICO': 'pessoa calma, pacífica, objetiva e organizada'
|
28 |
+
}
|
29 |
+
|
30 |
+
def analisar_texto_caracteristicas(self, caracteristicas: List[str]) -> Dict[str, float]:
|
31 |
+
"""Usa o modelo NLP para analisar o texto das características selecionadas"""
|
32 |
+
# Junta as características em um texto para análise
|
33 |
+
texto_analise = " ".join(caracteristicas)
|
34 |
+
|
35 |
+
# Análise para cada temperamento
|
36 |
+
scores_temp = {}
|
37 |
+
for temp, desc in self.descricoes_temperamentos.items():
|
38 |
+
# Analisa a similaridade entre as características selecionadas e a descrição do temperamento
|
39 |
+
resultado = self.model(f"Características: {texto_analise}. Descrição: {desc}")
|
40 |
+
scores_temp[temp] = resultado[0][0]['score'] # Pega o score principal
|
41 |
+
|
42 |
+
return scores_temp
|
43 |
+
|
44 |
+
def analisar_respostas(self, respostas_marcadas: List[str]) -> Dict[str, float]:
|
45 |
+
"""Combina análise tradicional com NLP para gerar pontuações"""
|
46 |
+
# Pontuações baseadas em contagem
|
47 |
+
pontuacoes_contagem = {}
|
48 |
for temp, caracteristicas in self.temperamentos.items():
|
49 |
marcadas = sum(1 for c in caracteristicas if c in respostas_marcadas)
|
50 |
+
pontuacoes_contagem[temp] = marcadas
|
51 |
+
|
52 |
+
# Pontuações baseadas em NLP
|
53 |
+
pontuacoes_nlp = self.analisar_texto_caracteristicas(respostas_marcadas)
|
54 |
+
|
55 |
+
# Combina as pontuações (média ponderada)
|
56 |
+
pontuacoes_finais = {}
|
57 |
+
for temp in self.temperamentos:
|
58 |
+
# Peso 0.6 para contagem e 0.4 para NLP
|
59 |
+
pond_contagem = pontuacoes_contagem[temp] * 0.6
|
60 |
+
pond_nlp = pontuacoes_nlp[temp] * 0.4
|
61 |
+
pontuacoes_finais[temp] = pond_contagem + pond_nlp
|
62 |
+
|
63 |
+
# Normaliza para 100%
|
64 |
+
total = sum(pontuacoes_finais.values())
|
65 |
+
if total > 0:
|
66 |
+
for temp in pontuacoes_finais:
|
67 |
+
pontuacoes_finais[temp] = (pontuacoes_finais[temp] / total) * 100
|
68 |
+
|
69 |
+
return pontuacoes_finais
|
70 |
|
71 |
+
def interpretar_combinacao(self, temp_ordenados: List[tuple]) -> str:
|
72 |
+
"""Usa o modelo para interpretar a combinação de temperamentos"""
|
73 |
+
combinacao = f"{temp_ordenados[0][0]} com {temp_ordenados[1][0]}"
|
74 |
+
interpretacao = self.model(
|
75 |
+
f"Combinação de temperamentos: {combinacao}. "
|
76 |
+
f"Características principais: {self.descricoes_temperamentos[temp_ordenados[0][0]]} "
|
77 |
+
f"com aspectos de {self.descricoes_temperamentos[temp_ordenados[1][0]]}"
|
78 |
+
)
|
79 |
+
return interpretacao[0][0]['label']
|
80 |
+
|
81 |
+
def gerar_analise(self, temperamento_dominante: str, pontuacoes: Dict[str, float]) -> Dict:
|
82 |
+
"""Gera uma análise detalhada usando o modelo NLP"""
|
83 |
descricoes = {
|
84 |
'SANGUÍNEO': {
|
85 |
'positivo': ['sociabilidade', 'entusiasmo', 'carisma', 'energia positiva', 'facilidade de comunicação'],
|
|
|
107 |
}
|
108 |
}
|
109 |
|
|
|
110 |
temp_ordenados = sorted(pontuacoes.items(), key=lambda x: x[1], reverse=True)
|
111 |
|
112 |
+
# Usa o modelo para interpretar a combinação
|
113 |
+
interpretacao_combinacao = self.interpretar_combinacao(temp_ordenados)
|
114 |
+
|
115 |
analise = {
|
116 |
'perfil_principal': f"Seu perfil predominante é {temperamento_dominante} ({pontuacoes[temperamento_dominante]:.1f}%), ",
|
117 |
+
'combinacao': f"com influências significativas de {' e '.join([f'{temp} ({pont:.1f}%)' for temp, pont in temp_ordenados[1:3]])}.",
|
118 |
+
'interpretacao': interpretacao_combinacao,
|
119 |
'caracteristicas': [],
|
120 |
'areas_desenvolvimento': [],
|
121 |
'perfil_profissional': "",
|
122 |
'relacionamentos': ""
|
123 |
}
|
124 |
|
125 |
+
# Análise das características principais usando o modelo
|
126 |
for temp, pont in temp_ordenados[:2]:
|
127 |
+
if pont > 20:
|
128 |
+
caract_temp = " ".join(descricoes[temp]['positivo'])
|
129 |
+
analise_caract = self.model(f"Características principais: {caract_temp}")
|
130 |
analise['caracteristicas'].extend(descricoes[temp]['positivo'][:3])
|
131 |
analise['areas_desenvolvimento'].extend(descricoes[temp]['desafios'][:2])
|
132 |
analise['perfil_profissional'] += descricoes[temp]['profissional'] + " "
|
|
|
138 |
analisador = SimpleTemperamentAnalyzer()
|
139 |
|
140 |
def processar_selecao(selecoes):
|
|
|
141 |
pontuacoes = analisador.analisar_respostas(selecoes)
|
|
|
|
|
142 |
temperamento_dominante = max(pontuacoes.items(), key=lambda x: x[1])[0]
|
|
|
|
|
143 |
analise = analisador.gerar_analise(temperamento_dominante, pontuacoes)
|
144 |
|
|
|
145 |
resultado = "### Resultados da Análise de Temperamento\n\n"
|
146 |
resultado += "**Pontuações:**\n"
|
147 |
for temp, pont in pontuacoes.items():
|
148 |
resultado += f"- {temp}: {pont:.1f}%\n"
|
149 |
|
150 |
resultado += f"\n**Análise Detalhada:**\n"
|
151 |
+
resultado += f"{analise['perfil_principal']}{analise['combinacao']}\n"
|
152 |
+
resultado += f"**Interpretação:** {analise['interpretacao']}\n\n"
|
153 |
|
154 |
resultado += "**Principais Características:**\n"
|
155 |
for caract in analise['caracteristicas']:
|
|
|
164 |
|
165 |
return resultado
|
166 |
|
|
|
167 |
with gr.Blocks(theme=gr.themes.Soft()) as interface:
|
168 |
gr.Markdown("## Análise de Temperamento Simplificada")
|
169 |
|