AIdeaText commited on
Commit
67aab6f
·
verified ·
1 Parent(s): 7dd86ce

Update modules/semantic/semantic_interface.py

Browse files
Files changed (1) hide show
  1. modules/semantic/semantic_interface.py +50 -108
modules/semantic/semantic_interface.py CHANGED
@@ -145,6 +145,7 @@ def display_semantic_interface(lang_code, nlp_models, semantic_t):
145
  def display_semantic_results(semantic_result, lang_code, semantic_t):
146
  """
147
  Muestra los resultados del análisis semántico de conceptos clave.
 
148
  """
149
  if semantic_result is None or not semantic_result['success']:
150
  st.warning(semantic_t.get('no_results', 'No results available'))
@@ -152,125 +153,66 @@ def display_semantic_results(semantic_result, lang_code, semantic_t):
152
 
153
  analysis = semantic_result['analysis']
154
 
155
- # Mostrar conceptos clave en formato horizontal
156
  st.subheader(semantic_t.get('key_concepts', 'Key Concepts'))
157
  if 'key_concepts' in analysis and analysis['key_concepts']:
158
- # Crear tabla de conceptos
159
- df = pd.DataFrame(
160
- analysis['key_concepts'],
161
- columns=[
162
- semantic_t.get('concept', 'Concept'),
163
- semantic_t.get('frequency', 'Frequency')
164
- ]
165
- )
166
 
167
- # Convertir DataFrame a formato horizontal
168
- st.write(
169
- """
170
- <style>
171
- .concept-table {
172
- display: flex;
173
- flex-wrap: wrap;
174
- gap: 10px;
175
- margin-bottom: 20px;
176
- }
177
- .concept-item {
178
- background-color: #f0f2f6;
179
- border-radius: 5px;
180
- padding: 8px 12px;
181
- display: flex;
182
- align-items: center;
183
- gap: 8px;
184
- }
185
- .concept-name {
186
- font-weight: bold;
187
- }
188
- .concept-freq {
189
- color: #666;
190
- font-size: 0.9em;
191
- }
192
- </style>
193
- <div class="concept-table">
194
- """ +
195
- ''.join([
196
- f'<div class="concept-item"><span class="concept-name">{concept}</span>'
197
- f'<span class="concept-freq">({freq:.2f})</span></div>'
198
- for concept, freq in df.values
199
- ]) +
200
- "</div>",
201
- unsafe_allow_html=True
202
- )
203
  else:
204
  st.info(semantic_t.get('no_concepts', 'No key concepts found'))
205
 
206
- # Gráfico de conceptos
207
- # st.subheader(semantic_t.get('concept_graph', 'Concepts Graph'))
208
- #Colocar aquí el bloque de código
209
  if 'concept_graph' in analysis and analysis['concept_graph'] is not None:
210
  try:
211
- # Container para el grafo con estilos mejorados
212
- st.markdown(
213
- """
214
- <style>
215
- .graph-container {
216
- background-color: white;
217
- border-radius: 10px;
218
- padding: 20px;
219
- box-shadow: 0 2px 4px rgba(0,0,0,0.1);
220
- margin: 10px 0;
221
- }
222
- .button-container {
223
- display: flex;
224
- gap: 10px;
225
- margin: 10px 0;
226
- }
227
- </style>
228
- """,
229
- unsafe_allow_html=True
230
  )
231
- #Colocar aquí el bloque de código
232
 
233
- with st.container():
234
- st.markdown('<div class="graph-container">', unsafe_allow_html=True)
235
-
236
- # Mostrar grafo
237
- graph_bytes = analysis['concept_graph']
238
- graph_base64 = base64.b64encode(graph_bytes).decode()
239
- st.markdown(
240
- f'<img src="data:image/png;base64,{graph_base64}" alt="Concept Graph" style="width:100%;"/>',
241
- unsafe_allow_html=True
242
- )
243
-
244
- # Leyenda del grafo
245
- #st.caption(semantic_t.get(
246
- # 'graph_description',
247
- # 'Visualización de relaciones entre conceptos clave identificados en el texto.'
248
- #))
249
-
250
- st.markdown('</div>', unsafe_allow_html=True)
251
-
252
- # Expandible con la interpretación
253
- with st.expander("📊 " + semantic_t.get('semantic_graph_interpretation', "Interpretación del gráfico semántico")):
254
- st.markdown(f"""
255
- - 🔀 {semantic_t.get('semantic_arrow_meaning', 'Las flechas indican la dirección de la relación entre conceptos')}
256
- - 🎨 {semantic_t.get('semantic_color_meaning', 'Los colores más intensos indican conceptos más centrales en el texto')}
257
- - ⭕ {semantic_t.get('semantic_size_meaning', 'El tamaño de los nodos representa la frecuencia del concepto')}
258
- - ↔️ {semantic_t.get('semantic_thickness_meaning', 'El grosor de las líneas indica la fuerza de la conexión')}
259
  """)
