AIdeaText commited on
Commit
8292acf
·
verified ·
1 Parent(s): 4d7f7d1

Update modules/discourse/discourse_interface.py

Browse files
Files changed (1) hide show
  1. modules/discourse/discourse_interface.py +176 -125
modules/discourse/discourse_interface.py CHANGED
@@ -1,125 +1,176 @@
1
- import streamlit as st
2
- import pandas as pd
3
- from streamlit_float import *
4
- from .discourse_process import process_discourse_input
5
- from ..chatbot.chatbot import initialize_chatbot
6
- from ..database.database_oldFromV2 import store_discourse_analysis_result
7
- from ..text_analysis.discourse_analysis import perform_discourse_analysis
8
- from ..utils.widget_utils import generate_unique_key
9
-
10
- def display_discourse_interface(lang_code, nlp_models, t):
11
- st.subheader(t['discourse_title'])
12
-
13
- text_input = st.text_area(
14
- t['warning_message'],
15
- height=150,
16
- key=generate_unique_key("discourse", "text_area")
17
- )
18
-
19
- if st.button(
20
- t['results_title'],
21
- key=generate_unique_key("discourse", "analyze_button")
22
- ):
23
- if text_input:
24
- # Aquí iría tu lógica de análisis morfosintáctico
25
- # Por ahora, solo mostraremos un mensaje de placeholder
26
- st.info(t['analysis_placeholder'])
27
- else:
28
- st.warning(t['no_text_warning'])
29
-
30
- '''
31
- def display_discourse_interface(lang_code, nlp_models, t):
32
- st.subheader(t['title'])
33
-
34
- # Inicializar el chatbot si no existe
35
- if 'discourse_chatbot' not in st.session_state:
36
- st.session_state.discourse_chatbot = initialize_chatbot('discourse')
37
-
38
- # Mostrar el historial del chat
39
- chat_history = st.session_state.get('discourse_chat_history', [])
40
- for message in chat_history:
41
- with st.chat_message(message["role"]):
42
- st.write(message["content"])
43
- if "visualization" in message:
44
- st.pyplot(message["visualization"])
45
-
46
- # Input del usuario
47
- user_input = st.chat_input(t['discourse_initial_message'], key=generate_unique_key('discourse', st.session_state.username))
48
-
49
- if user_input:
50
- # Procesar el input del usuario
51
- response, visualization = process_discourse_input(user_input, lang_code, nlp_models[lang_code], st.session_state.get('file_contents'), t)
52
-
53
- # Actualizar el historial del chat
54
- chat_history.append({"role": "user", "content": user_input})
55
- chat_history.append({"role": "assistant", "content": response, "visualization": visualization})
56
- st.session_state.discourse_chat_history = chat_history
57
-
58
- # Mostrar el resultado más reciente
59
- with st.chat_message("assistant"):
60
- st.write(response)
61
- if visualization:
62
- st.pyplot(visualization)
63
-
64
- # Botón para limpiar el historial del chat
65
- if st.button(t['clear_chat'], key=generate_unique_key('discourse', 'clear_chat')):
66
- st.session_state.discourse_chat_history = []
67
- st.rerun()
68
-
69
- # Sección para cargar archivos
70
- col1, col2 = st.columns(2)
71
- with col1:
72
- uploaded_file1 = st.file_uploader(t['file_uploader1'], type=['txt', 'pdf', 'docx', 'doc', 'odt'])
73
- with col2:
74
- uploaded_file2 = st.file_uploader(t['file_uploader2'], type=['txt', 'pdf', 'docx', 'doc', 'odt'])
75
-
76
- if uploaded_file1 and uploaded_file2:
77
- file_contents1 = uploaded_file1.getvalue().decode('utf-8')
78
- file_contents2 = uploaded_file2.getvalue().decode('utf-8')
79
- st.session_state.file_contents = (file_contents1, file_contents2)
80
-
81
- if st.button(t['analyze_button']):
82
- result = perform_discourse_analysis(file_contents1, file_contents2, nlp_models[lang_code], lang_code)
83
- st.session_state.discourse_result = result
84
- display_discourse_results(result, lang_code, t)
85
- store_discourse_analysis_result(st.session_state.username, file_contents1, file_contents2, result)
86
-
87
- def display_discourse_results(result, lang_code, t):
88
- if result is None:
89
- st.warning(t.get('no_results', "No hay resultados disponibles."))
90
- return
91
-
92
- col1, col2 = st.columns(2)
93
-
94
- with col1:
95
- with st.expander(t.get('file_uploader1', "Documento 1"), expanded=True):
96
- st.subheader(t.get('key_concepts', "Conceptos Clave"))
97
- if 'key_concepts1' in result:
98
- df1 = pd.DataFrame(result['key_concepts1'], columns=['Concepto', 'Frecuencia'])
99
- df1['Frecuencia'] = df1['Frecuencia'].round(2)
100
- st.table(df1)
101
-
102
- if 'graph1' in result:
103
- st.pyplot(result['graph1'])
104
-
105
- with col2:
106
- with st.expander(t.get('file_uploader2', "Documento 2"), expanded=True):
107
- st.subheader(t.get('key_concepts', "Conceptos Clave"))
108
- if 'key_concepts2' in result:
109
- df2 = pd.DataFrame(result['key_concepts2'], columns=['Concepto', 'Frecuencia'])
110
- df2['Frecuencia'] = df2['Frecuencia'].round(2)
111
- st.table(df2)
112
-
113
- if 'graph2' in result:
114
- st.pyplot(result['graph2'])
115
-
116
- # Relación de conceptos entre ambos documentos (Diagrama de Sankey)
117
- st.subheader(t.get('comparison', "Relación de conceptos entre ambos documentos"))
118
- if 'key_concepts1' in result and 'key_concepts2' in result:
119
- # Código para generar el diagrama de Sankey (como en la función original)
120
- pass
121
- else:
122
- st.warning(t.get('comparison_not_available', "La comparación no está disponible."))
123
-
124
-
125
- '''
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # modules/discourse/discourse/discourse_interface.py
2
+
3
+ import streamlit as st
4
+ import pandas as pd
5
+ import plotly.graph_objects as go
6
+ import logging
7
+ from ..utils.widget_utils import generate_unique_key
8
+ from .discourse_process import perform_discourse_analysis
9
+ from ..database.discourse_mongo_db import store_discourse_analysis_result
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+ def display_discourse_interface(lang_code, nlp_models, discourse_t):
14
+ """
15
+ Interfaz para el análisis del discurso
16
+ Args:
17
+ lang_code: Código del idioma actual
18
+ nlp_models: Modelos de spaCy cargados
19
+ discourse_t: Diccionario de traducciones
20
+ """
21
+ try:
22
+ # 1. Inicializar estado si no existe
23
+ if 'discourse_state' not in st.session_state:
24
+ st.session_state.discourse_state = {
25
+ 'analysis_count': 0,
26
+ 'last_analysis': None,
27
+ 'current_files': None
28
+ }
29
+
30
+ # 2. Título y descripción
31
+ st.subheader(discourse_t.get('discourse_title', 'Análisis del Discurso'))
32
+ st.info(discourse_t.get('initial_instruction',
33
+ 'Cargue dos archivos de texto para realizar un análisis comparativo del discurso.'))
34
+
35
+ # 3. Área de carga de archivos
36
+ col1, col2 = st.columns(2)
37
+ with col1:
38
+ st.markdown(discourse_t.get('file1_label', "**Documento 1 (Patrón)**"))
39
+ uploaded_file1 = st.file_uploader(
40
+ discourse_t.get('file_uploader1', "Cargar archivo 1"),
41
+ type=['txt'],
42
+ key=f"discourse_file1_{st.session_state.discourse_state['analysis_count']}"
43
+ )
44
+
45
+ with col2:
46
+ st.markdown(discourse_t.get('file2_label', "**Documento 2 (Comparación)**"))
47
+ uploaded_file2 = st.file_uploader(
48
+ discourse_t.get('file_uploader2', "Cargar archivo 2"),
49
+ type=['txt'],
50
+ key=f"discourse_file2_{st.session_state.discourse_state['analysis_count']}"
51
+ )
52
+
53
+ # 4. Botón de análisis
54
+ col1, col2, col3 = st.columns([1,2,1])
55
+ with col2:
56
+ analyze_button = st.button(
57
+ discourse_t.get('analyze_button', 'Analizar Discurso'),
58
+ key=generate_unique_key("discourse", "analyze_button"),
59
+ type="primary",
60
+ icon="🔍",
61
+ disabled=not (uploaded_file1 and uploaded_file2),
62
+ use_container_width=True
63
+ )
64
+
65
+ # 5. Proceso de análisis
66
+ if analyze_button and uploaded_file1 and uploaded_file2:
67
+ try:
68
+ with st.spinner(discourse_t.get('processing', 'Procesando análisis...')):
69
+ # Leer contenido de archivos
70
+ text1 = uploaded_file1.getvalue().decode('utf-8')
71
+ text2 = uploaded_file2.getvalue().decode('utf-8')
72
+
73
+ # Realizar análisis
74
+ result = perform_discourse_analysis(
75
+ text1,
76
+ text2,
77
+ nlp_models[lang_code],
78
+ lang_code
79
+ )
80
+
81
+ if result['success']:
82
+ # Guardar estado
83
+ st.session_state.discourse_result = result
84
+ st.session_state.discourse_state['analysis_count'] += 1
85
+ st.session_state.discourse_state['current_files'] = (
86
+ uploaded_file1.name,
87
+ uploaded_file2.name
88
+ )
89
+
90
+ # Guardar en base de datos
91
+ if store_discourse_analysis_result(
92
+ st.session_state.username,
93
+ text1,
94
+ text2,
95
+ result
96
+ ):
97
+ st.success(discourse_t.get('success_message', 'Análisis guardado correctamente'))
98
+
99
+ # Mostrar resultados
100
+ display_discourse_results(result, lang_code, discourse_t)
101
+ else:
102
+ st.error(discourse_t.get('error_message', 'Error al guardar el análisis'))
103
+ else:
104
+ st.error(discourse_t.get('analysis_error', 'Error en el análisis'))
105
+
106
+ except Exception as e:
107
+ logger.error(f"Error en análisis del discurso: {str(e)}")
108
+ st.error(discourse_t.get('error_processing', f'Error procesando archivos: {str(e)}'))
109
+
110
+ # 6. Mostrar resultados previos
111
+ elif 'discourse_result' in st.session_state and st.session_state.discourse_result is not None:
112
+ if st.session_state.discourse_state.get('current_files'):
113
+ st.info(
114
+ discourse_t.get('current_analysis_message', 'Mostrando análisis de los archivos: {} y {}')
115
+ .format(*st.session_state.discourse_state['current_files'])
116
+ )
117
+ display_discourse_results(
118
+ st.session_state.discourse_result,
119
+ lang_code,
120
+ discourse_t
121
+ )
122
+
123
+ except Exception as e:
124
+ logger.error(f"Error general en interfaz del discurso: {str(e)}")
125
+ st.error(discourse_t.get('general_error', 'Se produjo un error. Por favor, intente de nuevo.'))
126
+
127
+ def display_discourse_results(result, lang_code, discourse_t):
128
+ """
129
+ Muestra los resultados del análisis del discurso
130
+ """
131
+ if not result.get('success'):
132
+ st.warning(discourse_t.get('no_results', 'No hay resultados disponibles'))
133
+ return
134
+
135
+ col1, col2 = st.columns(2)
136
+
137
+ # Documento 1
138
+ with col1:
139
+ with st.expander(discourse_t.get('doc1_title', 'Documento 1'), expanded=True):
140
+ st.subheader(discourse_t.get('key_concepts', 'Conceptos Clave'))
141
+ if 'key_concepts1' in result:
142
+ df1 = pd.DataFrame(result['key_concepts1'], columns=['Concepto', 'Frecuencia'])
143
+ df1['Frecuencia'] = df1['Frecuencia'].round(2)
144
+ st.table(df1)
145
+
146
+ if 'graph1' in result:
147
+ st.pyplot(result['graph1'])
148
+ else:
149
+ st.warning(discourse_t.get('graph_not_available', 'Gráfico no disponible'))
150
+ else:
151
+ st.warning(discourse_t.get('concepts_not_available', 'Conceptos no disponibles'))
152
+
153
+ # Documento 2
154
+ with col2:
155
+ with st.expander(discourse_t.get('doc2_title', 'Documento 2'), expanded=True):
156
+ st.subheader(discourse_t.get('key_concepts', 'Conceptos Clave'))
157
+ if 'key_concepts2' in result:
158
+ df2 = pd.DataFrame(result['key_concepts2'], columns=['Concepto', 'Frecuencia'])
159
+ df2['Frecuencia'] = df2['Frecuencia'].round(2)
160
+ st.table(df2)
161
+
162
+ if 'graph2' in result:
163
+ st.pyplot(result['graph2'])
164
+ else:
165
+ st.warning(discourse_t.get('graph_not_available', 'Gráfico no disponible'))
166
+ else:
167
+ st.warning(discourse_t.get('concepts_not_available', 'Conceptos no disponibles'))
168
+
169
+ # Comparación de conceptos
170
+ if 'key_concepts1' in result and 'key_concepts2' in result:
171
+ st.subheader(discourse_t.get('comparison_title', 'Comparación de Conceptos'))
172
+ try:
173
+ plot_concept_comparison(result, discourse_t)
174
+ except Exception as e:
175
+ logger.error(f"Error en visualización de comparación: {str(e)}")
176
+ st.warning(discourse_t.get('comparison_error', 'Error al generar la comparación'))