AIdeaText commited on
Commit
d89b398
·
verified ·
1 Parent(s): 6f5a069

Update modules/studentact/current_situation_interface.py

Browse files
modules/studentact/current_situation_interface.py CHANGED
@@ -63,6 +63,26 @@ TEXT_TYPES = {
63
  }
64
  ####################################
65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  def display_current_situation_interface(lang_code, nlp_models, t):
67
  """
68
  Interfaz simplificada con gráfico de radar para visualizar métricas.
@@ -83,7 +103,7 @@ def display_current_situation_interface(lang_code, nlp_models, t):
83
  # Container principal con dos columnas
84
  with st.container():
85
  input_col, results_col = st.columns([1,2])
86
-
87
  with input_col:
88
  # Text area con manejo de estado
89
  text_input = st.text_area(
@@ -149,12 +169,115 @@ def display_current_situation_interface(lang_code, nlp_models, t):
149
  metrics=st.session_state.current_metrics,
150
  text_type=text_type
151
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
 
153
  except Exception as e:
154
  logger.error(f"Error en interfaz principal: {str(e)}")
155
  st.error("Ocurrió un error al cargar la interfaz")
156
 
157
- ###################################3333
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
 
159
  def display_results(metrics, text_type=None):
160
  """
@@ -233,16 +356,20 @@ def display_results(metrics, text_type=None):
233
  logger.error(f"Error mostrando resultados: {str(e)}")
234
  st.error("Error al mostrar los resultados")
235
 
236
-
237
  ######################################
238
- def display_radar_chart(metrics_config, thresholds):
 
239
  """
240
  Muestra el gráfico radar con los resultados.
 
 
 
 
241
  """
242
  try:
243
  # Preparar datos para el gráfico
244
  categories = [m['label'] for m in metrics_config]
245
- values_user = [m['value'] for m in metrics_config]
246
  min_values = [m['thresholds']['min'] for m in metrics_config]
247
  target_values = [m['thresholds']['target'] for m in metrics_config]
248
 
@@ -253,7 +380,7 @@ def display_radar_chart(metrics_config, thresholds):
253
  # Configurar radar
254
  angles = [n / float(len(categories)) * 2 * np.pi for n in range(len(categories))]
255
  angles += angles[:1]
256
- values_user += values_user[:1]
257
  min_values += min_values[:1]
258
  target_values += target_values[:1]
259
 
@@ -266,19 +393,53 @@ def display_radar_chart(metrics_config, thresholds):
266
  ax.set_ylim(0, 1)
267
 
268
  # Dibujar áreas de umbrales
269
- ax.plot(angles, min_values, '#e74c3c', linestyle='--', linewidth=1, label='Mínimo', alpha=0.5)
270
- ax.plot(angles, target_values, '#2ecc71', linestyle='--', linewidth=1, label='Meta', alpha=0.5)
271
- ax.fill_between(angles, target_values, [1]*len(angles), color='#2ecc71', alpha=0.1)
272
- ax.fill_between(angles, [0]*len(angles), min_values, color='#e74c3c', alpha=0.1)
 
 
 
 
 
 
 
 
 
 
 
 
 
273
 
274
- # Dibujar valores del usuario
275
- ax.plot(angles, values_user, '#3498db', linewidth=2, label='Tu escritura')
276
- ax.fill(angles, values_user, '#3498db', alpha=0.2)
 
 
 
277
 
278
  # Ajustar leyenda
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
279
  ax.legend(
 
280
  loc='upper right',
281
- bbox_to_anchor=(1.3, 1.1), # Cambiado de (0.1, 0.1) a (1.3, 1.1)
282
  fontsize=10,
283
  frameon=True,
284
  facecolor='white',
@@ -293,4 +454,5 @@ def display_radar_chart(metrics_config, thresholds):
293
  except Exception as e:
294
  logger.error(f"Error mostrando gráfico radar: {str(e)}")
295
  st.error("Error al mostrar el gráfico")
 
296
  #######################################
 
63
  }
64
  ####################################
65
 