260
 
261
- # Contenedor para botones
262
- col1, col2 = st.columns([1,4])
263
- with col1:
264
- st.download_button(
265
- label="📥 " + semantic_t.get('download_semantic_network_graph', "Descargar gráfico de red semántica"),
266
- data=graph_bytes,
267
- file_name="semantic_graph.png",
268
- mime="image/png",
269
- use_container_width=True
270
- )
271
-
272
  except Exception as e:
273
- logger.error(f"Error displaying graph: {str(e)}")
274
- st.error(semantic_t.get('graph_error', 'Error displaying the graph'))
275
  else:
276
- st.info(semantic_t.get('no_graph', 'No concept graph available'))
 
145
  def display_semantic_results(semantic_result, lang_code, semantic_t):
146
  """
147
  Muestra los resultados del análisis semántico de conceptos clave.
148
+ Versión optimizada sin div contenedor del gráfico.
149
  """
150
  if semantic_result is None or not semantic_result['success']:
151
  st.warning(semantic_t.get('no_results', 'No results available'))
 
153
 
154
  analysis = semantic_result['analysis']
155
 
156
+ # Mostrar conceptos clave en formato horizontal mejorado
157
  st.subheader(semantic_t.get('key_concepts', 'Key Concepts'))
158
  if 'key_concepts' in analysis and analysis['key_concepts']:
159
+ # Calcular número óptimo de columnas basado en la cantidad de conceptos
160
+ num_concepts = len(analysis['key_concepts'])
161
+ num_cols = min(max(2, (num_concepts + 2) // 3), 5) # Entre 2 y 5 columnas
 
 
 
 
 
162
 
163
+ cols = st.columns(num_cols)
164
+ for idx, (concept, freq) in enumerate(analysis['key_concepts']):
165
+ with cols[idx % num_cols]:
166
+ st.markdown(
167
+ f"""
168
+ <div style="
169
+ background-color: #f0f2f6;
170
+ border-radius: 12px;
171
+ padding: 8px 12px;
172
+ margin: 4px 0;
173
+ display: flex;
174
+ justify-content: space-between;
175
+ align-items: center;
176
+ ">
177
+ <span style="font-weight: 500;">{concept}</span>
178
+ <span style="color: #666; font-size: 0.85em;">{freq:.2f}</span>
179
+ </div>
180
+ """,
181
+ unsafe_allow_html=True
182
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
  else:
184
  st.info(semantic_t.get('no_concepts', 'No key concepts found'))
185
 
186
+ # Mostrar gráfico de conceptos directamente
 
 
187
  if 'concept_graph' in analysis and analysis['concept_graph'] is not None:
188
  try:
189
+ # Mostrar el gráfico sin contenedores adicionales
190
+ st.image(
191
+ analysis['concept_graph'],
192
+ use_container_width=True,
193
+ caption=semantic_t.get('graph_description', 'Visualización de relaciones entre conceptos clave')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
194
  )
 
195
 
196
+ # Sección de interpretación compacta
197
+ with st.expander("📊 " + semantic_t.get('semantic_graph_interpretation', "Interpretación")):
198
+ st.markdown(f"""
199
+ - 🔀 {semantic_t.get('semantic_arrow_meaning', 'Flechas: dirección de la relación')}
200
+ - 🎨 {semantic_t.get('semantic_color_meaning', 'Color: centralidad del concepto')}
201
+ - {semantic_t.get('semantic_size_meaning', 'Tamaño: frecuencia del concepto')}
202
+ - ↔️ {semantic_t.get('semantic_thickness_meaning', 'Grosor: fuerza de la conexión')}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
203
  """)
204
 
205
+ # Botón de descarga
206
+ st.download_button(
207
+ label="📥 " + semantic_t.get('download_graph', "Descargar gráfico"),
208
+ data=analysis['concept_graph'],
209
+ file_name="semantic_network.png",
210
+ mime="image/png",
211
+ use_container_width=True
212
+ )
213
+
 
 
214
  except Exception as e:
215
+ logger.error(f"Error al mostrar el gráfico: {str(e)}")
216
+ st.error(semantic_t.get('graph_error', 'Error al visualizar el gráfico'))
217
  else:
218
+ st.info(semantic_t.get('no_graph', 'No se generó el gráfico de conceptos'))