|
|
|
|
|
import streamlit as st |
|
import logging |
|
from ..utils.widget_utils import generate_unique_key |
|
|
|
from ..database.current_situation_mongo_db import store_current_situation_result |
|
|
|
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. |
|
""" |
|
try: |
|
|
|
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") |
|
|
|
|
|
with st.container(): |
|
input_col, results_col = st.columns([1,2]) |
|
|
|
with input_col: |
|
st.markdown("### Ingresa tu texto") |
|
|
|
|
|
def on_text_change(): |
|
st.session_state.text_input = st.session_state.text_area |
|
st.session_state.show_results = False |
|
|
|
|
|
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" |
|
) |
|
|
|
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...")): |
|
|
|
doc = nlp_models[lang_code](text_input) |
|
metrics = analyze_text_dimensions(doc) |
|
|
|
|
|
storage_success = store_current_situation_result( |
|
username=st.session_state.username, |
|
text=text_input, |
|
metrics=metrics, |
|
feedback=None |
|
) |
|
|
|
if not storage_success: |
|
logger.warning("No se pudo guardar el análisis en la base de datos") |
|
|
|
|
|
st.session_state.current_doc = doc |
|
st.session_state.current_metrics = metrics |
|
st.session_state.show_results = True |
|
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")) |
|
|
|
|
|
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) |
|
|
|
|
|
with st.expander("🔍 Ver análisis detallado", expanded=False): |
|
display_current_situation_visual( |
|
st.session_state.current_doc, |
|
st.session_state.current_metrics |
|
) |
|
|
|
except Exception as e: |
|
logger.error(f"Error en interfaz: {str(e)}") |
|
st.error("Ocurrió un error. Por favor, intente de nuevo.") |
|
|
|
|
|
|
|
def display_current_situation_visual(doc, metrics): |
|
""" |
|
Muestra visualizaciones detalladas del análisis. |
|
""" |
|
try: |
|
st.markdown("### 📊 Visualizaciones Detalladas") |
|
|
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
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. |
|
""" |
|
|
|
st.markdown("### 📊 Resumen de tu Análisis") |
|
|
|
|
|
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 |
|
""") |
|
|
|
|
|
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("---") |
|
|
|
|
|
st.markdown("### 💡 Recomendaciones Personalizadas") |
|
|
|
|
|
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* |
|
""") |
|
|
|
|
|
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* |
|
""") |
|
|
|
|
|
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* |
|
""") |
|
|
|
|
|
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" |
|
) |
|
|