File size: 10,373 Bytes
e2c4138
 
 
 
 
 
47b7a04
 
8990e66
47b7a04
 
 
 
 
 
 
 
 
e2c4138
47b7a04
e2c4138
 
 
0926d6b
c902818
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0926d6b
5a6bd8e
0926d6b
5a6bd8e
0926d6b
 
 
 
 
 
 
 
 
5a6bd8e
0926d6b
 
 
 
 
 
f0f13b4
0926d6b
 
 
 
 
 
 
 
 
 
 
5a6bd8e
0926d6b
5a6bd8e
 
 
 
742e283
 
5a6bd8e
742e283
 
 
5a6bd8e
742e283
 
 
 
 
 
b1257b2
742e283
b1257b2
 
 
 
 
 
742e283
b1257b2
742e283
 
 
 
 
 
 
 
b1257b2
 
 
 
 
742e283
b1257b2
742e283
 
 
 
 
 
 
 
b1257b2
 
 
 
 
742e283
b1257b2
742e283
 
 
 
 
 
 
 
b1257b2
 
 
 
 
742e283
b1257b2
742e283
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5a6bd8e
742e283
5a6bd8e
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
# modules/studentact/current_situation_interface.py

import streamlit as st
import logging
from ..utils.widget_utils import generate_unique_key
from .current_situation_analysis import (
    analyze_text_dimensions, 
    analyze_clarity,
    analyze_reference_clarity,
    analyze_vocabulary_diversity, 
    analyze_cohesion,
    analyze_structure,
    get_dependency_depths, 
    normalize_score, 
    generate_sentence_graphs, 
    generate_word_connections, 
    generate_connection_paths,
    create_vocabulary_network, 
    create_syntax_complexity_graph, 
    create_cohesion_heatmap,     
)

logger = logging.getLogger(__name__)
####################################
def display_current_situation_interface(lang_code, nlp_models, t):
    """
    Interfaz simplificada para el análisis inicial, enfocada en recomendaciones directas.
    """
    # Inicializar estados si no existen
    if 'text_input' not in st.session_state:
        st.session_state.text_input = ""
    if 'show_results' not in st.session_state:
        st.session_state.show_results = False
    if 'current_doc' not in st.session_state:
        st.session_state.current_doc = None
    if 'current_metrics' not in st.session_state:
        st.session_state.current_metrics = None

    st.markdown("## Análisis Inicial de Escritura")
    
    # Container principal con dos columnas
    with st.container():
        input_col, results_col = st.columns([1,2])
        
        with input_col:
            st.markdown("### Ingresa tu texto")
            
            # Función para manejar cambios en el texto
            def on_text_change():
                st.session_state.text_input = st.session_state.text_area
                st.session_state.show_results = False  # Resetear resultados cuando el texto cambia
            
            # Text area con manejo de estado
            text_input = st.text_area(
                t.get('input_prompt', "Escribe o pega tu texto aquí:"),
                height=400,
                key="text_area",
                value=st.session_state.text_input,
                on_change=on_text_change,
                help="Este texto será analizado para darte recomendaciones personalizadas"
            )
            
            # Botón de análisis
            if st.button(
                t.get('analyze_button', "Analizar mi escritura"),
                type="primary",
                disabled=not text_input.strip(),
                use_container_width=True,
            ):
                try:
                    with st.spinner(t.get('processing', "Analizando...")):
                        # Procesar texto y obtener métricas
                        doc = nlp_models[lang_code](text_input)
                        metrics = analyze_text_dimensions(doc)
                        
                        # Actualizar estado con nuevos resultados
                        st.session_state.current_doc = doc
                        st.session_state.current_metrics = metrics
                        st.session_state.show_results = True
                        
                        # Mantener el texto en el estado
                        st.session_state.text_input = text_input
                        
                except Exception as e:
                    logger.error(f"Error en análisis: {str(e)}")
                    st.error(t.get('analysis_error', "Error al analizar el texto"))
        
        # Mostrar resultados en la columna derecha
        with results_col:
            if st.session_state.show_results and st.session_state.current_metrics is not None:
                display_recommendations(st.session_state.current_metrics, t)
                
                # Opción para ver detalles
                with st.expander("🔍 Ver análisis detallado", expanded=False):
                    display_current_situation_visual(
                        st.session_state.current_doc,
                        st.session_state.current_metrics
                    )

def display_current_situation_visual(doc, metrics):
    """
    Muestra visualizaciones detalladas del análisis.
    """
    try:
        st.markdown("### 📊 Visualizaciones Detalladas")
        
        # 1. Visualización de vocabulario
        with st.expander("Análisis de Vocabulario", expanded=True):
            vocab_graph = create_vocabulary_network(doc)
            if vocab_graph:
                st.pyplot(vocab_graph)
                plt.close(vocab_graph)
        
        # 2. Visualización de estructura
        with st.expander("Análisis de Estructura", expanded=True):
            syntax_graph = create_syntax_complexity_graph(doc)
            if syntax_graph:
                st.pyplot(syntax_graph)
                plt.close(syntax_graph)
        
        # 3. Visualización de cohesión
        with st.expander("Análisis de Cohesión", expanded=True):
            cohesion_graph = create_cohesion_heatmap(doc)
            if cohesion_graph:
                st.pyplot(cohesion_graph)
                plt.close(cohesion_graph)

    except Exception as e:
        logger.error(f"Error en visualización: {str(e)}")
        st.error("Error al generar las visualizaciones")


