AIdeaText commited on
Commit
427dbb7
·
verified ·
2 Parent(s): 92ac740 7f28e14

Merge branch #AIdeaText/v3' into 'AIdeaText/v4'

Browse files
modules/__init__.py CHANGED
@@ -192,6 +192,12 @@ def load_student_activities_v2_functions():
192
 
193
  def load_morphosyntax_functions():
194
  from .morphosyntax.morphosyntax_interface import (
 
 
 
 
 
 
195
  display_morphosyntax_interface,
196
  display_morphosyntax_results
197
  )
@@ -202,6 +208,12 @@ def load_morphosyntax_functions():
202
  )
203
 
204
  return {
 
 
 
 
 
 
205
  'display_morphosyntax_interface': display_morphosyntax_interface,
206
  'display_morphosyntax_results': display_morphosyntax_results,
207
  'process_morphosyntactic_input': process_morphosyntactic_input,
 
192
 
193
  def load_morphosyntax_functions():
194
  from .morphosyntax.morphosyntax_interface import (
195
+ cache_analysis_results,
196
+ get_cached_analysis,
197
+ arc_analysis_state,
198
+ reset_morpho_state,
199
+ display_original_analysis,
200
+ display_iteration_analysis,
201
  display_morphosyntax_interface,
202
  display_morphosyntax_results
203
  )
 
208
  )
209
 
