AIdeaText commited on
Commit
afa5101
·
verified ·
1 Parent(s): 7b66d7b

Update modules/semantic/semantic_interface.py

Browse files
Files changed (1) hide show
  1. modules/semantic/semantic_interface.py +108 -51
modules/semantic/semantic_interface.py CHANGED
@@ -145,7 +145,6 @@ 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
- Versión optimizada con distribución uniforme de conceptos y formato compacto.
149
  """
150
  if semantic_result is None or not semantic_result['success']:
151
  st.warning(semantic_t.get('no_results', 'No results available'))
@@ -153,67 +152,125 @@ def display_semantic_results(semantic_result, lang_code, semantic_t):
153
 
154
  analysis = semantic_result['analysis']
155
 
156
- # Mostrar conceptos clave
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 (máx 5, mín 2)
160
- num_concepts = len(analysis['key_concepts'])
161
- num_cols = min(max(2, (num_concepts + 2) // 3), 5) # Fórmula para distribución óptima
 
 
 
 
 
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: 6px 10px;
172
- margin: 4px 0;
173
- font-size: 0.9em;
174
- display: flex;
175
- justify-content: space-between;
176
- align-items: center;
177
- ">
178
- <span style="font-weight: 500;">{concept}</span>
179
- <span style="color: #666; font-size: 0.85em;">{freq:.2f}</span>
180
- </div>
181
- """,
182
- unsafe_allow_html=True
183
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
184
  else:
185
  st.info(semantic_t.get('no_concepts', 'No key concepts found'))
186
 
187
- # Mostrar gráfico de conceptos
 
 
188
  if 'concept_graph' in analysis and analysis['concept_graph'] is not None:
189
  try:
190
- # Mostrar el gráfico con ancho de contenedor
191
- st.image(
192
- analysis['concept_graph'],
193
- use_container_width=True, # Corregido el parámetro obsoleto
194
- caption=semantic_t.get('graph_description', 'Visualización de relaciones entre conceptos clave')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
  )
 
196
 
197
- # Sección de interpretación compacta
198
- with st.expander("📊 " + semantic_t.get('semantic_graph_interpretation', "Interpretación")):
199
- st.caption(f"""
200
- {semantic_t.get('semantic_arrow_meaning', 'Flechas → Dirección relación')}
201
- {semantic_t.get('semantic_color_meaning', 'Color → Centralidad')}
202
- {semantic_t.get('semantic_size_meaning', 'Tamaño → Frecuencia')}
203
- • {semantic_t.get('semantic_thickness_meaning', 'Grosor → Fuerza conexión')}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
204
  """)
205
 
206
- # Botón de descarga compacto
207
- st.download_button(
208
- label="⬇️ " + semantic_t.get('download_graph', "Descargar"),
209
- data=analysis['concept_graph'],
210
- file_name="semantic_network.png",
211
- mime="image/png",
212
- use_container_width=True
213
- )
214
-
 
 
215
  except Exception as e:
216
- logger.error(f"Error al mostrar el gráfico: {str(e)}")
217
- st.error(semantic_t.get('graph_error', 'Error al visualizar el gráfico'))
218
  else:
219
- st.info(semantic_t.get('no_graph', 'No se generó el gráfico de conceptos'))
 
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
 
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'))