AIdeaText commited on
Commit
92ac740
verified
2 Parent(s): bc7a943 e5d18d8

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

Browse files
modules/morphosyntax/morphosyntax_interface.py CHANGED
@@ -45,264 +45,209 @@ import re
45
 
46
  def display_morphosyntax_interface(lang_code, nlp_models, morpho_t):
47
  try:
48
- # CSS mejorado para estabilidad y layout vertical
49
  st.markdown("""
50
  <style>
51
  .stTextArea textarea {
52
  font-size: 1rem;
53
  line-height: 1.5;
54
- padding: 0.5rem;
55
- border-radius: 0.375rem;
56
- border: 1px solid #e2e8f0;
57
- background-color: white;
58
  min-height: 100px !important;
59
  height: 100px !important;
60
  }
61
- .block-container {
62
- padding-top: 0.5rem !important;
63
- padding-bottom: 0.5rem !important;
64
- margin: 0 !important;
65
- }
66
- .main-content {
67
- display: flex;
68
- flex-direction: column;
69
- gap: 1rem;
70
- padding: 0.5rem;
71
- }
72
  .arc-diagram-container {
73
  width: 100%;
74
- overflow-x: auto;
75
- background-color: white;
76
  padding: 0.5rem;
77
- border-radius: 0.375rem;
78
- box-shadow: 0 1px 2px rgba(0,0,0,0.1);
79
- margin-top: 0.5rem;
80
  }
81
  </style>
82
  """, unsafe_allow_html=True)
83
 
84
- # Inicializaci贸n m谩s robusta del estado
85
- if 'morphosyntax_state' not in st.session_state:
86
- st.session_state.morphosyntax_state = {
87
- 'original_text': '',
88
- 'current_text': '',
89
- 'original_analysis': None,
90
- 'analysis_count': 0,
91
- 'iterations': [] # Inicializaci贸n expl铆cita de iterations como lista vac铆a
92
- }
93
- else:
94
- # Asegurar que todas las claves existan
95
- required_keys = {
96
- 'original_text': '',
97
- 'current_text': '',
98
- 'original_analysis': None,
99
- 'analysis_count': 0,
100
- 'iterations': []
101
- }
102
- for key, default_value in required_keys.items():
103
- if key not in st.session_state.morphosyntax_state:
104
- st.session_state.morphosyntax_state[key] = default_value
105
-
106
- with st.container():
107
- # Secci贸n de texto original
108
- st.markdown("### Texto Original")
109
-
110
- # Input para texto original
111
- original_text = st.text_area(
112
- "Ingrese una oraci贸n",
113
- value=st.session_state.morphosyntax_state['original_text'],
114
- key="original_text_input",
115
- placeholder="Ingresar solo una oraci贸n hasta el punto y aparte. Si es punto seguido, dejar as铆.",
116
- height=100,
117
- disabled=False
118
- )
119
-
120
- # Bot贸n para analizar texto original
121
- col1, col2, col3 = st.columns([2,1,2])
122
- with col1:
123
- analyze_original = st.button(
124
- "Analizar Texto Original",
125
- type="primary",
126
- use_container_width=True,
127
- disabled=not bool(original_text.strip())
128
  )
129
 
 
 
 
 
 
 
 
 
 
 
 
 
130
  # Procesar texto original
131
- if analyze_original and original_text.strip():
132
  try:
133
- with st.spinner("Procesando texto original..."):
134
- doc = nlp_models[lang_code](original_text)
135
- analysis = perform_advanced_morphosyntactic_analysis(
136
- original_text,
137
- nlp_models[lang_code]
138
- )
139
-
140
- # Actualizar estado de forma segura
141
- st.session_state.morphosyntax_state.update({
142
- 'original_text': original_text,
143
- 'current_text': original_text,
144
- 'original_analysis': {
145
- 'doc': doc,
146
- 'advanced_analysis': analysis
147
- },
148
- 'iterations': [] # Reiniciar iteraciones al cambiar texto original
149
- })
150
-
151
- # Guardar en base de datos
152
- if store_student_morphosyntax_result(
153
- username=st.session_state.username,
154
- text=original_text,
155
- arc_diagrams=analysis['arc_diagrams']
156
- ):
157
- st.success("Texto original analizado exitosamente")
158
- else:
159
- st.error("Error al guardar el an谩lisis original")
160
- except Exception as e:
161
- logger.error(f"Error procesando texto original: {str(e)}")
162
- st.error("Error al procesar el texto original")
163
-
164
- # Mostrar diagrama original
165
- if st.session_state.morphosyntax_state['original_analysis']:
166
- display_morphosyntax_results(
167
- st.session_state.morphosyntax_state['original_analysis'],
168
- lang_code,
169
- morpho_t
170
- )
171
-
172
- # Secci贸n de iteraci贸n
173
- st.markdown("---")
174
- st.markdown("### Iteraci贸n Actual")
175
-
176
- # Campo para nueva versi贸n
177
- iteration_text = st.text_area(
178
- "Modifique la oraci贸n",
179
- value=st.session_state.morphosyntax_state['current_text'],
180
- key=f"iteration_input_{st.session_state.morphosyntax_state['analysis_count']}",
181
- placeholder="Ingresar solo una oraci贸n hasta el punto y aparte. Si es punto seguido, dejar as铆.",
182
- height=100
183
- )
184
-
185
- # Bot贸n para analizar iteraci贸n
186
- col1, col2, col3 = st.columns([2,1,2])
187
- with col1:
188
- analyze_iteration = st.button(
189
- "Analizar Cambios",
190
- type="primary",
191
- icon="馃攳",
192
- key=f"analyze_{st.session_state.morphosyntax_state['analysis_count']}",
193
- disabled=not bool(iteration_text.strip()),
194
- use_container_width=True
195
- )
196
 
