AIdeaText commited on
Commit
a86bc58
·
verified ·
1 Parent(s): 5882b6e

Create current_situation_interface.py

Browse files
modules/studentact/current_situation_interface.py ADDED
@@ -0,0 +1,291 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # modules/studentact/current_situation_interface.py
2
+
3
+ import streamlit as st
4
+ import logging
5
+ from ..utils.widget_utils import generate_unique_key
6
+
7
+ from ..database.current_situation_mongo_db import store_current_situation_result
8
+
9
+ from .current_situation_analysis import (
10
+ analyze_text_dimensions,
11
+ analyze_clarity,
12
+ analyze_reference_clarity,
13
+ analyze_vocabulary_diversity,
14
+ analyze_cohesion,
15
+ analyze_structure,
16
+ get_dependency_depths,
17
+ normalize_score,
18
+ generate_sentence_graphs,
19
+ generate_word_connections,
20
+ generate_connection_paths,
21
+ create_vocabulary_network,
22
+ create_syntax_complexity_graph,
23
+ create_cohesion_heatmap,
24
+ )
25
+
26
+ logger = logging.getLogger(__name__)
27
+ ####################################
28
+
29
+ def display_current_situation_interface(lang_code, nlp_models, t):
30
+ """
31
+ Interfaz simplificada para el análisis inicial, enfocada en recomendaciones directas.
32
+ """
33
+ try:
34
+ # Inicializar estados si no existen
35
+ if 'text_input' not in st.session_state:
36
+ st.session_state.text_input = ""
37
+ if 'show_results' not in st.session_state:
38
+ st.session_state.show_results = False
39
+ if 'current_doc' not in st.session_state:
40
+ st.session_state.current_doc = None
41
+ if 'current_metrics' not in st.session_state:
42
+ st.session_state.current_metrics = None
43
+
44
+ st.markdown("## Análisis Inicial de Escritura")
45
+
46
+ # Container principal con dos columnas
47
+ with st.container():
48
+ input_col, results_col = st.columns([1,2])
49
+
50
+ with input_col:
51
+ st.markdown("### Ingresa tu texto")
52
+
53
+ # Función para manejar cambios en el texto
54
+ def on_text_change():
55
+ st.session_state.text_input = st.session_state.text_area
56
+ st.session_state.show_results = False # Resetear resultados cuando el texto cambia
57
+
58
+ # Text area con manejo de estado
59
+ text_input = st.text_area(
60
+ t.get('input_prompt', "Escribe o pega tu texto aquí:"),
61
+ height=400,
62
+ key="text_area",
63
+ value=st.session_state.text_input,
64
+ on_change=on_text_change,
65
+ help="Este texto será analizado para darte recomendaciones personalizadas"
66
+ )
67
+
68
+ if st.button(
69
+ t.get('analyze_button', "Analizar mi escritura"),
70
+ type="primary",
71
+ disabled=not text_input.strip(),
72
+ use_container_width=True,
73
+ ):
74
+ try:
75
+ with st.spinner(t.get('processing', "Analizando...")):
76
+ # Procesar texto y obtener métricas
77
+ doc = nlp_models[lang_code](text_input)
78
+ metrics = analyze_text_dimensions(doc)
79
+
80
+ # Guardar en MongoDB
81
+ storage_success = store_current_situation_result(
82
+ username=st.session_state.username,
83
+ text=text_input,
84
+ metrics=metrics,
85
+ feedback=None # Por ahora sin feedback
86
+ )
87
+
88
+ if not storage_success:
89
+ logger.warning("No se pudo guardar el análisis en la base de datos")
90
+
91
+ # Actualizar estado
92
+ st.session_state.current_doc = doc
93
+ st.session_state.current_metrics = metrics
94
+ st.session_state.show_results = True
95
+ st.session_state.text_input = text_input
96
+
97
+ except Exception as e:
98
+ logger.error(f"Error en análisis: {str(e)}")
99
+ st.error(t.get('analysis_error', "Error al analizar el texto"))
100
+
101
+ # Mostrar resultados en la columna derecha
102
+ with results_col:
103
+ if st.session_state.show_results and st.session_state.current_metrics is not None:
104
+ display_recommendations(st.session_state.current_metrics, t)
105
+
106
+ # Opción para ver detalles
107
+ with st.expander("🔍 Ver análisis detallado", expanded=False):
108
+ display_current_situation_visual(
109
+ st.session_state.current_doc,
110
+ st.session_state.current_metrics
111
+ )
112
+
113
+ except Exception as e:
114
+ logger.error(f"Error en interfaz: {str(e)}")
115
+ st.error("Ocurrió un error. Por favor, intente de nuevo.")
116
+
117
+
118
+
119
+ def display_current_situation_visual(doc, metrics):
120
+ """
121
+ Muestra visualizaciones detalladas del análisis.
122
+ """
123
+ try:
124
+ st.markdown("### 📊 Visualizaciones Detalladas")
125
+
126
+ # 1. Visualización de vocabulario
127
+ with st.expander("Análisis de Vocabulario", expanded=True):
128
+ vocab_graph = create_vocabulary_network(doc)
129
+ if vocab_graph:
130
+ st.pyplot(vocab_graph)
131
+ plt.close(vocab_graph)
132
+
133
+ # 2. Visualización de estructura
134
+ with st.expander("Análisis de Estructura", expanded=True):
135
+ syntax_graph = create_syntax_complexity_graph(doc)
136
+ if syntax_graph:
137
+ st.pyplot(syntax_graph)
138
+ plt.close(syntax_graph)
139
+
140
+ # 3. Visualización de cohesión
141
+ with st.expander("Análisis de Cohesión", expanded=True):
142
+ cohesion_graph = create_cohesion_heatmap(doc)
143
+ if cohesion_graph:
144
+ st.pyplot(cohesion_graph)
145
+ plt.close(cohesion_graph)
146
+
147
+ except Exception as e:
148
+ logger.error(f"Error en visualización: {str(e)}")
149
+ st.error("Error al generar las visualizaciones")
150
+
151
+
152
+ ####################################
153
+ def display_recommendations(metrics, t):
154
+ """
155
+ Muestra recomendaciones basadas en las métricas del texto.
156
+ """
157
+ # 1. Resumen Visual con Explicación
158
+ st.markdown("### 📊 Resumen de tu Análisis")
159
+
160
+ # Explicación del sistema de medición
161
+ st.markdown("""
162
+ **¿Cómo interpretar los resultados?**
163
+
164
+ Cada métrica se mide en una escala de 0.0 a 1.0, donde:
165
+ - 0.0 - 0.4: Necesita atención prioritaria
166
+ - 0.4 - 0.6: En desarrollo
167
+ - 0.6 - 0.8: Buen nivel
168
+ - 0.8 - 1.0: Nivel avanzado
169
+ """)
170
+
171
+ # Métricas con explicaciones detalladas
172
+ col1, col2, col3, col4 = st.columns(4)
173
+
174
+ with col1:
175
+ st.metric(
176
+ "Vocabulario",
177
+ f"{metrics['vocabulary']['normalized_score']:.2f}",
178
+ help="Mide la variedad y riqueza de tu vocabulario. Un valor alto indica un uso diverso de palabras sin repeticiones excesivas."
179
+ )
180
+ with st.expander("ℹ️ Detalles"):
181
+ st.write("""
182
+ **Vocabulario**
183
+ - Evalúa la diversidad léxica
184
+ - Considera palabras únicas vs. totales
185
+ - Detecta repeticiones innecesarias
186
+ - Valor óptimo: > 0.7
187
+ """)
188
+
189
+ with col2:
190
+ st.metric(
191
+ "Estructura",
192
+ f"{metrics['structure']['normalized_score']:.2f}",
193
+ help="Evalúa la complejidad y variedad de las estructuras sintácticas en tus oraciones."
194
+ )
195
+ with st.expander("ℹ️ Detalles"):
196
+ st.write("""
197
+ **Estructura**
198
+ - Analiza la complejidad sintáctica
199
+ - Mide variación en construcciones
200
+ - Evalúa longitud de oraciones
201
+ - Valor óptimo: > 0.6
202
+ """)
203
+
204
+ with col3:
205
+ st.metric(
206
+ "Cohesión",
207
+ f"{metrics['cohesion']['normalized_score']:.2f}",
208
+ help="Indica qué tan bien conectadas están tus ideas y párrafos entre sí."
209
+ )
210
+ with st.expander("ℹ️ Detalles"):
211
+ st.write("""
212
+ **Cohesión**
213
+ - Mide conexiones entre ideas
214
+ - Evalúa uso de conectores
215
+ - Analiza progresión temática
216
+ - Valor óptimo: > 0.65
217
+ """)
218
+
219
+ with col4:
220
+ st.metric(
221
+ "Claridad",
222
+ f"{metrics['clarity']['normalized_score']:.2f}",
223
+ help="Evalúa la facilidad de comprensión general de tu texto."
224
+ )
225
+ with st.expander("ℹ️ Detalles"):
226
+ st.write("""
227
+ **Claridad**
228
+ - Evalúa comprensibilidad
229
+ - Considera estructura lógica
230
+ - Mide precisión expresiva
231
+ - Valor óptimo: > 0.7
232
+ """)
233
+
234
+ st.markdown("---")
235
+
236
+ # 2. Recomendaciones basadas en puntuaciones
237
+ st.markdown("### 💡 Recomendaciones Personalizadas")
238
+
239
+ # Recomendaciones morfosintácticas
240
+ if metrics['structure']['normalized_score'] < 0.6:
241
+ st.warning("""
242
+ #### 📝 Análisis Morfosintáctico Recomendado
243
+
244
+ **Tu nivel actual sugiere que sería beneficioso:**
245
+ 1. Realizar el análisis morfosintáctico de 3 párrafos diferentes
246
+ 2. Practicar la combinación de oraciones simples en compuestas
247
+ 3. Identificar y clasificar tipos de oraciones en textos académicos
248
+ 4. Ejercitar la variación sintáctica
249
+
250
+ *Hacer clic en "Comenzar ejercicios" para acceder al módulo morfosintáctico*
251
+ """)
252
+
253
+ # Recomendaciones semánticas
254
+ if metrics['vocabulary']['normalized_score'] < 0.7:
255
+ st.warning("""
256
+ #### 📚 Análisis Semántico Recomendado
257
+
258
+ **Para mejorar tu vocabulario y expresión:**
259
+ A. Realiza el análisis semántico de un texto académico
260
+ B. Identifica y agrupa campos semánticos relacionados
261
+ C. Practica la sustitución léxica en tus párrafos
262
+ D. Construye redes de conceptos sobre tu tema
263
+ E. Analiza las relaciones entre ideas principales
264
+
265
+ *Hacer clic en "Comenzar ejercicios" para acceder al módulo semántico*
266
+ """)
267
+
268
+ # Recomendaciones de cohesión
269
+ if metrics['cohesion']['normalized_score'] < 0.65:
270
+ st.warning("""
271
+ #### 🔄 Análisis del Discurso Recomendado
272
+
273
+ **Para mejorar la conexión entre ideas:**
274
+ 1. Realizar el análisis del discurso de un texto modelo
275
+ 2. Practicar el uso de diferentes conectores textuales
276
+ 3. Identificar cadenas de referencia en textos académicos
277
+ 4. Ejercitar la progresión temática en tus escritos
278
+
279
+ *Hacer clic en "Comenzar ejercicios" para acceder al módulo de análisis del discurso*
280
+ """)
281
+
282
+ # Botón de acción
283
+ st.markdown("---")
284
+ col1, col2, col3 = st.columns([1,2,1])
285
+ with col2:
286
+ st.button(
287
+ "🎯 Comenzar ejercicios recomendados",
288
+ type="primary",
289
+ use_container_width=True,
290
+ key="start_exercises"
291
+ )