####################################
def display_recommendations(metrics, t):
    """
    Muestra recomendaciones basadas en las métricas del texto.
    """
    # 1. Resumen Visual con Explicación
    st.markdown("### 📊 Resumen de tu Análisis")
    
    # Explicación del sistema de medición
    st.markdown("""
        **¿Cómo interpretar los resultados?**
        
        Cada métrica se mide en una escala de 0.0 a 1.0, donde:
        - 0.0 - 0.4: Necesita atención prioritaria
        - 0.4 - 0.6: En desarrollo
        - 0.6 - 0.8: Buen nivel
        - 0.8 - 1.0: Nivel avanzado
    """)

    # Métricas con explicaciones detalladas
    col1, col2, col3, col4 = st.columns(4)
    
    with col1:
        st.metric(
            "Vocabulario",
            f"{metrics['vocabulary']['normalized_score']:.2f}",
            help="Mide la variedad y riqueza de tu vocabulario. Un valor alto indica un uso diverso de palabras sin repeticiones excesivas."
        )
        with st.expander("ℹ️ Detalles"):
            st.write("""
                **Vocabulario**
                - Evalúa la diversidad léxica
                - Considera palabras únicas vs. totales
                - Detecta repeticiones innecesarias
                - Valor óptimo: > 0.7
            """)
    
    with col2:
        st.metric(
            "Estructura",
            f"{metrics['structure']['normalized_score']:.2f}",
            help="Evalúa la complejidad y variedad de las estructuras sintácticas en tus oraciones."
        )
        with st.expander("ℹ️ Detalles"):
            st.write("""
                **Estructura**
                - Analiza la complejidad sintáctica
                - Mide variación en construcciones
                - Evalúa longitud de oraciones
                - Valor óptimo: > 0.6
            """)
    
    with col3:
        st.metric(
            "Cohesión",
            f"{metrics['cohesion']['normalized_score']:.2f}",
            help="Indica qué tan bien conectadas están tus ideas y párrafos entre sí."
        )
        with st.expander("ℹ️ Detalles"):
            st.write("""
                **Cohesión**
                - Mide conexiones entre ideas
                - Evalúa uso de conectores
                - Analiza progresión temática
                - Valor óptimo: > 0.65
            """)
    
    with col4:
        st.metric(
            "Claridad",
            f"{metrics['clarity']['normalized_score']:.2f}",
            help="Evalúa la facilidad de comprensión general de tu texto."
        )
        with st.expander("ℹ️ Detalles"):
            st.write("""
                **Claridad**
                - Evalúa comprensibilidad
                - Considera estructura lógica
                - Mide precisión expresiva
                - Valor óptimo: > 0.7
            """)

    st.markdown("---")

    # 2. Recomendaciones basadas en puntuaciones
    st.markdown("### 💡 Recomendaciones Personalizadas")
    
    # Recomendaciones morfosintácticas
    if metrics['structure']['normalized_score'] < 0.6:
        st.warning("""
        #### 📝 Análisis Morfosintáctico Recomendado
        
        **Tu nivel actual sugiere que sería beneficioso:**
        1. Realizar el análisis morfosintáctico de 3 párrafos diferentes
        2. Practicar la combinación de oraciones simples en compuestas
        3. Identificar y clasificar tipos de oraciones en textos académicos
        4. Ejercitar la variación sintáctica
        
        *Hacer clic en "Comenzar ejercicios" para acceder al módulo morfosintáctico*
        """)
        
    # Recomendaciones semánticas
    if metrics['vocabulary']['normalized_score'] < 0.7:
        st.warning("""
        #### 📚 Análisis Semántico Recomendado
        
        **Para mejorar tu vocabulario y expresión:**
        A. Realiza el análisis semántico de un texto académico
        B. Identifica y agrupa campos semánticos relacionados
        C. Practica la sustitución léxica en tus párrafos
        D. Construye redes de conceptos sobre tu tema
        E. Analiza las relaciones entre ideas principales
        
        *Hacer clic en "Comenzar ejercicios" para acceder al módulo semántico*
        """)
    
    # Recomendaciones de cohesión
    if metrics['cohesion']['normalized_score'] < 0.65:
        st.warning("""
        #### 🔄 Análisis del Discurso Recomendado
        
        **Para mejorar la conexión entre ideas:**
        1. Realizar el análisis del discurso de un texto modelo
        2. Practicar el uso de diferentes conectores textuales
        3. Identificar cadenas de referencia en textos académicos
        4. Ejercitar la progresión temática en tus escritos
        
        *Hacer clic en "Comenzar ejercicios" para acceder al módulo de análisis del discurso*
        """)
    
    # Botón de acción
    st.markdown("---")
    col1, col2, col3 = st.columns([1,2,1])
    with col2:
        st.button(
            "🎯 Comenzar ejercicios recomendados",
            type="primary",
            use_container_width=True,
            key="start_exercises"
        )