197
- # Procesar iteraci贸n
198
- if analyze_iteration and iteration_text.strip():
199
- try:
200
- with st.spinner("Procesando cambios..."):
201
- doc = nlp_models[lang_code](iteration_text)
202
- analysis = perform_advanced_morphosyntactic_analysis(
203
- iteration_text,
204
- nlp_models[lang_code]
205
- )
206
-
207
- current_analysis = {
208
- 'doc': doc,
209
- 'advanced_analysis': analysis
210
- }
211
-
212
- # Crear nueva iteraci贸n
213
- new_iteration = {
214
- 'text': iteration_text,
215
- 'analysis': current_analysis,
216
- 'timestamp': pd.Timestamp.now()
217
- }
218
-
219
- # Actualizar estado de forma segura
220
- iterations = st.session_state.morphosyntax_state.get('iterations', [])
221
- iterations.append(new_iteration)
222
- st.session_state.morphosyntax_state.update({
223
- 'current_text': iteration_text,
224
- 'analysis_count': st.session_state.morphosyntax_state['analysis_count'] + 1,
225
- 'iterations': iterations
226
- })
227
-
228
- if store_student_morphosyntax_result(
229
- username=st.session_state.username,
230
- text=iteration_text,
231
- arc_diagrams=analysis['arc_diagrams']
232
- ):
233
- # Mostrar resultados de la iteraci贸n
234
  display_morphosyntax_results(
235
- current_analysis,
236
  lang_code,
237
  morpho_t
238
  )
239
- else:
240
- st.error("Error al guardar la iteraci贸n")
241
  except Exception as e:
242
- logger.error(f"Error procesando iteraci贸n: {str(e)}")
243
- st.error("Error al procesar los cambios")
244
-
245
- # Mostrar historial de iteraciones
246
- if st.session_state.morphosyntax_state.get('iterations', []):
247
- with st.expander("Historial de Iteraciones", expanded=False):
248
- for idx, iteration in enumerate(reversed(st.session_state.morphosyntax_state['iterations'])):
249
- st.markdown(f"**Iteraci贸n {idx + 1} ({iteration['timestamp'].strftime('%H:%M:%S')})**")
250
- st.text_area(
251
- f"Texto {idx + 1}",
252
- value=iteration['text'],
253
- disabled=True,
254
- height=100,
255
- key=f"hist_text_{idx}"
256
- )
257
- display_morphosyntax_results(
258
- iteration['analysis'],
259
- lang_code,
260
- morpho_t
 
 
 
 
 
261
  )
262
- st.markdown("---")
263
-
264
- except Exception as e:
265
- logger.error(f"Error general en display_morphosyntax_interface: {str(e)}")
266
- st.error("Se produjo un error. Por favor, intente de nuevo.")
267
 
 
 
 
 
 
 
 
268
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
269
 
 
 
 
270
 
 
271
 
272
- #########################################################################3
273
  def display_morphosyntax_results(result, lang_code, morpho_t):
274
  """
275
- Muestra solo el an谩lisis sint谩ctico con diagramas de arco.
 
 
 
 
276
  """
277
  if result is None:
278
- st.warning(morpho_t.get('no_results', 'No results available'))
279
  return
280
-
281
- doc = result['doc']
282
-
283
- # An谩lisis sint谩ctico (diagramas de arco)
284
- st.markdown(f"### {morpho_t.get('arc_diagram', 'Syntactic analysis: Arc diagram')}")
285
-
286
- with st.container():
287
  sentences = list(doc.sents)
288
  for i, sent in enumerate(sentences):
