from transformers import pipeline, AutoModelForSequenceClassification, AutoTokenizer from sklearn.metrics.pairwise import cosine_similarity from sklearn.feature_extraction.text import TfidfVectorizer import numpy as np import gradio as gr # Modelos para análisis de texto y similitud sentiment_analysis = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english") similarity_model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased") similarity_tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") # Respuestas esperadas para las preguntas expected_responses = { 'question1': ['respuesta1a', 'respuesta1b', 'respuesta1c'], 'question2': ['respuesta2a', 'respuesta2b', 'respuesta2c'], 'question3': ['respuesta3a', 'respuesta3b', 'respuesta3c'], 'question4': ['respuesta4a', 'respuesta4b', 'respuesta4c'], } # Función para calcular la similitud de respuestas usando TF-IDF y cosine similarity def calculate_similarity(response, expected_responses): vectorizer = TfidfVectorizer().fit_transform([response] + expected_responses) vectors = vectorizer.toarray() cosine_similarities = cosine_similarity(vectors[0:1], vectors[1:]) return float(max(cosine_similarities[0])) # Función para evaluar una sola respuesta def evaluate_response(response, expected_responses): return calculate_similarity(response, expected_responses) # Función para evaluar análisis de texto def analyze_text(response): analysis = sentiment_analysis(response) return analysis[0] # Función para evaluar todas las respuestas def evaluate_all_responses(responses): results = {} for i, response in enumerate(responses[:4]): question_key = f'question{i+1}' results[question_key] = evaluate_response(response, expected_responses[question_key]) for i, response in enumerate(responses[4:]): question_key = f'question{i+5}' results[question_key] = analyze_text(response) return results # Interfaz Gradio def evaluate(*responses): if len(responses) != 6: return {'error': 'Se esperan 6 respuestas'} results = evaluate_all_responses(responses) return results # Definir los cuadros de texto para las respuestas de las preguntas input_texts = [gr.Textbox(label=f"Pregunta {i+1}") for i in range(6)] # Definir la salida como un JSON para mostrar los resultados output_text = gr.JSON(label="Resultados") # Crear la interfaz Gradio demo = gr.Interface( fn=evaluate, inputs=input_texts, outputs=output_text, title="Evaluación de Respuestas y Análisis de Texto", description="Ingrese las respuestas para las 6 preguntas y obtenga evaluaciones de similitud y análisis de sentimientos.", ) # Lanzar la aplicación if __name__ == "__main__": demo.launch()