File size: 13,917 Bytes
6a0ab84 5483c4f ea18a0a 26c60ac ea18a0a 5483c4f d3afa04 26c60ac ea18a0a 26c60ac ea18a0a 26c60ac ea18a0a 5483c4f 024a52c 26c60ac 024a52c 26c60ac 024a52c 26c60ac 024a52c 26c60ac 024a52c 26c60ac 024a52c 74afc8b 5483c4f 26c60ac 5483c4f 26c60ac 024a52c 26c60ac 024a52c 26c60ac 024a52c 26c60ac 024a52c 26c60ac 024a52c 26c60ac 5483c4f 26c60ac 024a52c 26c60ac 024a52c 26c60ac 024a52c 26c60ac 024a52c d3afa04 5483c4f 26c60ac ea18a0a 26c60ac 5483c4f 26c60ac |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 |
import gradio as gr
from transformers import GPT2LMHeadModel, GPT2Tokenizer, BartForConditionalGeneration, BartTokenizer
import torch
# Configurar el dispositivo (CPU)
device = torch.device("cpu")
# Cargar el modelo y tokenizer para autocompletar código
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)
# Mover modelo a CPU y ponerlo en modo evaluación
model.to(device)
model.eval()
# Configurar pad_token si no existe
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
# Cargar BART para simplificación de texto
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)
# Mover BART a CPU y ponerlo en modo evaluación
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."
# Diccionario de autocompletado común en español
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()
# Buscar coincidencias exactas primero
if input_lower in common_completions:
suggestions = common_completions[input_lower]
# Filtrar para mostrar solo las que son diferentes al input
filtered_suggestions = [word for word in suggestions if word != input_lower]
if filtered_suggestions:
# Retornar la primera sugerencia sin el input original
best_match = filtered_suggestions[0]
return best_match[len(input_lower):]
# Si no hay coincidencia exacta, buscar palabras que empiecen con el input
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:
# Ordenar por longitud (más cortas primero) y tomar la primera
matching_words.sort(key=len)
best_match = matching_words[0]
return best_match[len(input_lower):]
# Si no encuentra coincidencias en el diccionario, usar el modelo GPT-2
try:
# Tokenizar el texto de entrada
inputs = tokenizer.encode(input_text, return_tensors="pt", padding=True)
inputs = inputs.to(device)
# Generar texto
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)
)
# Decodificar el resultado completo
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
# Extraer solo la parte nueva (sin el input original)
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:
# Crear un prompt para guiar la simplificación
prompt = f"Simplify this text using easier words: {input_text}"
# Tokenizar el texto
inputs = bart_tokenizer.encode(prompt, return_tensors="pt", max_length=512, truncation=True)
inputs = inputs.to(device)
# Generar texto simplificado
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
)
# Decodificar el resultado
simplified_text = bart_tokenizer.decode(outputs[0], skip_special_tokens=True)
# Limpiar el texto (remover el prompt si aparece)
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
)
# Conectar el botón con la función
generate_btn.click(
fn=autocomplete_text,
inputs=[input_textbox],
outputs=[output_textbox]
)
# También permitir Enter para generar
input_textbox.submit(
fn=autocomplete_text,
inputs=[input_textbox],
outputs=[output_textbox]
)
# Nueva pestaña para simplificar texto
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
)
# Conectar el botón de simplificar
simplify_btn.click(
fn=simplify_text,
inputs=[text_input],
outputs=[simplified_output]
)
# También permitir Enter para simplificar
text_input.submit(
fn=simplify_text,
inputs=[text_input],
outputs=[simplified_output]
)
# Pestaña adicional con ejemplos
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
# Crear y lanzar la aplicación
if __name__ == "__main__":
print("Iniciando aplicación de asistente de texto y código...")
# Crear la interfaz
app = create_autocomplete_interface()
# Lanzar la aplicación
app.launch(
share=False, # Cambiar a True si quieres compartir públicamente
server_name="0.0.0.0", # Permite acceso desde otras máquinas en la red local
server_port=7860, # Puerto por defecto de Gradio
show_error=True,
debug=False
) |