289
- with st.container():
290
  st.subheader(f"{morpho_t.get('sentence', 'Sentence')} {i+1}")
291
- try:
292
- html = displacy.render(sent, style="dep", options={
293
- "distance": 100,
294
- "arrow_spacing": 20,
295
- "word_spacing": 30
296
- })
297
- # Ajustar dimensiones del SVG
298
- html = html.replace('height="375"', 'height="200"')
299
- html = re.sub(r'<svg[^>]*>', lambda m: m.group(0).replace('height="450"', 'height="300"'), html)
300
- html = re.sub(r'<g [^>]*transform="translate\((\d+),(\d+)\)"',
301
- lambda m: f'<g transform="translate({m.group(1)},50)"', html)
302
-
303
- # Envolver en un div con clase para estilos
304
- html = f'<div class="arc-diagram-container">{html}</div>'
305
- st.write(html, unsafe_allow_html=True)
306
- except Exception as e:
307
- logger.error(f"Error rendering sentence {i}: {str(e)}")
308
- st.error(f"Error displaying diagram for sentence {i+1}")
 
45
 
46
  def display_morphosyntax_interface(lang_code, nlp_models, morpho_t):
47
  try:
48
+ # CSS para layout estable
49
  st.markdown("""
50
  <style>
51
  .stTextArea textarea {
52
  font-size: 1rem;
53
  line-height: 1.5;
 
 
 
 
54
  min-height: 100px !important;
55
  height: 100px !important;
56
  }
 
 
 
 
 
 
 
 
 
 
 
57
  .arc-diagram-container {
58
  width: 100%;
 
 
59
  padding: 0.5rem;
60
+ margin: 0.5rem 0;
 
 
61
  }
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([
71
+ "An谩lisis de Diagramas de Arco",
72
+ "An谩lisis de Categor铆as",
73
+ "An谩lisis Morfol贸gico"
74
+ ])
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
+ "",
94
+ value=st.session_state.arc_analysis_state['original_text'],
95
+ key=text_key,
96
+ height=100
 
 
 
 
 
 
 
 
 
 
 
 
97
  )
98
 
99
+ col1, col2, col3 = st.columns([2,1,2])
100
+ with col1:
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:
114
+ doc = nlp_models[lang_code](text_input)
115
+ analysis = perform_advanced_morphosyntactic_analysis(
116
+ text_input,
117
+ nlp_models[lang_code]
118
+ )
119
+
120
+ st.session_state.arc_analysis_state.update({
121
+ 'original_text': text_input,
122
+ 'original_analysis': {'doc': doc, 'analysis': analysis},
123
+ 'iteration_text': text_input,
124
+ 'analysis_count': st.session_state.arc_analysis_state['analysis_count'] + 1
125
+ })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
126
 
127
+ if store_student_morphosyntax_result(
128
+ username=st.session_state.username,
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
+
211
+ with subtabs[2]:
212
+ st.info("An谩lisis Morfol贸gico en desarrollo...")
213
 
214
+ except Exception as e:
215
+ st.error("Error general en la interfaz")
216
+ logger.error(f"Error: {str(e)}")
217
 
218
+ ############################################################################
219
 
 
220
  def display_morphosyntax_results(result, lang_code, morpho_t):
221
  """
222
+ Muestra solo el diagrama de arco.
223
+ Args:
224
+ result: Diccionario con el documento procesado y su an谩lisis
225
+ lang_code: C贸digo del idioma
226
+ morpho_t: Diccionario de traducciones
227
  """
228
  if result is None:
 
229
  return
230
+
231
+ try:
232
+ doc = result['doc']
 
 
 
 
233
  sentences = list(doc.sents)
234
  for i, sent in enumerate(sentences):
235
+ try:
236
  st.subheader(f"{morpho_t.get('sentence', 'Sentence')} {i+1}")
237
+ html = displacy.render(sent, style="dep", options={
238
+ "distance": 100,
239
+ "arrow_spacing": 20,
240
+ "word_spacing": 30
241
+ })
242
+ html = html.replace('height="375"', 'height="200"')
243
+ html = re.sub(r'<svg[^>]*>', lambda m: m.group(0).replace('height="450"', 'height="300"'), html)
244
+ html = re.sub(r'<g [^>]*transform="translate\((\d+),(\d+)\)"',
245
+ lambda m: f'<g transform="translate({m.group(1)},50)"', html)
246
+ html = f'<div class="arc-diagram-container">{html}</div>'
247
+ st.write(html, unsafe_allow_html=True)
248
+ except Exception as e:
249
+ logger.error(f"Error en diagrama {i}: {str(e)}")
250
+ continue
251
+ except Exception as e:
252
+ logger.error(f"Error en display_morphosyntax_results: {str(e)}")
253
+