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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +80 -167
app.py CHANGED
@@ -1,177 +1,90 @@
1
  import gradio as gr
 
 
2
  import numpy as np
3
- from transformers import pipeline
4
- import pandas as pd
5
 
6
- class DiscAnalyzer:
7
- def __init__(self):
8
- self.disc_profiles = {
9
- 'D': 'Dominância',
10
- 'I': 'Influência',
11
- 'S': 'Estabilidade',
12
- 'C': 'Conformidade'
13
- }
14
-
15
- # Inicializar modelo mais leve
16
- self.generator = pipeline(
17
- "text-generation",
18
- model="facebook/opt-125m",
19
- device="cpu"
20
- )
21
-
22
- def generate_llm_report(self, scores, perfil_principal):
23
- prompt = f"""Analise o perfil DISC:
24
- D:{scores['D']:.1f}% I:{scores['I']:.1f}% S:{scores['S']:.1f}% C:{scores['C']:.1f}%
25
- Perfil Principal: {self.disc_profiles[perfil_principal]}
26
- """
27
- try:
28
- output = self.generator(
29
- prompt,
30
- max_length=300,
31
- num_return_sequences=1,
32
- temperature=0.7,
33
- top_p=0.9,
34
- do_sample=True
35
- )
36
- return output[0]['generated_text'].replace(prompt, "").strip()
37
- except Exception as e:
38
- return f"Erro ao gerar relatório: {str(e)}"
39
 
40
- def avaliar_disc(self, *args):
41
- responses = [int(arg) for arg in args]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
 
43
- scores = {
44
- 'D': sum(responses[i] for i in [0, 4, 8, 12]) / 16 * 100,
45
- 'I': sum(responses[i] for i in [1, 5, 9, 13]) / 16 * 100,
46
- 'S': sum(responses[i] for i in [2, 6, 10, 14]) / 16 * 100,
47
- 'C': sum(responses[i] for i in [3, 7, 11, 15]) / 16 * 100
48
- }
49
-
50
- perfil_principal = max(scores, key=scores.get)
51
- relatorio_llm = self.generate_llm_report(scores, perfil_principal)
52
 
53
- df = pd.DataFrame({
54
- "Dimensão": list(scores.keys()),
55
- "Score": list(scores.values()),
56
- "Descrição": [self.disc_profiles[k] for k in scores.keys()]
57
- })
58
-
59
- return (
60
- f"**{self.disc_profiles[perfil_principal]} ({perfil_principal})**",
61
- relatorio_llm,
62
- df,
63
- gr.update(visible=True),
64
- gr.update(visible=False)
65
- )
66
-
67
- def create_disc_interface():
68
- analyzer = DiscAnalyzer()
69
 
70
- with gr.Blocks(title="Análise de Perfil DISC") as interface:
71
- gr.Markdown(
72
- """
73
- # 🎯 Analisador de Perfil DISC
74
- #### Descubra seu perfil comportamental
75
- """
76
- )
 
 
 
 
77
 
78
- with gr.Row() as questionnaire_container:
79
- with gr.Column():
80
- gr.Markdown(
81
- """
82
- ### Questionário DISC
83
- Avalie cada afirmação (1 = Discordo totalmente, 4 = Concordo totalmente)
84
- """
85
- )
86
-
87
- questions = {
88
- "Dominância (D)": [
89
- "Sou direto e decisivo",
90
- "Gosto de assumir riscos",
91
- "Tomo iniciativa",
92
- "Busco resultados"
93
- ],
94
- "Influência (I)": [
95
- "Sou sociável e entusiasta",
96
- "Sou bom comunicador",
97
- "Sou persuasivo",
98
- "Sou motivador"
99
- ],
100
- "Estabilidade (S)": [
101
- "Sou paciente e cooperativo",
102
- "Sou bom ouvinte",
103
- "Trabalho bem em equipe",
104
- "Sou confiável"
105
- ],
106
- "Conformidade (C)": [
107
- "Sou preciso e analítico",
108
- "Sou organizado",
109
- "Sou detalhista",
110
- "Sou sistemático"
111
- ]
112
- }
113
-
114
- sliders = []
115
- for categoria, perguntas in questions.items():
116
- gr.Markdown(f"#### {categoria}")
117
- for pergunta in perguntas:
118
- slider = gr.Slider(
119
- minimum=1,
120
- maximum=4,
121
- value=2,
122
- step=1,
123
- label=pergunta
124
- )
125
- sliders.append(slider)
126
-
127
- analyze_btn = gr.Button("Analisar Perfil", variant="primary")
128
-
129
- # Resultados (inicialmente ocultos)
130
- with gr.Row(visible=False) as results_container:
131
- with gr.Column():
132
- gr.Markdown("### Resultados da Análise")
133
-
134
- perfil_output = gr.Markdown(label="Perfil Principal")
135
-
136
- with gr.Row():
137
- with gr.Column():
138
- plot_output = gr.BarPlot(
139
- x="Dimensão",
140
- y="Score",
141
- title="Perfil DISC",
142
- tooltip=["Descrição", "Score"],
143
- height=400,
144
- width=600
145
- )
146
- with gr.Column():
147
- relatorio_output = gr.Markdown(label="Análise Detalhada")
148
-
149
- new_test_btn = gr.Button("Fazer Novo Teste", variant="secondary")
150
-
151
- analyze_btn.click(
152
- fn=analyzer.avaliar_disc,
153
- inputs=sliders,
154
- outputs=[
155
- perfil_output,
156
- relatorio_output,
157
- plot_output,
158
- results_container,
159
- questionnaire_container
160
- ]
161
- )
162
-
163
- new_test_btn.click(
164
- fn=lambda: [2] * 16 + [gr.update(visible=True), gr.update(visible=False)],
165
- inputs=None,
166
- outputs=sliders + [questionnaire_container, results_container]
167
- )
168
 
169
- return interface
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
170
 
171
- if __name__ == "__main__":
172
- interface = create_disc_interface()
173
- interface.launch(
174
- server_name="0.0.0.0",
175
- server_port=7860,
176
- share=True
177
- )
 
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
+ # 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()