Spaces:
Sleeping
Sleeping
import os | |
import math | |
import gradio as gr | |
import json | |
import logging | |
from datasets import load_dataset, concatenate_datasets #list_datasets, load_from_disk | |
from transformers import ( | |
AutoTokenizer, | |
AutoModelForCausalLM, | |
DataCollatorForLanguageModeling, | |
TrainingArguments, | |
Trainer, | |
pipeline, | |
AutoModelForQuestionAnswering, | |
) | |
import evaluate # type: ignore | |
from huggingface_hub import login | |
from translate import Translator | |
from datasets import load_dataset, DownloadConfig | |
# Modelo base | |
MODEL_KEY = "EleutherAI/gpt-neo-125M" | |
tokenizer = AutoTokenizer.from_pretrained(MODEL_KEY) | |
model = AutoModelForCausalLM.from_pretrained(MODEL_KEY) | |
generator = pipeline("text-generation", model=model, tokenizer=tokenizer) | |
# Cargar modelos para Preguntas y Respuestas (QA) | |
qa_model = AutoModelForQuestionAnswering.from_pretrained("deepset/roberta-base-squad2") | |
qa_tokenizer = AutoTokenizer.from_pretrained("deepset/roberta-base-squad2") | |
qa_pipeline = pipeline("question-answering", model=qa_model, tokenizer=qa_tokenizer) | |
# Agregar más datasets para mejorar las respuestas | |
context_map = { | |
"imdb": "Dom: Cine | Estilo: Opinión", | |
"daily_dialog": "Dom: Conversación | Estilo: Diálogo diario", | |
"go_emotions": "Dom: Emociones | Estilo: Clasificación emocional", | |
"wikitext": "Dom: Enciclopedia | Estilo: Conocimiento general", | |
"math": "Dom: Matemáticas | Estilo: Problema matemático", # Agregar problemas de matemáticas | |
"empathetic_dialogues": "Dom: Psicología | Estilo: Apoyo emocional", # Para el comportamiento emocional | |
"math_advanced": "Dom: Matemáticas Avanzadas | Estilo: Trigonometría y Cálculo", # Dataset de matemáticas avanzadas | |
"programming": "Dom: Programación | Estilo: Resolución de código", # Dataset para programación | |
"social_sciences": "Dom: Ciencias Sociales | Estilo: Preguntas sobre historia y geografía", # Dataset de sociales | |
"economics": "Dom: Economía | Estilo: Problemas económicos y teorías", # Dataset de economía | |
"health": "Dom: Salud | Estilo: Información médica y de salud", # Dataset de salud | |
} | |
# Detectar idioma automáticamente | |
def detect_language(text): | |
try: | |
return detect(text) # Detecta el idioma de la entrada | |
except: | |
return "en" # Si no se puede detectar, se asume inglés | |
# Generación de texto (si se solicita un cuento, por ejemplo) | |
def generate_text(prompt, max_length=100): | |
output = generator(prompt, max_length=int(max_length), num_return_sequences=1)[0]["generated_text"] | |
return output | |
# Preguntas y respuestas basadas en contexto | |
def answer_question(question, context): | |
result = qa_pipeline(question=question, context=context) | |
return result['answer'] | |
# Traducción | |
def translate_text(text, lang): | |
translator = Translator(to_lang=lang) | |
try: | |
return translator.translate(text) | |
except Exception as e: | |
return f"Error: {str(e)}" | |
# Selección del contexto y modelo según la solicitud | |
def process_input(user_input): | |
# Detectar idioma | |
detected_lang = detect_language(user_input) | |
print(f"Idioma detectado: {detected_lang}") | |
# Si la entrada es una pregunta, usaremos un modelo de Preguntas y Respuestas | |
if '?' in user_input: | |
context = "Este es un contexto general. Puedo responder preguntas específicas sobre cine, ciencia, o emociones." | |
# Identificar tipo de pregunta (matemáticas, programación, etc.) | |
if "matemática" in user_input.lower() or "cálculo" in user_input.lower() or "trigonometría" in user_input.lower(): | |
context = "Dom: Matemáticas Avanzadas | Estilo: Trigonometría y Cálculo. Ejemplo: ¿Cuál es la derivada de x^2?" | |
elif "programación" in user_input.lower(): | |
context = "Dom: Programación | Estilo: Resolución de código. Ejemplo: ¿Cómo se resuelve un bucle en Python?" | |
elif "historia" in user_input.lower() or "geografía" in user_input.lower(): | |
context = "Dom: Ciencias Sociales | Estilo: Preguntas sobre historia y geografía. Ejemplo: ¿Quién fue Sócrates?" | |
elif "economía" in user_input.lower(): | |
context = "Dom: Economía | Estilo: Problemas económicos y teorías. Ejemplo: ¿Qué es la inflación?" | |
elif "salud" in user_input.lower(): | |
context = "Dom: Salud | Estilo: Información médica y de salud. Ejemplo: ¿Qué es la diabetes?" | |
answer = answer_question(user_input, context) | |
return answer | |
elif "math" in user_input.lower(): | |
# Si se detecta una pregunta matemática | |
return "Resolviendo la operación matemática..." | |
elif "cuento" in user_input.lower(): | |
# Si el usuario solicita un cuento | |
prompt = "Había una vez, en un reino lejano..." | |
return generate_text(prompt, max_length=200) | |
elif "emoción" in user_input.lower(): | |
# Si es una solicitud de apoyo emocional | |
context = "Dom: Psicología | Estilo: Apoyo emocional. ¿Cómo te sientes hoy?" | |
return generate_text(context + " Estoy aquí para apoyarte", max_length=100) | |
else: | |
return "No entiendo la solicitud, por favor intenta preguntar algo más específico." | |
# Interfaz de Gradio | |
with gr.Blocks() as demo: | |
gr.Markdown("# 🧠 MultiDomain Text Generator + Translator") | |
with gr.Tab("Generar respuestas y contar historias"): | |
user_input = gr.Textbox(label="Tu pregunta o solicitud", placeholder="Haz una pregunta o pide un cuento...") | |
output_text = gr.Textbox(label="Respuesta generada") | |
btn_generate = gr.Button("Generar respuesta o cuento") | |
btn_generate.click(process_input, inputs=user_input, outputs=output_text) | |
with gr.Tab("Traducir texto"): | |
input_text = gr.Textbox(label="Texto a traducir") | |
lang = gr.Textbox(label="Código de idioma destino", value="en") | |
output_translation = gr.Textbox(label="Texto traducido") | |
btn_translate = gr.Button("Traducir") | |
btn_translate.click(translate_text, inputs=[input_text, lang], outputs=output_translation) | |
demo.launch() | |