66
+ ANALYSIS_DIMENSION_MAPPING = {
67
+ 'morphosyntactic': {
68
+ 'primary': ['vocabulary', 'clarity'],
69
+ 'secondary': ['structure'],
70
+ 'tools': ['arc_diagrams', 'word_repetition']
71
+ },
72
+ 'semantic': {
73
+ 'primary': ['cohesion', 'structure'],
74
+ 'secondary': ['vocabulary'],
75
+ 'tools': ['concept_graphs', 'semantic_networks']
76
+ },
77
+ 'discourse': {
78
+ 'primary': ['cohesion', 'structure'],
79
+ 'secondary': ['clarity'],
80
+ 'tools': ['comparative_analysis']
81
+ }
82
+ }
83
+
84
+ ####################################
85
+
86
  def display_current_situation_interface(lang_code, nlp_models, t):
87
  """
88
  Interfaz simplificada con gráfico de radar para visualizar métricas.
 
103
  # Container principal con dos columnas
104
  with st.container():
105
  input_col, results_col = st.columns([1,2])
106
+
107
  with input_col:
108
  # Text area con manejo de estado
109
  text_input = st.text_area(
 
169
  metrics=st.session_state.current_metrics,
170
  text_type=text_type
171
  )
172
+
173
+ # Agregar selector de modo
174
+ analysis_mode = st.radio(
175
+ "Modo de análisis",
176
+ ["Establecer línea base", "Comparar progreso"],
177
+ key="analysis_mode"
178
+ )
179
+
180
+ if analysis_mode == "Establecer línea base":
181
+ # Mostrar interfaz normal
182
+ display_baseline_interface(lang_code, nlp_models, t)
183
+ else:
184
+ # Mostrar interfaz de comparación
185
+ display_comparison_interface(lang_code, nlp_models, t)
186
 
187
  except Exception as e:
188
  logger.error(f"Error en interfaz principal: {str(e)}")
189
  st.error("Ocurrió un error al cargar la interfaz")
190
 
191
+ ###################################
192
+
193
+ def display_baseline_interface(lang_code, nlp_models, t):
194
+ """Interfaz para establecer línea base"""
195
+ # ... código existente de entrada de texto ...
196
+
197
+ if st.button("Establecer como línea base"):
198
+ metrics = analyze_text_dimensions(doc)
199
+ store_baseline_metrics(
200
+ username=st.session_state.username,
201
+ metrics=metrics,
202
+ text=text_input,
203
+ timestamp=datetime.now()
204
+ )
205
+ st.success("Línea base establecida")
206
+
207
+ def display_comparison_interface(lang_code, nlp_models, t):
208
+ """Interfaz para comparar progreso"""
209
+ # Obtener línea base
210
+ baseline = get_baseline_metrics(st.session_state.username)
211
+
212
+ if not baseline:
213
+ st.warning("Primero debes establecer una línea base")
214
+ return
215
+
216
+ # Mostrar entrada de texto actual
217
+ current_text = st.text_area("Nuevo texto")
218
+
219
+ if st.button("Analizar progreso"):
220
+ current_metrics = analyze_text_dimensions(nlp_models[lang_code](current_text))
221
+
222
+ # Mostrar comparación
223
+ display_comparison_results(
224
+ baseline_metrics=baseline['metrics'],
225
+ current_metrics=current_metrics
226
+ )
227
+
228
+ # Opción para guardar progreso
229
+ if st.button("Guardar este progreso"):
230
+ store_progress_metrics(
231
+ username=st.session_state.username,
232
+ metrics=current_metrics,
233
+ text=current_text,
234
+ timestamp=datetime.now()
235
+ )
236
+ st.success("Progreso guardado")
237
+
238
+ ###################################
239
+
240
+ def display_comparison_results(baseline_metrics, current_metrics):
241
+ """Muestra comparación entre línea base y métricas actuales"""
242
+
243
+ # Crear columnas para métricas y gráfico
244
+ metrics_col, graph_col = st.columns([1, 1.5])
245
+
246
+ with metrics_col:
247
+ for dimension in ['vocabulary', 'structure', 'cohesion', 'clarity']:
248
+ baseline = baseline_metrics[dimension]['normalized_score']
249
+ current = current_metrics[dimension]['normalized_score']
250
+ delta = current - baseline
251
+
252
+ st.metric(
253
+ dimension.title(),
254
+ f"{current:.2f}",
255
+ f"{delta:+.2f}",
256
+ delta_color="normal" if delta >= 0 else "inverse"
257
+ )
258
+
259
+ # Sugerir herramientas de mejora
260
+ if delta < 0:
261
+ suggest_improvement_tools(dimension)
262
+
263
+ with graph_col:
264
+ display_radar_chart_comparison(
265
+ baseline_metrics,
266
+ current_metrics
267
+ )
268
+
269
+ def suggest_improvement_tools(dimension):
270
+ """Sugiere herramientas basadas en la dimensión"""
271
+ suggestions = []
272
+ for analysis, mapping in ANALYSIS_DIMENSION_MAPPING.items():
273
+ if dimension in mapping['primary']:
274
+ suggestions.extend(mapping['tools'])
275
+
276
+ st.info(f"Herramientas sugeridas para mejorar {dimension}:")
277
+ for tool in suggestions:
278
+ st.write(f"- {tool}")
279
+
280
+ ###################################
281
 
282
  def display_results(metrics, text_type=None):
283
  """
 
