|
import gradio as gr |
|
from transformers import GPT2LMHeadModel, GPT2Tokenizer, BartForConditionalGeneration, BartTokenizer |
|
import torch |
|
|
|
|
|
device = torch.device("cpu") |
|
|
|
|
|
print("Cargando modelo code-autocomplete-gpt2-base...") |
|
model_name = "shibing624/code-autocomplete-gpt2-base" |
|
tokenizer = GPT2Tokenizer.from_pretrained(model_name) |
|
model = GPT2LMHeadModel.from_pretrained(model_name) |
|
|
|
|
|
model.to(device) |
|
model.eval() |
|
|
|
|
|
if tokenizer.pad_token is None: |
|
tokenizer.pad_token = tokenizer.eos_token |
|
|
|
|
|
print("Cargando modelo BART para simplificación...") |
|
bart_model_name = "facebook/bart-base" |
|
bart_tokenizer = BartTokenizer.from_pretrained(bart_model_name) |
|
bart_model = BartForConditionalGeneration.from_pretrained(bart_model_name) |
|
|
|
|
|
bart_model.to(device) |
|
bart_model.eval() |
|
|
|
def autocomplete_text(input_text, max_tokens=5): |
|
""" |
|
Autocompleta texto común en español basado en el inicio de palabras |
|
|
|
Args: |
|
input_text (str): Texto inicial a completar |
|
max_tokens (int): Número máximo de tokens a generar |
|
|
|
Returns: |
|
str: Solo la parte nueva generada (sin el input original) |
|
""" |
|
if not input_text.strip(): |
|
return "Por favor, ingresa algún texto para completar." |
|
|
|
|
|
common_completions = { |
|
'h': ['hola', 'hacer', 'historia', 'hermano', 'hospital', 'habitación'], |
|
'ho': ['hola', 'hombre', 'hospital', 'hoy', 'hogar'], |
|
'hol': ['hola'], |
|
'c': ['casa', 'comer', 'coche', 'computadora', 'ciudad', 'cambiar'], |
|
'ca': ['casa', 'carro', 'cambiar', 'caminar', 'calor'], |
|
'cas': ['casa', 'casi'], |
|
'com': ['comer', 'computadora', 'comprar', 'completar'], |
|
'comp': ['computadora', 'comprar', 'completar', 'comprimir'], |
|
'compu': ['computadora'], |
|
'g': ['gracias', 'grande', 'gente', 'guitarra', 'ganar'], |
|
'gr': ['gracias', 'grande', 'grupo'], |
|
'gra': ['gracias', 'grande'], |
|
'graci': ['gracias'], |
|
'b': ['bien', 'bueno', 'beber', 'buscar', 'bailar'], |
|
'bi': ['bien', 'bicicleta'], |
|
'bu': ['bueno', 'buscar'], |
|
'bue': ['bueno', 'buenos'], |
|
'buen': ['bueno', 'buenos'], |
|
'm': ['muy', 'madre', 'mesa', 'música', 'mañana'], |
|
'mu': ['muy', 'música', 'mujer', 'mundo'], |
|
'muy': ['muy'], |
|
't': ['trabajo', 'tiempo', 'teléfono', 'también', 'tener'], |
|
'tr': ['trabajo', 'tres', 'transporte'], |
|
'tra': ['trabajo', 'transporte'], |
|
'trab': ['trabajo'], |
|
'trabaj': ['trabajo'], |
|
'p': ['por', 'para', 'persona', 'programa', 'problema'], |
|
'po': ['por', 'poder'], |
|
'pr': ['programa', 'problema', 'primero'], |
|
'pro': ['programa', 'problema', 'proceso'], |
|
'prog': ['programa'], |
|
'progr': ['programa'], |
|
'progra': ['programa'], |
|
'program': ['programa'], |
|
'e': ['escribir', 'estudiar', 'escuela', 'entender', 'español'], |
|
'es': ['escribir', 'estudiar', 'escuela', 'español', 'estar'], |
|
'esc': ['escribir', 'escuela'], |
|
'escr': ['escribir'], |
|
'escri': ['escribir'], |
|
'escrib': ['escribir'], |
|
'escribi': ['escribir'], |
|
'a': ['aplicación', 'agua', 'amigo', 'aprender', 'ayuda'], |
|
'ap': ['aplicación', 'aprender', 'ayuda'], |
|
'apl': ['aplicación'], |
|
'apli': ['aplicación'], |
|
'aplic': ['aplicación'], |
|
'aplica': ['aplicación'], |
|
'aplicaci': ['aplicación'], |
|
'aplicacio': ['aplicación'], |
|
'aplicacion': ['aplicación'], |
|
'v': ['ver', 'venir', 'vida', 'viaje', 'ventana'], |
|
've': ['ver', 'venir', 'ventana'], |
|
'ven': ['venir', 'ventana'], |
|
'veni': ['venir'], |
|
'd': ['de', 'día', 'decir', 'dinero', 'diferente'], |
|
'di': ['día', 'dinero', 'diferente'], |
|
'dia': ['día'], |
|
'n': ['no', 'necesitar', 'noche', 'número', 'nuevo'], |
|
'nu': ['número', 'nuevo'], |
|
'nue': ['nuevo'], |
|
'nuev': ['nuevo'], |
|
's': ['sí', 'ser', 'sistema', 'salir', 'semana'], |
|
'si': ['sí', 'sistema', 'siempre'], |
|
'sis': ['sistema'], |
|
'sist': ['sistema'], |
|
'siste': ['sistema'], |
|
'sistem': ['sistema'], |
|
'l': ['la', 'lo', 'lugar', 'llamar', 'leer'], |
|
'lu': ['lugar'], |
|
'lug': ['lugar'], |
|
'luga': ['lugar'], |
|
'r': ['rápido', 'recordar', 'respuesta', 'resultado', 'realizar'], |
|
'ra': ['rápido'], |
|
'rap': ['rápido'], |
|
'rapi': ['rápido'], |
|
'rapid': ['rápido'], |
|
'rapido': ['rápido'] |
|
} |
|
|
|
input_lower = input_text.lower().strip() |
|
|
|
|
|
if input_lower in common_completions: |
|
suggestions = common_completions[input_lower] |
|
|
|
filtered_suggestions = [word for word in suggestions if word != input_lower] |
|
if filtered_suggestions: |
|
|
|
best_match = filtered_suggestions[0] |
|
return best_match[len(input_lower):] |
|
|
|
|
|
matching_words = [] |
|
for word_list in common_completions.values(): |
|
for word in word_list: |
|
if word.startswith(input_lower) and word != input_lower: |
|
matching_words.append(word) |
|
|
|
if matching_words: |
|
|
|
matching_words.sort(key=len) |
|
best_match = matching_words[0] |
|
return best_match[len(input_lower):] |
|
|
|
|
|
try: |
|
|
|
inputs = tokenizer.encode(input_text, return_tensors="pt", padding=True) |
|
inputs = inputs.to(device) |
|
|
|
|
|
with torch.no_grad(): |
|
outputs = model.generate( |
|
inputs, |
|
max_new_tokens=max_tokens, |
|
num_return_sequences=1, |
|
temperature=0.7, |
|
do_sample=True, |
|
pad_token_id=tokenizer.eos_token_id, |
|
eos_token_id=tokenizer.eos_token_id, |
|
attention_mask=torch.ones_like(inputs) |
|
) |
|
|
|
|
|
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True) |
|
|
|
|
|
new_text = generated_text[len(input_text):].strip() |
|
|
|
if not new_text: |
|
return "No se encontraron sugerencias." |
|
|
|
return new_text |
|
|
|
except Exception as e: |
|
return f"Error al generar sugerencias: {str(e)}" |
|
|
|
def simplify_text(input_text, max_length=150): |
|
""" |
|
Simplifica texto complejo usando BART |
|
|
|
Args: |
|
input_text (str): Texto complejo a simplificar |
|
max_length (int): Longitud máxima del texto simplificado |
|
|
|
Returns: |
|
str: Texto simplificado con palabras más sencillas |
|
""" |
|
if not input_text.strip(): |
|
return "Por favor, ingresa algún texto para simplificar." |
|
|
|
try: |
|
|
|
prompt = f"Simplify this text using easier words: {input_text}" |
|
|
|
|
|
inputs = bart_tokenizer.encode(prompt, return_tensors="pt", max_length=512, truncation=True) |
|
inputs = inputs.to(device) |
|
|
|
|
|
with torch.no_grad(): |
|
outputs = bart_model.generate( |
|
inputs, |
|
max_length=max_length, |
|
min_length=20, |
|
num_return_sequences=1, |
|
temperature=0.7, |
|
do_sample=True, |
|
early_stopping=True, |
|
no_repeat_ngram_size=2, |
|
pad_token_id=bart_tokenizer.pad_token_id, |
|
eos_token_id=bart_tokenizer.eos_token_id |
|
) |
|
|
|
|
|
simplified_text = bart_tokenizer.decode(outputs[0], skip_special_tokens=True) |
|
|
|
|
|
if simplified_text.startswith("Simplify this text using easier words:"): |
|
simplified_text = simplified_text.replace("Simplify this text using easier words:", "").strip() |
|
|
|
if not simplified_text: |
|
return "No se pudo simplificar el texto." |
|
|
|
return simplified_text |
|
|
|
except Exception as e: |
|
return f"Error al simplificar texto: {str(e)}" |
|
|
|
def create_autocomplete_interface(): |
|
""" |
|
Crea la interfaz con autocompletar y simplificación dentro de gr.Blocks() |
|
""" |
|
|
|
with gr.Blocks(title="Asistente de Texto") as demo: |
|
|
|
gr.Markdown("# 🤖 Asistente de Texto") |
|
gr.Markdown("Herramientas para autocompletar palabras y simplificar textos complejos.") |
|
|
|
with gr.Tab("Autocompletar"): |
|
with gr.Row(): |
|
with gr.Column(): |
|
input_textbox = gr.Textbox( |
|
label="Texto a completar", |
|
placeholder="Escribe 'h' para ver 'hola'...", |
|
lines=3, |
|
max_lines=5 |
|
) |
|
|
|
generate_btn = gr.Button("Completar Texto", variant="primary") |
|
|
|
with gr.Column(): |
|
output_textbox = gr.Textbox( |
|
label="Sugerencia de completado", |
|
placeholder="Aquí aparecerá la sugerencia...", |
|
lines=3, |
|
max_lines=5, |
|
interactive=False |
|
) |
|
|
|
|
|
generate_btn.click( |
|
fn=autocomplete_text, |
|
inputs=[input_textbox], |
|
outputs=[output_textbox] |
|
) |
|
|
|
|
|
input_textbox.submit( |
|
fn=autocomplete_text, |
|
inputs=[input_textbox], |
|
outputs=[output_textbox] |
|
) |
|
|
|
|
|
with gr.Tab("Simplificar Texto"): |
|
with gr.Row(): |
|
with gr.Column(): |
|
text_input = gr.Textbox( |
|
label="Texto complejo a simplificar", |
|
placeholder="Ingresa aquí el texto difícil de entender...", |
|
lines=6, |
|
max_lines=12 |
|
) |
|
|
|
simplify_btn = gr.Button("Simplificar Texto", variant="secondary") |
|
|
|
with gr.Column(): |
|
simplified_output = gr.Textbox( |
|
label="Texto simplificado", |
|
placeholder="Aquí aparecerá el texto más fácil de entender...", |
|
lines=6, |
|
max_lines=12, |
|
interactive=False |
|
) |
|
|
|
|
|
simplify_btn.click( |
|
fn=simplify_text, |
|
inputs=[text_input], |
|
outputs=[simplified_output] |
|
) |
|
|
|
|
|
text_input.submit( |
|
fn=simplify_text, |
|
inputs=[text_input], |
|
outputs=[simplified_output] |
|
) |
|
|
|
|
|
with gr.Tab("Ejemplos"): |
|
gr.Markdown(""" |
|
### Ejemplos de Autocompletado de Palabras: |
|
|
|
**Entrada:** "h" |
|
**Salida:** "ola" (completa "hola") |
|
|
|
**Entrada:** "gra" |
|
**Salida:** "cias" (completa "gracias") |
|
|
|
**Entrada:** "compu" |
|
**Salida:** "tadora" (completa "computadora") |
|
|
|
**Entrada:** "prog" |
|
**Salida:** "rama" (completa "programa") |
|
|
|
**Entrada:** "escrib" |
|
**Salida:** "ir" (completa "escribir") |
|
|
|
--- |
|
|
|
### Ejemplos de Simplificación de Texto: |
|
|
|
**Texto complejo:** "La implementación de algoritmos de machine learning requiere una comprensión profunda de estructuras de datos y técnicas de optimización." |
|
**Texto simple:** "Para usar inteligencia artificial necesitas entender bien cómo organizar datos y mejorar programas." |
|
|
|
**Texto complejo:** "El protocolo de comunicación asíncrona permite la transmisión de datos sin sincronización temporal." |
|
**Texto simple:** "Este método permite enviar información sin esperar a que termine el envío anterior." |
|
""") |
|
|
|
return demo |
|
|
|
|
|
if __name__ == "__main__": |
|
print("Iniciando aplicación de asistente de texto y código...") |
|
|
|
|
|
app = create_autocomplete_interface() |
|
|
|
|
|
app.launch( |
|
share=False, |
|
server_name="0.0.0.0", |
|
server_port=7860, |
|
show_error=True, |
|
debug=False |
|
) |