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...")
|