test2 / app.py
AIdeaText's picture
Update app.py
46ac0c4 verified
raw
history blame
12.4 kB
import os
import streamlit as st
import spacy
from spacy import displacy
import re
from transformers import BlenderbotTokenizer, BlenderbotForConditionalGeneration
from azure.cosmos import CosmosClient
from azure.cosmos.exceptions import CosmosHttpResponseError
from pymongo import MongoClient
import numpy as np
# Azure Cosmos DB configuration
cosmos_endpoint = "YOUR_COSMOS_DB_ENDPOINT"
cosmos_key = "YOUR_COSMOS_DB_KEY"
cosmos_client = CosmosClient(cosmos_endpoint, cosmos_key)
# SQL API database for user management
user_database = cosmos_client.get_database_client("user_database")
user_container = user_database.get_container_client("users")
# MongoDB API configuration for text analysis results
mongo_connection_string = "YOUR_MONGODB_CONNECTION_STRING"
mongo_client = MongoClient(mongo_connection_string)
mongo_db = mongo_client['aideatext_db']
analysis_collection = mongo_db['text_analysis']
from modules.auth import register_user, authenticate_user, get_user_role
from modules.morpho_analysis import get_repeated_words_colors, highlight_repeated_words, POS_COLORS, POS_TRANSLATIONS
from modules.syntax_analysis import visualize_syntax
# Configure the page to use the full width
st.set_page_config(
page_title="AIdeaText",
layout="wide",
page_icon="random"
)
@st.cache_resource
def load_chatbot_model():
tokenizer = BlenderbotTokenizer.from_pretrained("facebook/blenderbot-400M-distill")
model = BlenderbotForConditionalGeneration.from_pretrained("facebook/blenderbot-400M-distill")
return tokenizer, model
# Load the chatbot model
chatbot_tokenizer, chatbot_model = load_chatbot_model()
def get_chatbot_response(input_text):
inputs = chatbot_tokenizer(input_text, return_tensors="pt")
reply_ids = chatbot_model.generate(**inputs)
response = chatbot_tokenizer.batch_decode(reply_ids, skip_special_tokens=True)[0]
return response
def load_spacy_models():
return {
'es': spacy.load("es_core_news_lg"),
'en': spacy.load("en_core_web_lg"),
'fr': spacy.load("fr_core_news_lg")
}
def store_analysis_result(username, text, repeated_words, arc_diagram, network_diagram):
try:
analysis_collection.insert_one({
'username': username,
'text': text,
'repeated_words': repeated_words,
'arc_diagram': arc_diagram,
'network_diagram': network_diagram
})
return True
except Exception as e:
st.error(f"Error storing analysis result: {e}")
return False
def login_page():
st.title("Iniciar Sesi贸n")
username = st.text_input("Usuario")
password = st.text_input("Contrase帽a", type='password')
if st.button("Iniciar Sesi贸n"):
if authenticate_user(username, password):
st.success(f"Bienvenido, {username}!")
st.session_state.logged_in = True
st.session_state.username = username
st.session_state.role = get_user_role(username)
st.experimental_rerun()
else:
st.error("Usuario o contrase帽a incorrectos")
def register_page():
st.title("Registrarse")
new_username = st.text_input("Nuevo Usuario")
new_password = st.text_input("Nueva Contrase帽a", type='password')
role = st.selectbox("Rol", ["Estudiante", "Profesor"])
additional_info = {}
if role == "Estudiante":
additional_info['carrera'] = st.text_input("Carrera")
elif role == "Profesor":
additional_info['departamento'] = st.text_input("Departamento")
if st.button("Registrarse"):
if register_user(new_username, new_password, role, additional_info):
st.success("Registro exitoso. Por favor, inicia sesi贸n.")
else:
st.error("El usuario ya existe o ocurri贸 un error durante el registro")
def main_app():
# Load spaCy models
nlp_models = load_spacy_models()
# Language selection
languages = {
'Espa帽ol': 'es',
'English': 'en',
'Fran莽ais': 'fr'
}
selected_lang = st.sidebar.selectbox("Select Language / Seleccione el idioma / Choisissez la langue", list(languages.keys()))
lang_code = languages[selected_lang]
# Translations
translations = {
'es': {
'title': "AIdeaText - An谩lisis morfol贸gico y sint谩ctico",
'input_label': "Ingrese un texto para analizar (m谩x. 5,000 palabras):",
'input_placeholder': "El objetivo de esta aplicaci贸n es que mejore sus habilidades de redacci贸n. Para ello, despu茅s de ingresar su texto y presionar el bot贸n obtendr谩 tres vistas horizontales. La primera, le indicar谩 las palabras que se repiten por categor铆a gram谩tical; la segunda, un diagrama de arco le indicara las conexiones sint谩cticas en cada oraci贸n; y la tercera, es un grafo en el cual visualizara la configuraci贸n de su texto.",
'analyze_button': "Analizar texto",
'repeated_words': "Palabras repetidas",
'legend': "Leyenda: Categor铆as gramaticales",
'arc_diagram': "An谩lisis sint谩ctico: Diagrama de arco",
'network_diagram': "An谩lisis sint谩ctico: Diagrama de red",
'sentence': "Oraci贸n"
},
'en': {
'title': "AIdeaText - Morphological and Syntactic Analysis",
'input_label': "Enter a text to analyze (max 5,000 words):",
'input_placeholder': "The goal of this app is for you to improve your writing skills. To do this, after entering your text and pressing the button you will get three horizontal views. The first will indicate the words that are repeated by grammatical category; second, an arc diagram will indicate the syntactic connections in each sentence; and the third is a graph in which you will visualize the configuration of your text.",
'analyze_button': "Analyze text",
'repeated_words': "Repeated words",
'legend': "Legend: Grammatical categories",
'arc_diagram': "Syntactic analysis: Arc diagram",
'network_diagram': "Syntactic analysis: Network diagram",
'sentence': "Sentence"
},
'fr': {
'title': "AIdeaText - Analyse morphologique et syntaxique",
'input_label': "Entrez un texte 脿 analyser (max 5 000 mots) :",
'input_placeholder': "Le but de cette application est d'am茅liorer vos comp茅tences en r茅daction. Pour ce faire, apr猫s avoir saisi votre texte et appuy茅 sur le bouton vous obtiendrez trois vues horizontales. Le premier indiquera les mots r茅p茅t茅s par cat茅gorie grammaticale; deuxi猫mement, un diagramme en arcs indiquera les connexions syntaxiques dans chaque phrase; et le troisi猫me est un graphique dans lequel vous visualiserez la configuration de votre texte.",
'analyze_button': "Analyser le texte",
'repeated_words': "Mots r茅p茅t茅s",
'legend': "L茅gende : Cat茅gories grammaticales",
'arc_diagram': "Analyse syntaxique : Diagramme en arc",
'network_diagram': "Analyse syntaxique : Diagramme de r茅seau",
'sentence': "Phrase"
}
}
# Use translations
t = translations[lang_code]
# Create two columns: one for chat and one for analysis
col1, col2 = st.columns([1, 2])
with col1:
st.markdown(f"### Chat con AIdeaText")
# Initialize chat history if it doesn't exist
if 'chat_history' not in st.session_state:
st.session_state.chat_history = []
# Display chat history
for i, (role, text) in enumerate(st.session_state.chat_history):
if role == "user":
st.text_area(f"T煤:", value=text, height=50, key=f"user_message_{i}", disabled=True)
else:
st.text_area(f"AIdeaText:", value=text, height=50, key=f"bot_message_{i}", disabled=True)
# User input field
user_input = st.text_input("Escribe tu mensaje aqu铆:")
if st.button("Enviar"):
if user_input:
# Add user message to history
st.session_state.chat_history.append(("user", user_input))
# Get chatbot response
response = get_chatbot_response(user_input)
# Add chatbot response to history
st.session_state.chat_history.append(("bot", response))
# Clear input field
st.experimental_rerun()
with col2:
st.markdown(f"### {t['title']}")
if st.session_state.role == "Estudiante":
# Student interface code
if 'input_text' not in st.session_state:
st.session_state.input_text = ""
sentence_input = st.text_area(t['input_label'], height=150, placeholder=t['input_placeholder'], value=st.session_state.input_text)
st.session_state.input_text = sentence_input
if st.button(t['analyze_button']):
if sentence_input:
doc = nlp_models[lang_code](sentence_input)
# Highlighted Repeated Words
with st.expander(t['repeated_words'], expanded=True):
word_colors = get_repeated_words_colors(doc)
highlighted_text = highlight_repeated_words(doc, word_colors)
st.markdown(highlighted_text, unsafe_allow_html=True)
# Legend for grammatical categories
st.markdown(f"##### {t['legend']}")
legend_html = "<div style='display: flex; flex-wrap: wrap;'>"
for pos, color in POS_COLORS.items():
if pos in POS_TRANSLATIONS:
legend_html += f"<div style='margin-right: 10px;'><span style='background-color: {color}; padding: 2px 5px;'>{POS_TRANSLATIONS[pos]}</span></div>"
legend_html += "</div>"
st.markdown(legend_html, unsafe_allow_html=True)
# Arc Diagram
with st.expander(t['arc_diagram'], expanded=True):
sentences = list(doc.sents)
arc_diagrams = []
for i, sent in enumerate(sentences):
st.subheader(f"{t['sentence']} {i+1}")
html = displacy.render(sent, style="dep", options={"distance": 100})
html = html.replace('height="375"', 'height="200"')
html = re.sub(r'<svg[^>]*>', lambda m: m.group(0).replace('height="450"', 'height="300"'), html)
html = re.sub(r'<g [^>]*transform="translate\((\d+),(\d+)\)"', lambda m: f'<g transform="translate({m.group(1)},50)"', html)
st.write(html, unsafe_allow_html=True)
arc_diagrams.append(html)
# Network graph
with st.expander(t['network_diagram'], expanded=True):
fig = visualize_syntax(sentence_input, nlp_models[lang_code], lang_code)
st.pyplot(fig)
# Store analysis results
store_analysis_result(
st.session_state.username,
sentence_input,
highlighted_text,
arc_diagrams,
fig
)
elif st.session_state.role == "Profesor":
# Teacher interface code
st.write("Bienvenido, profesor. Aqu铆 podr谩s ver el progreso de tus estudiantes.")
# Add logic to display student progress
def main():
if 'logged_in' not in st.session_state:
st.session_state.logged_in = False
if not st.session_state.logged_in:
menu = ["Iniciar Sesi贸n", "Registrarse"]
choice = st.sidebar.selectbox("Menu", menu)
if choice == "Iniciar Sesi贸n":
login_page()
elif choice == "Registrarse":
register_page()
else:
if st.sidebar.button("Cerrar Sesi贸n"):
st.session_state.logged_in = False
st.experimental_rerun()
main_app()
if __name__ == "__main__":
main()