AIdeaText commited on
Commit
4983811
·
verified ·
1 Parent(s): 2e6dd88

Update modules/studentact/current_situation_interface.py

Browse files
modules/studentact/current_situation_interface.py CHANGED
@@ -10,7 +10,13 @@ from ..database.current_situation_mongo_db import store_current_situation_result
10
  # Importaciones locales
11
  from translations import get_translations
12
 
13
- from .claude_recommendations import display_personalized_recommendations
 
 
 
 
 
 
14
 
15
  from .current_situation_analysis import (
16
  analyze_text_dimensions,
@@ -25,8 +31,7 @@ from .current_situation_analysis import (
25
  generate_connection_paths,
26
  create_vocabulary_network,
27
  create_syntax_complexity_graph,
28
- create_cohesion_heatmap,
29
- generate_recommendations
30
  )
31
 
32
  # Configuración del estilo de matplotlib para el gráfico de radar
@@ -36,8 +41,9 @@ plt.rcParams['axes.spines.top'] = False
36
  plt.rcParams['axes.spines.right'] = False
37
 
38
  logger = logging.getLogger(__name__)
39
- ####################################
40
 
 
 
41
  TEXT_TYPES = {
42
  'academic_article': {
43
  'name': 'Artículo Académico',
@@ -69,6 +75,196 @@ TEXT_TYPES = {
69
  }
70
  ####################################
71
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  def display_current_situation_interface(lang_code, nlp_models, t):
73
  """
74
  Interfaz simplificada con gráfico de radar para visualizar métricas.
@@ -142,11 +338,12 @@ def display_current_situation_interface(lang_code, nlp_models, t):
142
  # Primero los radio buttons para tipo de texto
143
  st.markdown("### Tipo de texto")
144
  text_type = st.radio(
145
- "",
146
  options=list(TEXT_TYPES.keys()),
147
  format_func=lambda x: TEXT_TYPES[x]['name'],
148
  horizontal=True,
149
  key="text_type_radio",
 
150
  help="Selecciona el tipo de texto para ajustar los criterios de evaluación"
151
  )
152
 
@@ -176,18 +373,28 @@ def display_current_situation_interface(lang_code, nlp_models, t):
176
  recommendations['text_type'] = text_type
177
  st.session_state.current_recommendations = recommendations
178
 
179
- display_recommendations_with_actions(
180
- st.session_state.current_recommendations,
181
- lang_code,
182
- t
183
- )
 
 
 
 
 
 
 
 
 
 
 
 
184
 
185
  except Exception as e:
186
  logger.error(f"Error en interfaz principal: {str(e)}")
187
  st.error("Ocurrió un error al cargar la interfaz")
188
 
189
- ###################################3333
190
-
191
  def display_diagnosis(metrics, text_type=None):
192
  """
193
  Muestra los resultados del análisis: métricas verticalmente y gráfico radar.
@@ -266,7 +473,6 @@ def display_diagnosis(metrics, text_type=None):
266
  st.error("Error al mostrar los resultados")
267
 
268
 
269
- ######################################
270
  def display_radar_chart(metrics_config, thresholds):
271
  """
272
  Muestra el gráfico radar con los resultados.
@@ -324,6 +530,4 @@ def display_radar_chart(metrics_config, thresholds):
324
 
325
  except Exception as e:
326
  logger.error(f"Error mostrando gráfico radar: {str(e)}")
327
- st.error("Error al mostrar el gráfico")
328
-
329
- #####################################################
 
10
  # Importaciones locales
11
  from translations import get_translations
12
 
13
+ # Importamos la función de recomendaciones personalizadas si existe
14
+ try:
15
+ from .claude_recommendations import display_personalized_recommendations
16
+ except ImportError:
17
+ # Si no existe el módulo, definimos una función placeholder
18
+ def display_personalized_recommendations(text, metrics, text_type, lang_code, t):
19
+ st.warning("Módulo de recomendaciones personalizadas no disponible. Por favor, contacte al administrador.")
20
 
21
  from .current_situation_analysis import (
22
  analyze_text_dimensions,
 
31
  generate_connection_paths,
32
  create_vocabulary_network,
33
  create_syntax_complexity_graph,
34
+ create_cohesion_heatmap
 
35
  )
36
 
37
  # Configuración del estilo de matplotlib para el gráfico de radar
 
41
  plt.rcParams['axes.spines.right'] = False
42
 
43
  logger = logging.getLogger(__name__)
 
44
 
45
+ ####################################
46
+ # Definición global de los tipos de texto y sus umbrales
47
  TEXT_TYPES = {
48
  'academic_article': {
49
  'name': 'Artículo Académico',
 
75
  }
76
  ####################################
77
 
78
+ # Función para generar recomendaciones basadas en las métricas
79
+ def generate_recommendations(metrics, text_type, lang_code):
80
+ """
81
+ Genera recomendaciones básicas basadas en las métricas y el tipo de texto.
82
+ Este es un generador de recomendaciones básico que puede ser reemplazado
83
+ por una versión más avanzada que use la API de Claude.
84
+ """
85
+ try:
86
+ # Obtenemos los umbrales para el tipo de texto seleccionado
87
+ thresholds = TEXT_TYPES[text_type]['thresholds']
88
+
89
+ # Identificamos las áreas más débiles
90
+ areas = ['vocabulary', 'structure', 'cohesion', 'clarity']
91
+ scores = {area: metrics[area]['normalized_score'] for area in areas}
92
+ weak_areas = sorted(areas, key=lambda x: scores[x])
93
+
94
+ # La primera área es la más débil
95
+ priority_area = weak_areas[0]
96
+
97
+ # Recomendaciones básicas para cada área
98
+ recommendations = {
99
+ 'priority': {
100
+ 'area': priority_area,
101
+ 'tips': ["Despliega el asistente virtual (potenciado por Claude.AI) que se ubica en la parte superior izquierda, presiona la flecha del lado del logo."]
102
+ },
103
+ 'vocabulary': [
104
+ "Utiliza un vocabulario más variado y específico.",
105
+ "Evita repetir palabras, usa sinónimos.",
106
+ "Incorpora términos técnicos apropiados para tu disciplina."
107
+ ],
108
+ 'structure': [
109
+ "Varía la estructura de tus oraciones.",
110
+ "Usa tanto oraciones simples como complejas.",
111
+ "Organiza tus ideas en párrafos con una estructura clara."
112
+ ],
113
+ 'cohesion': [
114
+ "Utiliza conectores y marcadores textuales.",
115
+ "Asegura la progresión lógica entre ideas.",
116
+ "Mantén la coherencia temática a lo largo del texto."
117
+ ],
118
+ 'clarity': [
119
+ "Evita frases excesivamente largas o complejas.",
120
+ "Define términos técnicos cuando sea necesario.",
121
+ "Revisa que cada párrafo desarrolle una idea principal."
122
+ ],
123
+ 'text_type': text_type # Guardamos el tipo de texto
124
+ }
125
+
126
+ return recommendations
127
+ except Exception as e:
128
+ logger.error(f"Error en generate_recommendations: {str(e)}")
129
+ # Recomendaciones por defecto en caso de error
130
+ return {
131
+ 'priority': {
132
+ 'area': 'clarity',
133
+ 'tips': ["Revisa tu texto para mejorar su claridad y estructura."]
134
+ },
135
+ 'text_type': text_type
136
+ }
137
+
138
+ # Función para mostrar recomendaciones
139
+ def display_recommendations_with_actions(recommendations, lang_code, t):
140
+ """
141
+ Muestra recomendaciones personalizadas para mejorar el texto.
142
+ Esta función puede ser reemplazada por display_personalized_recommendations
143
+ cuando se implemente la integración con Claude API.
144
+ """
145
+ try:
146
+ # Definir colores para cada categoría
147
+ colors = {
148
+ 'vocabulary': '#2E86C1', # Azul
149
+ 'structure': '#28B463', # Verde
150
+ 'cohesion': '#F39C12', # Naranja
151
+ 'clarity': '#9B59B6', # Púrpura
152
+ 'priority': '#E74C3C' # Rojo para la categoría prioritaria
153
+ }
154
+
155
+ # Iconos para cada categoría
156
+ icons = {
157
+ 'vocabulary': '📚',
158
+ 'structure': '🏗️',
159
+ 'cohesion': '🔄',
160
+ 'clarity': '💡',
161
+ 'priority': '⭐'
162
+ }
163
+
164
+ # Obtener traducciones para cada dimensión
165
+ dimension_names = {
166
+ 'vocabulary': t.get('SITUATION_ANALYSIS', {}).get('vocabulary', "Vocabulario"),
167
+ 'structure': t.get('SITUATION_ANALYSIS', {}).get('structure', "Estructura"),
168
+ 'cohesion': t.get('SITUATION_ANALYSIS', {}).get('cohesion', "Cohesión"),
169
+ 'clarity': t.get('SITUATION_ANALYSIS', {}).get('clarity', "Claridad"),
170
+ 'priority': t.get('SITUATION_ANALYSIS', {}).get('priority', "Prioridad")
171
+ }
172
+
173
+ # Título de la sección prioritaria
174
+ priority_focus = t.get('SITUATION_ANALYSIS', {}).get('priority_focus', 'Área prioritaria para mejorar')
175
+ st.markdown(f"### {icons['priority']} {priority_focus}")
176
+
177
+ # Determinar área prioritaria
178
+ priority_area = recommendations.get('priority', {}).get('area', 'vocabulary')
179
+ priority_title = dimension_names.get(priority_area, "Área prioritaria")
180
+
181
+ # Determinar el contenido para mostrar
182
+ priority_content = recommendations.get('priority', {}).get('tips', [])
183
+ if isinstance(priority_content, list):
184
+ priority_content = "<br>".join([f"• {tip}" for tip in priority_content])
185
+
186
+ # Mostrar la recomendación prioritaria
187
+ with st.container():
188
+ st.markdown(
189
+ f"""
190
+ <div style="border:2px solid {colors['priority']}; border-radius:5px; padding:15px; margin-bottom:20px;">
191
+ <h4 style="color:{colors['priority']};">{priority_title}</h4>
192
+ <p>{priority_content}</p>
193
+ </div>
194
+ """,
195
+ unsafe_allow_html=True
196
+ )
197
+
198
+ # Crear dos columnas para las tarjetas de recomendaciones restantes
199
+ col1, col2 = st.columns(2)
200
+
201
+ # Distribuir las recomendaciones en las columnas
202
+ categories = ['vocabulary', 'structure', 'cohesion', 'clarity']
203
+ for i, category in enumerate(categories):
204
+ # Saltar si esta categoría ya es la prioritaria
205
+ if category == priority_area:
206
+ continue
207
+
208
+ # Obtener las recomendaciones para esta categoría
209
+ category_content = recommendations.get(category, [])
210
+ if isinstance(category_content, list):
211
+ category_content = "<br>".join([f"• {tip}" for tip in category_content])
212
+
213
+ category_title = dimension_names.get(category, category)
214
+
215
+ # Alternar entre columnas
216
+ with col1 if i % 2 == 0 else col2:
217
+ # Crear tarjeta para cada recomendación
218
+ st.markdown(
219
+ f"""
220
+ <div style="border:1px solid {colors[category]}; border-radius:5px; padding:10px; margin-bottom:15px;">
221
+ <h4 style="color:{colors[category]};">{icons[category]} {category_title}</h4>
222
+ <p>{category_content}</p>
223
+ </div>
224
+ """,
225
+ unsafe_allow_html=True
226
+ )
227
+
228
+ # Agregar una sección para recursos adicionales
229
+ st.markdown("---")
230
+ st.markdown("### 📖 Recursos adicionales")
231
+
232
+ with st.expander("Ver recursos de aprendizaje"):
233
+ st.markdown("""
234
+ ### Recursos por área
235
+
236
+ #### Vocabulario
237
+ - **Diccionario de la Real Academia Española**: [www.rae.es](https://www.rae.es)
238
+ - **Fundación del Español Urgente**: [www.fundeu.es](https://www.fundeu.es)
239
+
240
+ #### Estructura
241
+ - **Manual de gramática**: [Gramática y ortografía para dummies](https://www.planetadelibros.com/libro-gramatica-y-ortografia-para-dummies/248265)
242
+ - **Ortografía de la RAE**: [Ortografía básica de la lengua española](https://www.rae.es/obras-academicas/ortografia/ortografia-basica-de-la-lengua-espanola)
243
+
244
+ #### Cohesión
245
+ - **Centro Virtual Cervantes**: [Diccionario de términos clave de ELE](https://cvc.cervantes.es/ensenanza/biblioteca_ele/diccio_ele/indice.htm)
246
+ - **Curso de cohesión textual**: [Centro de Escritura Javeriano](https://www2.javerianacali.edu.co/sites/ujc/files/normas_apa_revisada_y_actualizada_mayo_2019.pdf)
247
+
248
+ #### Claridad
249
+ - **Curso de escritura científica**: [Cómo escribir y publicar trabajos científicos](https://www.conacyt.gov.py/sites/default/files/upload_editores/u38/CONI-NOR-113.pdf)
250
+ - **Manual de estilo**: [Manual de estilo de la lengua española](https://www.planetadelibros.com/libro-manual-de-estilo-de-la-lengua-espanola/17811)
251
+ """)
252
+
253
+ # Boletines o actualizaciones del sistema
254
+ with st.expander("📬 Actualizaciones de AIdeaText"):
255
+ st.markdown("""
256
+ ## Próximas actualizaciones
257
+
258
+ - **Nueva funcionalidad**: Análisis comparativo entre textos propios
259
+ - **Mejora**: Recomendaciones más detalladas y personalizadas
260
+ - **Próximamente**: Tutorial interactivo para mejorar la escritura
261
+
262
+ > Estamos trabajando continuamente para mejorar tus herramientas de escritura.
263
+ """)
264
+ except Exception as e:
265
+ logger.error(f"Error mostrando recomendaciones: {str(e)}")
266
+ st.error("Error al mostrar las recomendaciones")
267
+
268
  def display_current_situation_interface(lang_code, nlp_models, t):
269
  """
270
  Interfaz simplificada con gráfico de radar para visualizar métricas.
 
338
  # Primero los radio buttons para tipo de texto
339
  st.markdown("### Tipo de texto")
340
  text_type = st.radio(
341
+ label="Tipo de texto",
342
  options=list(TEXT_TYPES.keys()),
343
  format_func=lambda x: TEXT_TYPES[x]['name'],
344
  horizontal=True,
345
  key="text_type_radio",
346
+ label_visibility="collapsed",
347
  help="Selecciona el tipo de texto para ajustar los criterios de evaluación"
348
  )
349
 
 
373
  recommendations['text_type'] = text_type
374
  st.session_state.current_recommendations = recommendations
375
 
376
+ # Intentar usar recomendaciones avanzadas si están disponibles
377
+ try:
378
+ # Intenta usar la función avanzada si está disponible
379
+ display_personalized_recommendations(
380
+ text=text_input,
381
+ metrics=st.session_state.current_metrics,
382
+ text_type=text_type,
383
+ lang_code=lang_code,
384
+ t=t
385
+ )
386
+ except (NameError, ImportError):
387
+ # Si no está disponible, usa la función básica
388
+ display_recommendations_with_actions(
389
+ st.session_state.current_recommendations,
390
+ lang_code,
391
+ t
392
+ )
393
 
394
  except Exception as e:
395
  logger.error(f"Error en interfaz principal: {str(e)}")
396
  st.error("Ocurrió un error al cargar la interfaz")
397
 
 
 
398
  def display_diagnosis(metrics, text_type=None):
399
  """
400
  Muestra los resultados del análisis: métricas verticalmente y gráfico radar.
 
473
  st.error("Error al mostrar los resultados")
474
 
475
 
 
476
  def display_radar_chart(metrics_config, thresholds):
477
  """
478
  Muestra el gráfico radar con los resultados.
 
530
 
531
  except Exception as e:
532
  logger.error(f"Error mostrando gráfico radar: {str(e)}")
533
+ st.error("Error al mostrar el gráfico")