356
  logger.error(f"Error mostrando resultados: {str(e)}")
357
  st.error("Error al mostrar los resultados")
358
 
 
359
  ######################################
360
+
361
+ def display_radar_chart(metrics_config, thresholds, baseline_metrics=None):
362
  """
363
  Muestra el gráfico radar con los resultados.
364
+ Args:
365
+ metrics_config: Configuración actual de métricas
366
+ thresholds: Umbrales para las métricas
367
+ baseline_metrics: Métricas de línea base (opcional)
368
  """
369
  try:
370
  # Preparar datos para el gráfico
371
  categories = [m['label'] for m in metrics_config]
372
+ values_current = [m['value'] for m in metrics_config]
373
  min_values = [m['thresholds']['min'] for m in metrics_config]
374
  target_values = [m['thresholds']['target'] for m in metrics_config]
375
 
 
380
  # Configurar radar
381
  angles = [n / float(len(categories)) * 2 * np.pi for n in range(len(categories))]
382
  angles += angles[:1]
383
+ values_current += values_current[:1]
384
  min_values += min_values[:1]
385
  target_values += target_values[:1]
386
 
 
393
  ax.set_ylim(0, 1)
394
 
395
  # Dibujar áreas de umbrales
396
+ ax.plot(angles, min_values, '#e74c3c', linestyle='--', linewidth=1,
397
+ label='Mínimo', alpha=0.5)
398
+ ax.plot(angles, target_values, '#2ecc71', linestyle='--', linewidth=1,
399
+ label='Meta', alpha=0.5)
400
+ ax.fill_between(angles, target_values, [1]*len(angles),
401
+ color='#2ecc71', alpha=0.1)
402
+ ax.fill_between(angles, [0]*len(angles), min_values,
403
+ color='#e74c3c', alpha=0.1)
404
+
405
+ # Si hay línea base, dibujarla primero
406
+ if baseline_metrics is not None:
407
+ values_baseline = [baseline_metrics[m['key']]['normalized_score']
408
+ for m in metrics_config]
409
+ values_baseline += values_baseline[:1]
410
+ ax.plot(angles, values_baseline, '#888888', linewidth=2,
411
+ label='Línea base', linestyle='--')
412
+ ax.fill(angles, values_baseline, '#888888', alpha=0.1)
413
 
414
+ # Dibujar valores actuales
415
+ label = 'Actual' if baseline_metrics else 'Tu escritura'
416
+ color = '#3498db' if baseline_metrics else '#3498db'
417
+
418
+ ax.plot(angles, values_current, color, linewidth=2, label=label)
419
+ ax.fill(angles, values_current, color, alpha=0.2)
420
 
421
  # Ajustar leyenda
422
+ legend_handles = []
423
+ if baseline_metrics:
424
+ legend_handles.extend([
425
+ plt.Line2D([], [], color='#888888', linestyle='--',
426
+ label='Línea base'),
427
+ plt.Line2D([], [], color='#3498db', label='Actual')
428
+ ])
429
+ else:
430
+ legend_handles.extend([
431
+ plt.Line2D([], [], color='#3498db', label='Tu escritura')
432
+ ])
433
+
434
+ legend_handles.extend([
435
+ plt.Line2D([], [], color='#e74c3c', linestyle='--', label='Mínimo'),
436
+ plt.Line2D([], [], color='#2ecc71', linestyle='--', label='Meta')
437
+ ])
438
+
439
  ax.legend(
440
+ handles=legend_handles,
441
  loc='upper right',
442
+ bbox_to_anchor=(1.3, 1.1),
443
  fontsize=10,
444
  frameon=True,
445
  facecolor='white',
 
454
  except Exception as e:
455
  logger.error(f"Error mostrando gráfico radar: {str(e)}")
456
  st.error("Error al mostrar el gráfico")
457
+
458
  #######################################