210
  return {
211
+ 'cache_analysis_results': cache_analysis_results,
212
+ 'get_cached_analysis': get_cached_analysis,
213
+ 'arc_analysis_state': arc_analysis_state,
214
+ 'reset_morpho_state': reset_morpho_state,
215
+ 'display_original_analysis': display_original_analysis,
216
+ 'display_iteration_analysis': display_iteration_analysis,
217
  'display_morphosyntax_interface': display_morphosyntax_interface,
218
  'display_morphosyntax_results': display_morphosyntax_results,
219
  'process_morphosyntactic_input': process_morphosyntactic_input,
modules/morphosyntax/morphosyntax_interface.py CHANGED
@@ -1,5 +1,6 @@
1
  #modules/morphosyntax/morphosyntax_interface.py
2
 
 
3
  import streamlit as st
4
  from streamlit_float import *
5
  from streamlit_antd_components import *
@@ -11,6 +12,7 @@ import pandas as pd
11
  import base64
12
  import re
13
 
 
14
  from .morphosyntax_process import (
15
  process_morphosyntactic_input,
16
  format_analysis_results,
@@ -29,20 +31,68 @@ import logging
29
  logger = logging.getLogger(__name__)
30
 
31
  ###########################################################################
 
 
 
 
 
 
 
 
 
 
 
 
32
 
33
- import streamlit as st
34
- from streamlit_float import *
35
- from streamlit_antd_components import *
36
- from streamlit.components.v1 import html
37
- import spacy
38
- from spacy import displacy
39
- import spacy_streamlit
40
- import pandas as pd
41
- import base64
42
- import re
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
 
44
  ############################################################################
45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  def display_morphosyntax_interface(lang_code, nlp_models, morpho_t):
47
  try:
48
  # CSS para layout estable
@@ -62,9 +112,10 @@ def display_morphosyntax_interface(lang_code, nlp_models, morpho_t):
62
  </style>
63
  """, unsafe_allow_html=True)
64
 
65
- # Estado para subtabs
66
- if 'morpho_subtab' not in st.session_state:
67
- st.session_state.morpho_subtab = 0
 
68
 
69
  # Crear subtabs
70
  subtabs = st.tabs([
@@ -75,19 +126,21 @@ def display_morphosyntax_interface(lang_code, nlp_models, morpho_t):
75
 
76
  # Tab de Diagramas de Arco
77
  with subtabs[0]:
78
- # Estado para análisis
79
- if 'arc_analysis_state' not in st.session_state:
80
- st.session_state.arc_analysis_state = {
81
- 'original_text': '',
82
- 'original_analysis': None,
83
- 'iteration_text': '',
84
- 'iteration_analysis': None,
85
- 'analysis_count': 0
86
- }
87
-
88
- # Contenedor para texto original
89
- original_container = st.container()
90
- with original_container:
 
 
91
  text_key = f"original_text_{st.session_state.arc_analysis_state['analysis_count']}"
92
  text_input = st.text_area(
93
  "",
@@ -101,13 +154,10 @@ def display_morphosyntax_interface(lang_code, nlp_models, morpho_t):
101
  analyze_button = st.button(
102
  "Analizar Texto Original",
103
  type="primary",
104
- use_container_width=True,
105
- key=f"analyze_original_{st.session_state.arc_analysis_state['analysis_count']}"
106
  )
107
 
108
- # Contenedor para diagramas
109
- diagrams_container = st.container()
110
-
111
  # Procesar texto original
112
  if analyze_button and text_input.strip():
113
  try:
@@ -129,82 +179,98 @@ def display_morphosyntax_interface(lang_code, nlp_models, morpho_t):
129
  text=text_input,
130
  arc_diagrams=analysis['arc_diagrams']
131
  ):
132
- with diagrams_container:
133
- st.subheader("Análisis Original")
134
- display_morphosyntax_results(
135
- st.session_state.arc_analysis_state['original_analysis'],
136
- lang_code,
137
- morpho_t
138
- )
139
  except Exception as e:
140
  st.error("Error al procesar texto original")
141
- logger.error(f"Error: {str(e)}")
142
 
143
- # Contenedor para iteración
144
  if st.session_state.arc_analysis_state.get('original_analysis'):
145
- iteration_container = st.container()
146
- with iteration_container:
147
  st.markdown("---")
148
- iteration_key = f"iteration_{st.session_state.arc_analysis_state['analysis_count']}"
149
- iteration_text = st.text_area(
150
- "",
151
- value=st.session_state.arc_analysis_state['iteration_text'],
152
- key=iteration_key,
153
- height=100,
154
- on_change=lambda: None # Prevenir recarga en cambio de foco
155
- )
156
-
157
- col1, col2, col3 = st.columns([2,1,2])
158
- with col1:
159
- iterate_button = st.button(
160
  "Analizar Cambios",
161
- type="primary",
162
- use_container_width=True,
163
- key=f"iterate_{st.session_state.arc_analysis_state['analysis_count']}"
164
  )
165
-
166
- if iterate_button and iteration_text.strip():
167
- try:
168
- doc_iter = nlp_models[lang_code](iteration_text)
169
- analysis_iter = perform_advanced_morphosyntactic_analysis(
170
- iteration_text,
171
- nlp_models[lang_code]
172
- )
173
-
174
- st.session_state.arc_analysis_state.update({
175
- 'iteration_text': iteration_text,
176
- 'iteration_analysis': {'doc': doc_iter, 'analysis': analysis_iter}
177
- })
178
-
179
- if store_student_morphosyntax_result(
180
- username=st.session_state.username,
181
- text=iteration_text,
182
- arc_diagrams=analysis_iter['arc_diagrams']
183
- ):
184
- with diagrams_container:
185
- # Mostrar original
186
- st.subheader("Análisis Original")
187
- display_morphosyntax_results(
188
- st.session_state.arc_analysis_state['original_analysis'],
189
- lang_code,
190
- morpho_t
191
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
192
 
193
- st.markdown("---")
 
 
 
 
 
 
 
194
 
195
- # Mostrar iteración
196
- st.subheader("Análisis de Cambios")
197
- display_morphosyntax_results(
198
- {'doc': doc_iter, 'analysis': analysis_iter},
199
- lang_code,
200
- morpho_t
201
- )
202
 
203
- except Exception as e:
204
- st.error("Error al procesar iteración")
205
- logger.error(f"Error: {str(e)}")
206
 
207
- # Otros subtabs aquí...
208
  with subtabs[1]:
209
  st.info("Análisis de Categorías en desarrollo...")
210
 
@@ -213,7 +279,7 @@ def display_morphosyntax_interface(lang_code, nlp_models, morpho_t):
213
 
214
  except Exception as e:
215
  st.error("Error general en la interfaz")
216
- logger.error(f"Error: {str(e)}")
217
 
218
  ############################################################################
219
 
 
1
  #modules/morphosyntax/morphosyntax_interface.py
2
 
3
+ #Importaciones generales
4
  import streamlit as st
5
  from streamlit_float import *
6
  from streamlit_antd_components import *
 
12
  import base64
13
  import re
14
 
15
+ #Importaciones locales
16
  from .morphosyntax_process import (
17
  process_morphosyntactic_input,
18
  format_analysis_results,
 
31
  logger = logging.getLogger(__name__)
32
 
33
  ###########################################################################
34
+ def initialize_arc_analysis_state():
35
+ """Inicializa el estado del análisis de arcos y el caché si no existen"""
36
+ # Inicializar estado de análisis
37
+ if 'arc_analysis_state' not in st.session_state:
38
+ st.session_state.arc_analysis_state = {
39
+ 'original_text': '',
40
+ 'original_analysis': None,
41
+ 'iteration_text': '',
42
+ 'iteration_analysis': None,
43
+ 'analysis_count': 0
44
+ }
45
+ logger.info("Estado de análisis de arcos inicializado")
46
 
47
+ # Inicializar caché de análisis
48
+ if 'analysis_cache' not in st.session_state:
49
+ st.session_state.analysis_cache = {}
50
+ logger.info("Caché de análisis inicializado")
51
+
52
+ ###########################################################################
53
+
54
+ def reset_morpho_state():
55
+ """Resetea el estado del análisis morfosintáctico"""
56
+ if 'arc_analysis_state' in st.session_state:
57
+ st.session_state.arc_analysis_state = {
58
+ 'original_text': '',
59
+ 'original_analysis': None,
60
+ 'iteration_text': '',
61
+ 'iteration_analysis': None,
62
+ 'analysis_count': 0
63
+ }
64
+ ############################################################################
65
+
66
+ def display_original_analysis(container, analysis, lang_code, morpho_t):
67
+ """Muestra el análisis original en el contenedor especificado"""
68
+ with container:
69
+ st.subheader("Análisis Original")
70
+ display_morphosyntax_results(analysis, lang_code, morpho_t)
71
+
72
+ def display_iteration_analysis(container, analysis, lang_code, morpho_t):
73
+ """Muestra el análisis de cambios en el contenedor especificado"""
74
+ with container:
75
+ st.subheader("Análisis de Cambios")
76
+ display_morphosyntax_results(analysis, lang_code, morpho_t)
77
 
78
  ############################################################################
79
 
80
+ def cache_analysis_results(key, result):
81
+ """Almacena resultados de análisis en caché"""
82
+ if not hasattr(st.session_state, 'analysis_cache'):
83
+ initialize_arc_analysis_state()
84
+ st.session_state.analysis_cache[key] = result
85
+ logger.info(f"Resultado almacenado en caché con clave: {key}")
86
+
87
+ def get_cached_analysis(key):
88
+ """Recupera resultados de análisis del caché"""
89
+ if not hasattr(st.session_state, 'analysis_cache'):
90
+ initialize_arc_analysis_state()
91
+ return None
92
+ return st.session_state.analysis_cache.get(key)
93
+
94
+
95
+ ############################################################################
96
  def display_morphosyntax_interface(lang_code, nlp_models, morpho_t):
97
  try:
98
  # CSS para layout estable
 
112
  </style>
113
  """, unsafe_allow_html=True)
114
 
115
+ # Inicializar estado y mantener tab activo
116
+ st.session_state.tab_states['morpho_active'] = True
117
+ st.session_state.selected_tab = 1
118
+ initialize_arc_analysis_state()
119
 
120
  # Crear subtabs
121
  subtabs = st.tabs([
 
126
 
127
  # Tab de Diagramas de Arco
128
  with subtabs[0]:
129
+ # Botón de reset
130
+ col1, col2, col3 = st.columns([2,1,2])
131
+ with col1:
132
+ if st.button("Nuevo Análisis", type="secondary", use_container_width=True):
133
+ reset_morpho_state()
134
+ st.rerun()
135
+
136
+ # Contenedores separados para cada tipo de análisis
137
+ original_input_container = st.container()
138
+ original_diagram_container = st.container()
139
+ iteration_input_container = st.container()
140
+ iteration_diagram_container = st.container()
141
+
142
+ # Sección de análisis original
143
+ with original_input_container:
144
  text_key = f"original_text_{st.session_state.arc_analysis_state['analysis_count']}"
145
  text_input = st.text_area(
146
  "",
 
154
  analyze_button = st.button(
155
  "Analizar Texto Original",
156
  type="primary",
157
+ key=f"analyze_original_{st.session_state.arc_analysis_state['analysis_count']}",
158
+ use_container_width=True
159
  )
160
 
 
 
 
161
  # Procesar texto original
162
  if analyze_button and text_input.strip():
163
  try:
 
179
  text=text_input,
180
  arc_diagrams=analysis['arc_diagrams']
181
  ):
182
+ display_original_analysis(
183
+ original_diagram_container,
184
+ st.session_state.arc_analysis_state['original_analysis'],
185
+ lang_code,
186
+ morpho_t
187
+ )
188
+
189
  except Exception as e:
190
  st.error("Error al procesar texto original")
191
+ logger.error(f"Error al procesar texto original: {str(e)}")
192
 
193
+ # Sección de iteración
194
  if st.session_state.arc_analysis_state.get('original_analysis'):
195
+ with iteration_input_container:
 
196
  st.markdown("---")
197
+
198
+ # Formulario de iteración
199
+ with st.form(key="iteration_form"):
200
+ iteration_text = st.text_area(
201
+ "",
202
+ value=st.session_state.arc_analysis_state.get('iteration_text', ''),
203
+ key=f"iteration_{st.session_state.arc_analysis_state['analysis_count']}",
204
+ height=100
205
+ )
206
+
207
+ # Botón de análisis dentro del formulario
208
+ submitted = st.form_submit_button(
209
  "Analizar Cambios",
210
+ type="primary",
211
+ use_container_width=True
 
212
  )
213
+
214
+ # Cuando se envía el formulario
215
+ if submitted and iteration_text.strip():
216
+ try:
217
+ # Verificar si ya existe en caché
218
+ cache_key = f"iter_{iteration_text}"
219
+ cached_result = get_cached_analysis(cache_key)
220
+
221
+ if cached_result:
222
+ logger.info("Usando resultado cacheado")
223
+ doc_iter = cached_result['doc']
224
+ analysis_iter = cached_result['analysis']
225
+ else:
226
+ logger.info("Generando nuevo análisis")
227
+ doc_iter = nlp_models[lang_code](iteration_text)
228
+ analysis_iter = perform_advanced_morphosyntactic_analysis(
229
+ iteration_text,
230
+ nlp_models[lang_code]
 
 
 
 
 
 
 
 
231
  )
232
+ # Guardar en caché
233
+ cache_analysis_results(cache_key, {
234
+ 'doc': doc_iter,
235
+ 'analysis': analysis_iter
236
+ })
237
+
238
+ # Actualizar estado
239
+ st.session_state.arc_analysis_state.update({
240
+ 'iteration_text': iteration_text,
241
+ 'iteration_analysis': {'doc': doc_iter, 'analysis': analysis_iter}
242
+ })
243
+
244
+ if store_student_morphosyntax_result(
245
+ username=st.session_state.username,
246
+ text=iteration_text,
247
+ arc_diagrams=analysis_iter['arc_diagrams']
248
+ ):
249
+ # Mostrar análisis en columnas
250
+ col1, col2 = st.columns(2)
251
 
252
+ # Mostrar ambos análisis
253
+ with col1:
254
+ display_original_analysis(
255
+ original_diagram_container,
256
+ st.session_state.arc_analysis_state['original_analysis'],
257
+ lang_code,
258
+ morpho_t
259
+ )
260
 
261
+ with col2:
262
+ display_iteration_analysis(
263
+ iteration_diagram_container,
264
+ {'doc': doc_iter, 'analysis': analysis_iter},
265
+ lang_code,
266
+ morpho_t
267
+ )
268
 
269
+ except Exception as e:
270
+ st.error("Error al procesar iteración")
271
+ logger.error(f"Error al procesar iteración: {str(e)}")
272
 
273
+ # Otros subtabs...
274
  with subtabs[1]:
275
  st.info("Análisis de Categorías en desarrollo...")
276
 
 
279
 
280
  except Exception as e:
281
  st.error("Error general en la interfaz")
282
+ logger.error(f"Error general en la interfaz: {str(e)}")
283
 
284
  ############################################################################
285