File size: 8,151 Bytes
c58df45 |
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 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
import streamlit as st
from .semantic_process import process_semantic_analysis
from ..chatbot.chatbot import initialize_chatbot
from ..database.database_oldFromV2 import store_file_semantic_contents, retrieve_file_contents, delete_file, get_user_files
from ..utils.widget_utils import generate_unique_key
def get_translation(t, key, default):
return t.get(key, default)
def display_semantic_interface(lang_code, nlp_models, t):
#st.set_page_config(layout="wide")
# Estilo CSS personalizado
st.markdown("""
<style>
.semantic-initial-message {
background-color: #f0f2f6;
border-left: 5px solid #4CAF50;
padding: 10px;
border-radius: 5px;
font-size: 16px;
margin-bottom: 20px;
}
.stButton > button {
width: 100%;
}
.chat-container {
height: 400px;
overflow-y: auto;
border: 1px solid #ddd;
padding: 10px;
border-radius: 5px;
}
.file-management-container {
border: 1px solid #ddd;
padding: 10px;
border-radius: 5px;
margin-bottom: 20px;
}
.horizontal-list {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
</style>
""", unsafe_allow_html=True)
# Mostrar el mensaje inicial como un p谩rrafo estilizado
st.markdown(f"""
<div class="semantic-initial-message">
{get_translation(t, 'semantic_initial_message', 'Welcome to the semantic analysis interface.')}
</div>
""", unsafe_allow_html=True)
# Inicializar el chatbot si no existe
if 'semantic_chatbot' not in st.session_state:
st.session_state.semantic_chatbot = initialize_chatbot('semantic')
# Contenedor para la gesti贸n de archivos
with st.container():
st.markdown('<div class="file-management-container">', unsafe_allow_html=True)
col1, col2, col3, col4 = st.columns(4)
with col1:
if st.button(get_translation(t, 'upload_file', 'Upload File'), key=generate_unique_key('semantic', 'upload_button')):
uploaded_file = st.file_uploader(get_translation(t, 'file_uploader', 'Choose a file'), type=['txt', 'pdf', 'docx', 'doc', 'odt'], key=generate_unique_key('semantic', 'file_uploader'))
if uploaded_file is not None:
file_contents = uploaded_file.getvalue().decode('utf-8')
if store_file_semantic_contents(st.session_state.username, uploaded_file.name, file_contents):
st.success(get_translation(t, 'file_uploaded_success', 'File uploaded and saved to database successfully'))
st.session_state.file_contents = file_contents
st.rerun()
else:
st.error(get_translation(t, 'file_upload_error', 'Error uploading file'))
with col2:
user_files = get_user_files(st.session_state.username, 'semantic')
file_options = [get_translation(t, 'select_file', 'Select a file')] + [file['file_name'] for file in user_files]
selected_file = st.selectbox(get_translation(t, 'file_list', 'File List'), options=file_options, key=generate_unique_key('semantic', 'file_selector'))
if selected_file != get_translation(t, 'select_file', 'Select a file'):
if st.button(get_translation(t, 'load_file', 'Load File'), key=generate_unique_key('semantic', 'load_file')):
file_contents = retrieve_file_contents(st.session_state.username, selected_file, 'semantic')
if file_contents:
st.session_state.file_contents = file_contents
st.success(get_translation(t, 'file_loaded_success', 'File loaded successfully'))
else:
st.error(get_translation(t, 'file_load_error', 'Error loading file'))
with col3:
if st.button(get_translation(t, 'analyze_document', 'Analyze Document'), key=generate_unique_key('semantic', 'analyze_document')):
if 'file_contents' in st.session_state:
with st.spinner(get_translation(t, 'analyzing', 'Analyzing...')):
graph, key_concepts = process_semantic_analysis(st.session_state.file_contents, nlp_models[lang_code], lang_code)
st.session_state.graph = graph
st.session_state.key_concepts = key_concepts
st.success(get_translation(t, 'analysis_completed', 'Analysis completed'))
else:
st.error(get_translation(t, 'no_file_uploaded', 'No file uploaded'))
with col4:
if st.button(get_translation(t, 'delete_file', 'Delete File'), key=generate_unique_key('semantic', 'delete_file')):
if selected_file and selected_file != get_translation(t, 'select_file', 'Select a file'):
if delete_file(st.session_state.username, selected_file, 'semantic'):
st.success(get_translation(t, 'file_deleted_success', 'File deleted successfully'))
if 'file_contents' in st.session_state:
del st.session_state.file_contents
st.rerun()
else:
st.error(get_translation(t, 'file_delete_error', 'Error deleting file'))
else:
st.error(get_translation(t, 'no_file_selected', 'No file selected'))
st.markdown('</div>', unsafe_allow_html=True)
# Crear dos columnas: una para el chat y otra para la visualizaci贸n
col_chat, col_graph = st.columns([1, 1])
with col_chat:
st.subheader(get_translation(t, 'chat_title', 'Semantic Analysis Chat'))
# Chat interface
chat_container = st.container()
with chat_container:
# Mostrar el historial del chat
chat_history = st.session_state.get('semantic_chat_history', [])
for message in chat_history:
with st.chat_message(message["role"]):
st.write(message["content"])
# Input del usuario
user_input = st.chat_input(get_translation(t, 'semantic_chat_input', 'Type your message here...'), key=generate_unique_key('semantic', 'chat_input'))
if user_input:
# A帽adir el mensaje del usuario al historial
chat_history.append({"role": "user", "content": user_input})
# Generar respuesta del chatbot
chatbot = st.session_state.semantic_chatbot
response = chatbot.generate_response(user_input, lang_code, context=st.session_state.get('file_contents'))
# A帽adir la respuesta del chatbot al historial
chat_history.append({"role": "assistant", "content": response})
# Actualizar el historial en session_state
st.session_state.semantic_chat_history = chat_history
# Forzar la actualizaci贸n de la interfaz
st.rerun()
with col_graph:
st.subheader(get_translation(t, 'graph_title', 'Semantic Graph'))
# Mostrar conceptos clave en un expander horizontal
with st.expander(get_translation(t, 'key_concepts_title', 'Key Concepts'), expanded=True):
if 'key_concepts' in st.session_state:
st.markdown('<div class="horizontal-list">', unsafe_allow_html=True)
for concept, freq in st.session_state.key_concepts:
st.markdown(f'<span style="margin-right: 10px;">{concept}: {freq:.2f}</span>', unsafe_allow_html=True)
st.markdown('</div>', unsafe_allow_html=True)
if 'graph' in st.session_state:
st.pyplot(st.session_state.graph)
# Bot贸n para limpiar el historial del chat
if st.button(get_translation(t, 'clear_chat', 'Clear chat'), key=generate_unique_key('semantic', 'clear_chat')):
st.session_state.semantic_chat_history = []
st.rerun() |