AIdeaText commited on
Commit
90fbb7b
·
verified ·
1 Parent(s): fbf7010

Update modules/semantic/semantic_live_interface.py

Browse files
modules/semantic/semantic_live_interface.py CHANGED
@@ -97,117 +97,96 @@ def display_semantic_live_interface(lang_code, nlp_models, semantic_t):
97
  if analysis_result and not analysis_result.get('success'):
98
  st.error(analysis_result.get('message', 'Error en el análisis'))
99
 
100
- # Columna derecha: Visualización de resultados
101
- with result_col:
102
- st.subheader(semantic_t.get('live_results', 'Resultados en vivo'))
103
 
104
- # Mostrar resultados si existen
105
- if 'last_result' in st.session_state.semantic_live_state and \
106
- st.session_state.semantic_live_state['last_result'] is not None:
 
 
 
 
107
 
108
- analysis = st.session_state.semantic_live_state['last_result']['analysis']
109
-
110
- # Mostrar advertencia si el texto ha cambiado
111
- if st.session_state.semantic_live_state.get('text_changed'):
112
- st.warning(semantic_t.get('text_changed_warning',
113
- 'El texto ha cambiado. Presione Analizar para actualizar los resultados.'))
114
-
115
- # Mostrar conceptos clave en formato horizontal
116
- if 'key_concepts' in analysis and analysis['key_concepts']:
117
- st.markdown("""
118
- <style>
119
- .concept-table {
120
- display: flex;
121
- flex-wrap: wrap;
122
- gap: 10px;
123
- padding: 10px;
124
- background-color: #f8f9fa;
125
- border-radius: 8px 8px 0 0;
126
- margin-bottom: 0;
127
- }
128
- .concept-item {
129
- background-color: white;
130
- border-radius: 5px;
131
- padding: 8px 12px;
132
- display: flex;
133
- align-items: center;
134
- gap: 8px;
135
- box-shadow: 0 1px 3px rgba(0,0,0,0.1);
136
- }
137
- .concept-name {
138
- font-weight: 500;
139
- color: #1f2937;
140
- }
141
- .concept-freq {
142
- color: #6b7280;
143
- font-size: 0.9em;
144
- }
145
- .graph-container {
146
- background-color: white;
147
- border-radius: 0 0 10px 10px;
148
- padding: 20px;
149
- box-shadow: 0 2px 4px rgba(0,0,0,0.1);
150
- margin-top: 0;
151
- min-height: 400px;
152
- }
153
- .results-container {
154
- background-color: white;
155
- border-radius: 10px;
156
- overflow: hidden;
157
- box-shadow: 0 2px 4px rgba(0,0,0,0.1);
158
- }
159
- </style>
160
- """, unsafe_allow_html=True)
161
-
162
- # Iniciar contenedor principal
163
- st.markdown('<div class="results-container">', unsafe_allow_html=True)
164
-
165
- # Crear la visualización horizontal de conceptos
166
- concepts_html = ['<div class="concept-table">']
167
- concepts_html.extend(
168
- f'<div class="concept-item"><span class="concept-name">{concept}</span>'
169
- f'<span class="concept-freq">({freq:.2f})</span></div>'
170
- for concept, freq in analysis['key_concepts']
171
- )
172
- concepts_html.append('</div>')
173
 
174
- st.markdown(''.join(concepts_html), unsafe_allow_html=True)
175
-
176
- # Mostrar gráfico de conceptos en el mismo contenedor
177
- if 'concept_graph' in analysis and analysis['concept_graph'] is not None:
178
- with st.container():
179
- st.markdown('<div class="graph-container">', unsafe_allow_html=True)
180
-
181
- st.image(
182
- analysis['concept_graph'],
183
- use_container_width=True,
184
- caption=semantic_t.get(
185
- 'graph_description',
186
- 'Visualización de relaciones entre conceptos clave identificados en el texto.'
187
- )
188
  )
 
189
 
190
- # Contenedor para botones en la parte inferior del gráfico
191
- button_col, spacer_col = st.columns([1,4])
192
- with button_col:
193
- st.download_button(
194
- label="📥 " + semantic_t.get('download_graph', "Download"),
195
- data=analysis['concept_graph'],
196
- file_name="semantic_live_graph.png",
197
- mime="image/png",
198
- use_container_width=True
199
- )
200
-
201
- # Expandible con la interpretación
202
- with st.expander("📊 " + semantic_t.get('graph_help', "Graph Interpretation")):
203
- st.markdown("""
204
- - 🔀 Las flechas indican la dirección de la relación entre conceptos
205
- - 🎨 Los colores más intensos indican conceptos más centrales en el texto
206
- - El tamaño de los nodos representa la frecuencia del concepto
207
- - ↔️ El grosor de las líneas indica la fuerza de la conexión
208
- """)
209
-
210
- st.markdown('</div>', unsafe_allow_html=True)
211
-
212
- # Cerrar el contenedor principal
213
- st.markdown('</div>', unsafe_allow_html=True)
 
 
 
