File size: 5,691 Bytes
9616a51
55c034b
831e193
 
ee7b3c9
 
831e193
ee7b3c9
 
a5fb792
97bc8ca
 
 
 
831e193
 
 
915e40c
a5fb792
ee7b3c9
915e40c
ee7b3c9
 
 
 
915e40c
a5fb792
bcc273d
a5fb792
ee7b3c9
 
 
 
 
 
 
 
 
9e07ef2
 
ee7b3c9
 
a5fb792
ee7b3c9
a5fb792
ee7b3c9
 
 
9616a51
 
ee7b3c9
9616a51
ee7b3c9
a5fb792
9616a51
ee7b3c9
9616a51
ee7b3c9
9e07ef2
 
 
 
ee7b3c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0172e7f
ee7b3c9
 
 
 
 
 
 
 
a5fb792
ee7b3c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9616a51
ee7b3c9
 
 
 
 
 
 
 
 
9616a51
ee7b3c9
 
 
 
 
 
 
 
 
 
a5fb792
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
# modules/morphosyntax/morphosyntax_interface.py

import streamlit as st
import re
import logging
from spacy import displacy

# Importa tu pipeline de spacy, p. ej.:
# nlp_models = {"es": spacy.load("es_core_news_sm")}

from ..database.morphosyntax_iterative_mongo_db import (
    store_student_morphosyntax_base,
    store_student_morphosyntax_iteration,
)

logger = logging.getLogger(__name__)

def initialize_arc_analysis_state():
    """Inicializa el estado del an谩lisis de arcos y el cach茅 si no existen."""
    if "arc_analysis_state" not in st.session_state:
        st.session_state.arc_analysis_state = {
            "base_id": None,
            "original_text": "",
            "iteration_text": "",
            "analysis_count": 0,
        }

def reset_morpho_state():
    """Resetea el estado del an谩lisis morfosint谩ctico en sesi贸n."""
    st.session_state.arc_analysis_state = {
        "base_id": None,
        "original_text": "",
        "iteration_text": "",
        "analysis_count": 0,
    }

def display_arc_diagram(doc):
    """Muestra un diagrama de arco."""
    try:
        for sent in doc.sents:
            rendered = displacy.render(
                sent, 
                style="dep",
                options={"distance": 100, "arrow_spacing": 20, "word_spacing": 30}
            )
            # Ajustes del SVG
            rendered = rendered.replace('height="375"', 'height="200"')
            rendered = re.sub(
                r'<svg[^>]*>',
                lambda m: m.group(0).replace('height="450"', 'height="300"'),
                rendered
            )
            rendered = re.sub(
                r'<g [^>]*transform="translate\((\d+),(\d+)\)"',
                lambda m: f'<g transform="translate({m.group(1)},50)"',
                rendered
            )
            st.write(f'<div class="arc-diagram-container">{rendered}</div>', unsafe_allow_html=True)

    except Exception as e:
        logger.error(f"Error en display_arc_diagram: {str(e)}")

def display_morphosyntax_interface(lang_code, nlp_models):
    st.title("An谩lisis Morfosint谩ctico")
    
    # 1) Inicializar estados
    initialize_arc_analysis_state()
    
    # 2) Tabs
    tabs = st.tabs(["Arco", "Categor铆as", "Morfol贸gico"])
    
    # ==================== TAB 0: An谩lisis de Arco =========================
    with tabs[0]:
        st.write("Texto base e iteraciones...")

        # Bot贸n Nuevo An谩lisis
        if st.button("Nuevo An谩lisis", key="new_analysis"):
            reset_morpho_state()
            st.experimental_rerun()
        
        # Texto base
        st.session_state.arc_analysis_state["original_text"] = st.text_area(
            "Texto Original",
            value=st.session_state.arc_analysis_state["original_text"],
            key="base_text_input"
        )
        
        # Bot贸n para analizar texto base
        if st.button("Analizar Texto Base", key="analyze_base"):
            # L贸gica de Spacy
            if not st.session_state.arc_analysis_state["original_text"].strip():
                st.warning("Ingrese texto original para analizar.")
            else:
                doc = nlp_models[lang_code](
                    st.session_state.arc_analysis_state["original_text"]
                )
                # Realizar an谩lisis (displacy, etc.)
                display_arc_diagram(doc)
                
                # Guardar en DB
                base_id = store_student_morphosyntax_base(
                    st.session_state.username,
                    st.session_state.arc_analysis_state["original_text"],
                    arc_diagrams=None  # Pon el dict real con arcos
                )
                if base_id:
                    st.session_state.arc_analysis_state["base_id"] = base_id
                    st.success(f"An谩lisis base guardado. base_id={base_id}")
        
        st.markdown("---")

        # Texto de iteraci贸n
        st.session_state.arc_analysis_state["iteration_text"] = st.text_area(
            "Texto de Iteraci贸n",
            value=st.session_state.arc_analysis_state["iteration_text"],
            key="iteration_text_input"
        )

        # Bot贸n para analizar iteraci贸n
        if st.button("Analizar Cambios", key="analyze_iteration"):
            if not st.session_state.arc_analysis_state["iteration_text"].strip():
                st.warning("Ingrese texto de iteraci贸n para analizar.")
            elif not st.session_state.arc_analysis_state["base_id"]:
                st.error("No existe un base_id a煤n (analice el texto base primero).")
            else:
                # Realizar el an谩lisis con Spacy
                doc_iter = nlp_models[lang_code](
                    st.session_state.arc_analysis_state["iteration_text"]
                )
                display_arc_diagram(doc_iter)

                # Guardar iteraci贸n en DB
                iteration_id = store_student_morphosyntax_iteration(
                    st.session_state.username,
                    st.session_state.arc_analysis_state["base_id"],
                    st.session_state.arc_analysis_state["original_text"],
                    st.session_state.arc_analysis_state["iteration_text"],
                    arc_diagrams=None  # Pon el dict real con arcos
                )
                if iteration_id:
                    st.success(f"Iteraci贸n guardada. iteration_id={iteration_id}")
    
    # ==================== TAB 1: An谩lisis de Categor铆as ====================
    with tabs[1]:
        st.info("En desarrollo...")

    # ==================== TAB 2: An谩lisis Morfol贸gico ======================
    with tabs[2]:
        st.info("En desarrollo...")