| 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 |
| ) |