97
  if analysis_result and not analysis_result.get('success'):
98
  st.error(analysis_result.get('message', 'Error en el análisis'))
99
 
100
+ # Columna derecha: Visualización de resultados
101
+ with result_col:
102
+ st.subheader(semantic_t.get('live_results', 'Resultados en vivo'))
103
 
104
+ if 'last_result' in st.session_state.semantic_live_state and \
105
+ st.session_state.semantic_live_state['last_result'] is not None:
106
+
107
+ analysis = st.session_state.semantic_live_state['last_result']['analysis']
108
+
109
+ if 'key_concepts' in analysis and analysis['key_concepts'] and \
110
+ 'concept_graph' in analysis and analysis['concept_graph'] is not None:
111
 
112
+ # Estilos unificados en un solo bloque
113
+ st.markdown("""
114
+ <style>
115
+ .unified-container {
116
+ background-color: white;
117
+ border-radius: 10px;
118
+ overflow: hidden;
119
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
120
+ }
121
+ .concept-table {
122
+ display: flex;
123
+ flex-wrap: wrap;
124
+ gap: 10px;
125
+ padding: 15px;
126
+ background-color: #f8f9fa;
127
+ }
128
+ .concept-item {
129
+ background-color: white;
130
+ border-radius: 5px;
131
+ padding: 8px 12px;
132
+ display: flex;
133
+ align-items: center;
134
+ gap: 8px;
135
+ box-shadow: 0 1px 3px rgba(0,0,0,0.1);
136
+ }
137
+ .concept-name { font-weight: 500; color: #1f2937; }
138
+ .concept-freq { color: #6b7280; font-size: 0.9em; }
139
+ .graph-section { padding: 20px; }
140
+ </style>
141
+ """, unsafe_allow_html=True)
142
+
143
+ # Contenedor unificado para conceptos y grafo
144
+ with st.container():
145
+ # Conceptos
146
+ concepts_html = f"""
147
+ <div class="unified-container">
148
+ <div class="concept-table">
149
+ {''.join(f'<div class="concept-item"><span class="concept-name">{concept}</span>'
150
+ f'<span class="concept-freq">({freq:.2f})</span></div>'
151
+ for concept, freq in analysis['key_concepts'])}
152
+ </div>
153
+ <div class="graph-section">
154
+ """
155
+ st.markdown(concepts_html, unsafe_allow_html=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
 
157
+ # Grafo
158
+ st.image(
159
+ analysis['concept_graph'],
160
+ use_container_width=True,
161
+ caption=semantic_t.get(
162
+ 'graph_description',
163
+ 'Visualización de relaciones entre conceptos clave identificados en el texto.'
 
 
 
 
 
 
 
164
  )
165
+ )
166
 
167
+ st.markdown('</div></div>', unsafe_allow_html=True)
168
+
169
+ # Botones y controles fuera del contenedor principal
170
+ button_col, spacer_col = st.columns([1,4])
171
+ with button_col:
172
+ st.download_button(
173
+ label="📥 " + semantic_t.get('download_graph', "Download"),
174
+ data=analysis['concept_graph'],
175
+ file_name="semantic_live_graph.png",
176
+ mime="image/png",
177
+ use_container_width=True
178
+ )
179
+
180
+ with st.expander("📊 " + semantic_t.get('graph_help', "Graph Interpretation")):
181
+ st.markdown("""
182
+ - 🔀 Las flechas indican la dirección de la relación entre conceptos
183
+ - 🎨 Los colores más intensos indican conceptos más centrales en el texto
184
+ - El tamaño de los nodos representa la frecuencia del concepto
185
+ - ↔️ El grosor de las líneas indica la fuerza de la conexión
186
+ """)
187
+ else:
188
+ st.info(semantic_t.get('no_graph', 'No hay datos para mostrar'))
189
+
190
+ except Exception as e:
191
+ logger.error(f"Error general en interfaz semántica en vivo: {str(e)}")
192
+ st.error(semantic_t.get('general_error', "Se produjo un error. Por favor, intente de nuevo."))