Spaces:
Running
Running
| import csv | |
| import random | |
| from pathlib import Path | |
| random.seed(42) | |
| STORES_ES = ["Falabella", "Ripley", "Lider", "Jumbo", "Amazon", "Uber", "Netflix", "Paris", "Easy", "Rappi", "Shell", "Farmacia Cruz Verde"] | |
| STORES_EN = ["Walmart", "Amazon", "Target", "Uber", "Netflix", "Best Buy", "Walgreens", "Apple Store", "Shell", "CVS"] | |
| TIMES = ["8:00am", "8:30am", "9:00am", "9:30am", "10:00am", "10:30am", "11:00am", "11:30am", | |
| "2:00pm", "2:30pm", "3:00pm", "3:30pm", "4:00pm", "4:30pm", "5:00pm"] | |
| DAYS_ES = ["lunes", "martes", "miercoles", "jueves", "viernes"] | |
| DAYS_EN = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"] | |
| SPECIALTIES_ES = ["medica", "odontologica", "oftalmologica", "dermatologica", "de control"] | |
| SPECIALTIES_EN = ["medical", "dental", "ophthalmology", "dermatology", "follow-up"] | |
| CITIES_ES = ["Santiago", "Valparaiso", "Concepcion", "Bogota", "Medellin", "Lima", "Buenos Aires"] | |
| CITIES_EN = ["New York", "Los Angeles", "Chicago", "Houston", "Phoenix"] | |
| DEVICES = ["iPhone", "Samsung Galaxy", "Huawei", "PC Windows", "Mac"] | |
| LOCATIONS_ES = ["Colombia", "Argentina", "Peru", "Chile", "Mexico", "Espana", "Berlin", "Paris", "Tokyo", "Londres", "Rusia", "China", "Italia", "Canada", "Australia"] | |
| LOCATIONS_EN = ["USA", "Mexico", "Brazil", "Spain", "Colombia", "Berlin", "Paris", "Tokyo", "Russia", "China", "Italy", "Canada", "Australia", "India", "Nigeria"] | |
| DISCOUNTS = [10, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70] | |
| PRODUCTS_ES = ["ropa", "electrodomesticos", "calzado", "tecnologia", "muebles", "perfumes", "deportes", "libros"] | |
| PRODUCTS_EN = ["clothing", "electronics", "shoes", "furniture", "perfumes", "sports gear", "books"] | |
| def amount_es(): | |
| return f"${random.randint(1, 500) * 1000:,}".replace(",", ".") | |
| def amount_small_es(): | |
| return f"${random.randint(500, 9990)}" | |
| def amount_en(): | |
| return f"${random.randint(5, 3000)}" | |
| def order_num(): | |
| return f"#{random.randint(10000, 99999)}" | |
| def ticket_num(): | |
| return f"#{random.randint(1000, 9999)}" | |
| def code(): | |
| return str(random.randint(100000, 999999)) | |
| def card_last(): | |
| return str(random.randint(1000, 9999)) | |
| def hours(): | |
| return random.randint(1, 48) | |
| def pct(): | |
| return random.choice(DISCOUNTS) | |
| # ── Templates ──────────────────────────────────────────────────────────────── | |
| TEMPLATES = { | |
| "transaction": [ | |
| # Spanish | |
| lambda: f"debito automatico de {amount_es()} procesado en tu cuenta", | |
| lambda: f"compra aprobada por {amount_es()} en {random.choice(STORES_ES)}", | |
| lambda: f"transferencia exitosa de {amount_es()} a cuenta terminada en {card_last()}", | |
| lambda: f"pago de {amount_es()} a {random.choice(STORES_ES)} completado", | |
| lambda: f"retiro de {amount_es()} en cajero automatico fue exitoso", | |
| lambda: f"cargo de {amount_small_es()} aplicado a tu tarjeta terminada en {card_last()}", | |
| lambda: f"recibiste una transferencia de {amount_es()} en tu cuenta", | |
| lambda: f"tu compra de {amount_es()} en {random.choice(STORES_ES)} fue autorizada", | |
| lambda: f"pago de servicios por {amount_small_es()} completado exitosamente", | |
| lambda: f"suscripcion mensual de {amount_small_es()} cobrada a tarjeta {card_last()}", | |
| lambda: f"se debito {amount_es()} de tu cuenta corriente terminada en {card_last()}", | |
| lambda: f"pago exitoso de {amount_small_es()} en comercio {random.choice(STORES_ES)}", | |
| lambda: f"realizaste una compra de {amount_es()} con tu tarjeta de credito", | |
| lambda: f"abono de {amount_es()} recibido en tu cuenta de ahorros", | |
| lambda: f"tu pago de {amount_es()} en {random.choice(STORES_ES)} fue confirmado", | |
| lambda: f"pagaste {amount_es()} en {random.choice(STORES_ES)}", | |
| lambda: f"transaccion de {amount_es()} aprobada en {random.choice(STORES_ES)}", | |
| lambda: f"tu tarjeta fue usada por {amount_es()} en {random.choice(STORES_ES)}", | |
| lambda: f"operacion bancaria: debito de {amount_es()} procesado correctamente", | |
| lambda: f"confirmacion: pago de {amount_small_es()} realizado con exito en {random.choice(STORES_ES)}", | |
| lambda: f"se acredito {amount_es()} en tu cuenta", | |
| lambda: f"cargo exitoso de {amount_small_es()} a tarjeta terminada en {card_last()}", | |
| lambda: f"tu compra en {random.choice(STORES_ES)} por {amount_es()} fue procesada", | |
| # English | |
| lambda: f"debit of {amount_en()} processed on your account", | |
| lambda: f"purchase of {amount_en()} approved at {random.choice(STORES_EN)}", | |
| lambda: f"transfer of {amount_en()} to account ending in {card_last()} completed", | |
| lambda: f"payment of {amount_en()} to {random.choice(STORES_EN)} confirmed", | |
| lambda: f"atm withdrawal of {amount_en()} was successful", | |
| lambda: f"your card ending in {card_last()} was charged {amount_en()} at {random.choice(STORES_EN)}", | |
| lambda: f"you received a transfer of {amount_en()} to your account", | |
| lambda: f"monthly subscription of {amount_en()} charged to card {card_last()}", | |
| lambda: f"transaction of {amount_en()} at {random.choice(STORES_EN)} approved", | |
| lambda: f"your {amount_en()} payment to {random.choice(STORES_EN)} was processed", | |
| lambda: f"you spent {amount_en()} at {random.choice(STORES_EN)}", | |
| lambda: f"card transaction: {amount_en()} debited from your account", | |
| lambda: f"successful transfer of {amount_en()} to account {card_last()}", | |
| lambda: f"your purchase of {amount_en()} at {random.choice(STORES_EN)} is confirmed", | |
| ], | |
| "otp_verification": [ | |
| # Spanish | |
| lambda: f"tu codigo otp es {code()}. no lo compartas con nadie", | |
| lambda: f"codigo de verificacion: {code()}. valido por 5 minutos", | |
| lambda: f"ingresa {code()} para confirmar tu acceso", | |
| lambda: f"usa {code()} para verificar tu identidad en nuestra app", | |
| lambda: f"tu codigo de seguridad es {code()}. expira en 10 minutos", | |
| lambda: f"{code()} es tu clave temporal de ingreso. no la compartas", | |
| lambda: f"codigo de autenticacion: {code()}. si no fuiste tu, ignora este mensaje", | |
| lambda: f"para continuar ingresa el codigo {code()} en la aplicacion", | |
| lambda: f"tu pin de un solo uso es {code()}. valido solo por esta sesion", | |
| lambda: f"verificacion en 2 pasos: usa el codigo {code()}", | |
| lambda: f"codigo de acceso: {code()}. caduca en 3 minutos", | |
| lambda: f"confirmacion de identidad requerida. tu codigo: {code()}", | |
| lambda: f"tu token de verificacion es {code()}. no lo reenvies", | |
| lambda: f"para recuperar tu contrasena usa el codigo {code()}", | |
| lambda: f"codigo de confirmacion de transaccion: {code()}", | |
| lambda: f"clave de un solo uso: {code()}. expira en 2 minutos", | |
| lambda: f"autenticacion de dos factores: {code()} es tu codigo", | |
| lambda: f"no compartas este codigo: {code()}. nadie te lo pedira", | |
| lambda: f"tu verificacion telefonica: {code()}", | |
| lambda: f"codigo temporal {code()} para completar tu registro", | |
| # English | |
| lambda: f"your otp code is {code()}. do not share it with anyone", | |
| lambda: f"verification code: {code()}. valid for 5 minutes", | |
| lambda: f"enter {code()} to confirm your access", | |
| lambda: f"use {code()} to verify your identity in our app", | |
| lambda: f"your security code is {code()}. expires in 10 minutes", | |
| lambda: f"{code()} is your one-time password. keep it safe", | |
| lambda: f"authentication code: {code()}. if this was not you, ignore this message", | |
| lambda: f"2-step verification: use code {code()}", | |
| lambda: f"your access token is {code()}. expires in 3 minutes", | |
| lambda: f"transaction confirmation code: {code()}. do not share it", | |
| lambda: f"one-time pin: {code()}. valid for this session only", | |
| lambda: f"two-factor authentication code: {code()}", | |
| lambda: f"never share this code: {code()}. we will never ask for it", | |
| lambda: f"your login verification code is {code()}", | |
| lambda: f"complete your sign-in with code {code()}", | |
| ], | |
| "promotion_offer": [ | |
| # Spanish | |
| lambda: f"{pct()}% de descuento en {random.choice(PRODUCTS_ES)} solo por hoy en {random.choice(STORES_ES)}", | |
| lambda: f"aprovecha {pct()}% off en toda la tienda {random.choice(STORES_ES)} este fin de semana", | |
| lambda: f"oferta exclusiva: {pct()}% de rebaja en tu proxima compra en {random.choice(STORES_ES)}", | |
| lambda: f"tienes un cupon de {pct()}% dcto valido hasta el {random.randint(1,28)}/{random.randint(1,12)}", | |
| lambda: f"2x1 en {random.choice(PRODUCTS_ES)} en {random.choice(STORES_ES)}. solo hoy!", | |
| lambda: f"descuento especial del {pct()}% para clientes frecuentes de {random.choice(STORES_ES)}", | |
| lambda: f"ultimas horas: {pct()}% de descuento en {random.choice(PRODUCTS_ES)}. no te lo pierdas", | |
| lambda: f"tu cashback de {amount_small_es()} esta disponible para usar en {random.choice(STORES_ES)}", | |
| lambda: f"acumula puntos dobles este fin de semana en {random.choice(STORES_ES)}", | |
| lambda: f"oferta flash: {pct()}% off en {random.choice(PRODUCTS_ES)} por las proximas 24 horas", | |
| lambda: f"comprando {amount_es()} o mas en {random.choice(STORES_ES)} obtenes {pct()}% de descuento", | |
| lambda: f"promo especial: lleva 3 y paga 2 en {random.choice(PRODUCTS_ES)}", | |
| lambda: f"liquidacion de {random.choice(PRODUCTS_ES)}: hasta {pct()}% de descuento en {random.choice(STORES_ES)}", | |
| lambda: f"envio gratis en tu proxima compra en {random.choice(STORES_ES)}. valido esta semana", | |
| lambda: f"regalo de {amount_small_es()} en puntos por tu compra en {random.choice(STORES_ES)}", | |
| lambda: f"rebaja de {pct()}% en {random.choice(PRODUCTS_ES)} en {random.choice(STORES_ES)} solo este mes", | |
| lambda: f"oferta de temporada: {pct()}% menos en {random.choice(PRODUCTS_ES)}", | |
| lambda: f"promocion exclusiva: {pct()}% de descuento en tu siguiente compra en {random.choice(STORES_ES)}", | |
| lambda: f"sale: todos los {random.choice(PRODUCTS_ES)} a {pct()}% de descuento en {random.choice(STORES_ES)}", | |
| lambda: f"aprovecha nuestra promo: 3x2 en {random.choice(PRODUCTS_ES)} hasta agotar stock", | |
| # English | |
| lambda: f"{pct()}% off on {random.choice(PRODUCTS_EN)} only today at {random.choice(STORES_EN)}", | |
| lambda: f"exclusive offer: {pct()}% discount on your next purchase at {random.choice(STORES_EN)}", | |
| lambda: f"flash sale: {pct()}% off {random.choice(PRODUCTS_EN)} for the next 24 hours", | |
| lambda: f"your {amount_en()} cashback is ready to use at {random.choice(STORES_EN)}", | |
| lambda: f"double points this weekend at {random.choice(STORES_EN)}", | |
| lambda: f"buy 2 get 1 free on {random.choice(PRODUCTS_EN)} at {random.choice(STORES_EN)}", | |
| lambda: f"limited time: {pct()}% off {random.choice(PRODUCTS_EN)} ends tonight", | |
| lambda: f"free shipping on orders over {amount_en()} at {random.choice(STORES_EN)}", | |
| lambda: f"members only: {pct()}% discount at {random.choice(STORES_EN)} this week", | |
| lambda: f"clearance sale: up to {pct()}% off {random.choice(PRODUCTS_EN)} at {random.choice(STORES_EN)}", | |
| lambda: f"seasonal promo: {pct()}% off all {random.choice(PRODUCTS_EN)} at {random.choice(STORES_EN)}", | |
| lambda: f"special deal: buy one get one {pct()}% off at {random.choice(STORES_EN)}", | |
| lambda: f"weekend offer: {pct()}% discount on {random.choice(PRODUCTS_EN)} at {random.choice(STORES_EN)}", | |
| ], | |
| "security_alert": [ | |
| # Spanish | |
| lambda: f"detectamos un inicio de sesion inusual desde {random.choice(LOCATIONS_ES)}. fuiste tu?", | |
| lambda: f"nuevo dispositivo {random.choice(DEVICES)} accedio a tu cuenta. si no fuiste tu cambia tu contrasena ya", | |
| lambda: f"intento de acceso fallido {random.randint(2,5)} veces en tu cuenta. la bloqueamos por seguridad", | |
| lambda: f"alerta: cambio de contrasena realizado. si no lo hiciste contactanos de inmediato", | |
| lambda: f"actividad sospechosa detectada en tu cuenta. accede y revisa tus movimientos", | |
| lambda: f"compra de {amount_es()} en {random.choice(STORES_ES)} fue marcada como sospechosa. la rechazamos?", | |
| lambda: f"tu sesion fue cerrada por seguridad desde ip desconocida. ingresa nuevamente", | |
| lambda: f"alerta: acceso desde {random.choice(LOCATIONS_ES)} detectado en tu cuenta", | |
| lambda: f"contrasena incorrecta ingresada {random.randint(3,5)} veces. cuenta bloqueada temporalmente", | |
| lambda: f"se agrego un nuevo metodo de pago a tu cuenta. si no fuiste tu actua de inmediato", | |
| lambda: f"alerta de seguridad: tu correo asociado fue cambiado. si no fuiste tu contactanos", | |
| lambda: f"detectamos un intento de phishing en tu cuenta. no compartas tus datos", | |
| lambda: f"tu cuenta fue accedida desde {random.choice(DEVICES)} no reconocido. revisa ahora", | |
| lambda: f"transferencia inusual de {amount_es()} fue bloqueada. confirma si la autorizas", | |
| lambda: f"verificacion requerida: acceso sospechoso desde {random.choice(LOCATIONS_ES)}", | |
| lambda: f"detectamos un acceso desde {random.choice(LOCATIONS_ES)}. si no fuiste tu bloquea tu cuenta", | |
| lambda: f"alguien ingreso a tu cuenta desde {random.choice(LOCATIONS_ES)} a las {random.randint(0,23)}:{random.choice(['00','15','30','45'])}", | |
| lambda: f"inicio de sesion desde {random.choice(LOCATIONS_ES)} en tu cuenta. reconoces este acceso?", | |
| lambda: f"acceso no reconocido desde {random.choice(LOCATIONS_ES)} a las {random.randint(0,23)}h. cambia tu contrasena", | |
| lambda: f"alerta: login desde {random.choice(LOCATIONS_ES)} registrado. si no fuiste tu actua ahora", | |
| # English | |
| lambda: f"unusual login detected from {random.choice(LOCATIONS_EN)}. was this you?", | |
| lambda: f"new device {random.choice(DEVICES)} accessed your account. if this was not you, change your password now", | |
| lambda: f"failed login attempt {random.randint(2,5)} times. your account has been locked", | |
| lambda: f"alert: password was changed. if you did not do this, contact us immediately", | |
| lambda: f"suspicious activity detected on your account. please review your recent activity", | |
| lambda: f"purchase of {amount_en()} at {random.choice(STORES_EN)} flagged as suspicious. was this you?", | |
| lambda: f"your session was closed due to suspicious activity. please log in again", | |
| lambda: f"security alert: access from {random.choice(LOCATIONS_EN)} detected on your account", | |
| lambda: f"wrong password entered {random.randint(3,5)} times. account temporarily locked", | |
| lambda: f"a new payment method was added to your account. if this was not you, act now", | |
| lambda: f"we detected access from {random.choice(LOCATIONS_EN)} at {random.randint(0,23)}:{random.choice(['00','15','30','45'])}. was this you?", | |
| lambda: f"someone logged into your account from {random.choice(LOCATIONS_EN)}. do you recognize this?", | |
| lambda: f"login from {random.choice(LOCATIONS_EN)} detected. if this was not you, secure your account now", | |
| lambda: f"unauthorized access attempt from {random.choice(LOCATIONS_EN)}. your account may be at risk", | |
| lambda: f"alert: sign in from {random.choice(LOCATIONS_EN)} at {random.randint(0,23)}h. not you? change password", | |
| ], | |
| "delivery_logistics": [ | |
| # Spanish | |
| lambda: f"tu pedido {order_num()} esta en camino. llega hoy entre {random.choice(TIMES)} y {random.choice(TIMES)}", | |
| lambda: f"paquete {order_num()} fue despachado desde {random.choice(CITIES_ES)}. llega en {random.randint(1,5)} dias habiles", | |
| lambda: f"entrega programada para manana entre {random.choice(TIMES)} y {random.choice(TIMES)}. alguien debe estar en casa", | |
| lambda: f"tu pedido llego al centro de distribucion de {random.choice(CITIES_ES)}", | |
| lambda: f"el repartidor esta a {random.randint(2,15)} paradas de tu direccion. prepara tu entrega", | |
| lambda: f"intento de entrega fallido para pedido {order_num()}. reagenda en nuestra app", | |
| lambda: f"tu paquete {order_num()} esta disponible para retiro en sucursal {random.choice(CITIES_ES)}", | |
| lambda: f"pedido {order_num()} entregado exitosamente. como fue tu experiencia?", | |
| lambda: f"pedido {order_num()} retrasado por clima. nueva fecha estimada: manana", | |
| lambda: f"tu compra de {random.choice(STORES_ES)} salio del almacen y va en camino", | |
| lambda: f"seguimiento actualizado: tu paquete {order_num()} esta en aduana", | |
| lambda: f"tu envio {order_num()} de {random.choice(STORES_ES)} fue confirmado y esta en preparacion", | |
| lambda: f"segundo intento de entrega para {order_num()} sera manana a las {random.choice(TIMES)}", | |
| lambda: f"tu pedido {order_num()} llega manana. descarga la app para seguirlo en tiempo real", | |
| lambda: f"paquete {order_num()} en camino. firma requerida en la entrega", | |
| lambda: f"tu envio salio del deposito. numero de seguimiento: {order_num()}", | |
| lambda: f"entrega exitosa del pedido {order_num()}. recibiste tu paquete?", | |
| lambda: f"tu pedido {order_num()} esta siendo preparado para despacho", | |
| lambda: f"aviso de despacho: paquete {order_num()} en camino desde {random.choice(CITIES_ES)}", | |
| lambda: f"no habia nadie en casa. reprogramamos la entrega de {order_num()} para manana", | |
| # English | |
| lambda: f"your order {order_num()} is on its way. arrives today between {random.choice(TIMES)} and {random.choice(TIMES)}", | |
| lambda: f"package {order_num()} was shipped from {random.choice(CITIES_EN)}. arrives in {random.randint(1,5)} business days", | |
| lambda: f"delivery scheduled for tomorrow between {random.choice(TIMES)} and {random.choice(TIMES)}", | |
| lambda: f"your order reached the {random.choice(CITIES_EN)} distribution center", | |
| lambda: f"your driver is {random.randint(2,15)} stops away. get ready for your delivery", | |
| lambda: f"delivery attempt failed for order {order_num()}. reschedule in our app", | |
| lambda: f"order {order_num()} delivered successfully. how was your experience?", | |
| lambda: f"order {order_num()} delayed due to weather. new estimate: tomorrow", | |
| lambda: f"your {random.choice(STORES_EN)} purchase has left the warehouse", | |
| lambda: f"package {order_num()} is out for delivery. signature required", | |
| lambda: f"shipment {order_num()} is now in transit from {random.choice(CITIES_EN)}", | |
| lambda: f"we could not deliver your package {order_num()} today. rescheduling for tomorrow", | |
| lambda: f"tracking update: your parcel {order_num()} is at the sorting facility", | |
| ], | |
| "appointment_reminder": [ | |
| # Spanish | |
| lambda: f"recordatorio: tienes cita {random.choice(SPECIALTIES_ES)} el {random.choice(DAYS_ES)} a las {random.choice(TIMES)}", | |
| lambda: f"confirmacion de cita medica: {random.choice(DAYS_ES)} {random.randint(1,28)}/{random.randint(1,12)} a las {random.choice(TIMES)}", | |
| lambda: f"tu turno {random.choice(SPECIALTIES_ES)} es manana a las {random.choice(TIMES)}. no faltes", | |
| lambda: f"cita medica agendada para el {random.randint(1,28)}/{random.randint(1,12)} a las {random.choice(TIMES)} en clinica central", | |
| lambda: f"recuerda tu consulta medica manana a las {random.choice(TIMES)} en policlinico norte", | |
| lambda: f"tu cita en la clinica es en 24 horas, a las {random.choice(TIMES)}. lleva tu carnet", | |
| lambda: f"para cancelar tu cita {random.choice(SPECIALTIES_ES)} del {random.choice(DAYS_ES)} responde CANCELAR", | |
| lambda: f"confirmamos tu cita medica para el {random.randint(1,28)}/{random.randint(1,12)} a las {random.choice(TIMES)}", | |
| lambda: f"recordatorio de cita {random.choice(SPECIALTIES_ES)}: {random.choice(DAYS_ES)} a las {random.choice(TIMES)}", | |
| lambda: f"tu reserva en clinica dental es manana {random.randint(1,28)}/{random.randint(1,12)} a las {random.choice(TIMES)}", | |
| lambda: f"tienes una consulta medica programada para manana. presentate en recepcion a las {random.choice(TIMES)}", | |
| lambda: f"te esperamos el {random.choice(DAYS_ES)} a las {random.choice(TIMES)} para tu control medico. trae resultados previos", | |
| lambda: f"aviso: tu hora {random.choice(SPECIALTIES_ES)} fue confirmada para el {random.randint(1,28)}/{random.randint(1,12)}", | |
| lambda: f"recordatorio: manana tienes cita con el doctor a las {random.choice(TIMES)}. llega 10 min antes", | |
| lambda: f"tu cita {random.choice(SPECIALTIES_ES)} fue reagendada para el {random.choice(DAYS_ES)}. confirma respondiendo SI", | |
| lambda: f"clinica central: tu consulta del {random.randint(1,28)}/{random.randint(1,12)} esta confirmada", | |
| lambda: f"no olvides tu cita con el medico el {random.choice(DAYS_ES)} a las {random.choice(TIMES)}", | |
| lambda: f"hospital norte: recordatorio de tu turno {random.choice(SPECIALTIES_ES)} manana", | |
| # English | |
| lambda: f"reminder: you have a {random.choice(SPECIALTIES_EN)} appointment on {random.choice(DAYS_EN)} at {random.choice(TIMES)}", | |
| lambda: f"your {random.choice(SPECIALTIES_EN)} appointment is confirmed for {random.randint(1,28)}/{random.randint(1,12)} at central clinic", | |
| lambda: f"your {random.choice(SPECIALTIES_EN)} appointment is tomorrow at {random.choice(TIMES)}. please do not miss it", | |
| lambda: f"to cancel your {random.choice(SPECIALTIES_EN)} appointment on {random.choice(DAYS_EN)}, reply CANCEL", | |
| lambda: f"your dental clinic appointment is scheduled for tomorrow at {random.choice(TIMES)}", | |
| lambda: f"we confirm your medical appointment for {random.randint(1,28)}/{random.randint(1,12)}. bring your id", | |
| lambda: f"appointment reminder: {random.choice(SPECIALTIES_EN)} checkup on {random.choice(DAYS_EN)}. please arrive 10 minutes early", | |
| lambda: f"your doctor appointment has been rescheduled to {random.choice(DAYS_EN)} at {random.choice(TIMES)}", | |
| lambda: f"see you on {random.choice(DAYS_EN)} at {random.choice(TIMES)} for your {random.choice(SPECIALTIES_EN)} visit", | |
| lambda: f"please confirm your medical appointment for tomorrow by replying YES", | |
| lambda: f"health clinic: your {random.choice(SPECIALTIES_EN)} checkup is confirmed for {random.choice(DAYS_EN)}", | |
| lambda: f"do not forget your doctor appointment on {random.choice(DAYS_EN)} at {random.choice(TIMES)}", | |
| ], | |
| "customer_service": [ | |
| # Spanish | |
| lambda: f"tu caso {ticket_num()} fue asignado a un agente. tiempo estimado: {hours()} horas", | |
| lambda: f"tu solicitud ha sido recibida. te contactaremos en {random.randint(1,5)} dias habiles", | |
| lambda: f"gracias por contactarnos. tu ticket {ticket_num()} esta en proceso", | |
| lambda: f"tu devolucion de {amount_small_es()} fue aprobada. acreditaremos en {random.randint(3,10)} dias habiles", | |
| lambda: f"resolvimos tu caso {ticket_num()}. como calificarias la atencion?", | |
| lambda: f"un agente te contactara en los proximos {random.randint(10,60)} minutos", | |
| lambda: f"tu reclamo {ticket_num()} fue escalado a nivel 2. te informaremos pronto", | |
| lambda: f"actualizamos tu ticket {ticket_num()} con nueva informacion. revisa tu email", | |
| lambda: f"tu contrato fue renovado exitosamente hasta {random.randint(1,12)}/{random.randint(2025,2026)}", | |
| lambda: f"encuesta: como fue tu experiencia con nuestro servicio al cliente?", | |
| lambda: f"tu solicitud de cambio de plan fue procesada exitosamente", | |
| lambda: f"hemos recibido tu pago. tu servicio fue reactivado", | |
| lambda: f"tu caso esta siendo revisado por nuestro equipo. respuesta en {random.randint(1,72)} horas", | |
| lambda: f"cerramos tu ticket {ticket_num()} por resolucion exitosa. gracias por contactarnos", | |
| lambda: f"notificacion: tu solicitud {ticket_num()} paso a estado en revision", | |
| lambda: f"reembolso de {amount_small_es()} procesado. veras el credito en {random.randint(3,7)} dias", | |
| lambda: f"tu queja fue registrada bajo el numero {ticket_num()}. te responderemos pronto", | |
| lambda: f"soporte tecnico: tu incidencia {ticket_num()} esta siendo atendida", | |
| lambda: f"tu solicitud de baja fue recibida. procesaremos en {random.randint(1,5)} dias habiles", | |
| lambda: f"actualizacion de tu caso {ticket_num()}: en revision por equipo especializado", | |
| # English | |
| lambda: f"your case {ticket_num()} has been assigned to an agent. estimated time: {hours()} hours", | |
| lambda: f"your request has been received. we will contact you within {random.randint(1,5)} business days", | |
| lambda: f"thank you for contacting us. your ticket {ticket_num()} is being processed", | |
| lambda: f"your refund of {amount_en()} has been approved. it will be credited in {random.randint(3,10)} business days", | |
| lambda: f"we resolved your case {ticket_num()}. how would you rate our service?", | |
| lambda: f"an agent will contact you within the next {random.randint(10,60)} minutes", | |
| lambda: f"your complaint {ticket_num()} has been escalated to level 2. we will keep you updated", | |
| lambda: f"we updated your ticket {ticket_num()} with new information. check your email", | |
| lambda: f"your plan change request has been processed successfully", | |
| lambda: f"survey: how was your experience with our customer service team?", | |
| lambda: f"your cancellation request {ticket_num()} has been received and is being processed", | |
| lambda: f"support ticket {ticket_num()} opened. our team will respond within {hours()} hours", | |
| lambda: f"your refund request is under review. we will notify you within {random.randint(1,5)} business days", | |
| ], | |
| "billing_reminder": [ | |
| # Spanish | |
| lambda: f"tienes una factura pendiente de {amount_small_es()}. paga antes del {random.randint(1,28)}/{random.randint(1,12)} para evitar recargos", | |
| lambda: f"recordatorio: tu pago de {amount_small_es()} vence manana. evita penalidades", | |
| lambda: f"tu factura del mes esta disponible. monto a pagar: {amount_small_es()}", | |
| lambda: f"aviso de cobro: debes {amount_small_es()} con vencimiento el {random.randint(1,28)}/{random.randint(1,12)}", | |
| lambda: f"paga tu servicio antes del {random.randint(1,28)} para evitar la suspension", | |
| lambda: f"tu cuenta tiene un saldo pendiente de {amount_small_es()}. regulariza tu situacion", | |
| lambda: f"ultimo aviso: factura de {amount_small_es()} vence hoy. paga ahora para evitar corte", | |
| lambda: f"recordatorio de pago: {amount_small_es()} con vencimiento el {random.randint(1,28)}/{random.randint(1,12)}", | |
| lambda: f"tu plan vence en {random.randint(1,7)} dias. renueva para no perder el servicio", | |
| lambda: f"deuda pendiente de {amount_small_es()}. paga antes del {random.randint(1,28)} para evitar intereses", | |
| lambda: f"factura mensual generada por {amount_small_es()}. fecha limite de pago: {random.randint(1,28)}/{random.randint(1,12)}", | |
| lambda: f"tu servicio sera suspendido en {random.randint(1,5)} dias por falta de pago. regulariza ya", | |
| lambda: f"aviso: tienes {random.randint(1,3)} facturas sin pagar. total adeudado: {amount_small_es()}", | |
| lambda: f"paga tu factura hoy y evita penalidades. monto: {amount_small_es()}", | |
| lambda: f"recordatorio: el debito automatico de {amount_small_es()} se ejecutara el {random.randint(1,28)}/{random.randint(1,12)}", | |
| lambda: f"tu suscripcion de {amount_small_es()} se renueva en {random.randint(1,7)} dias", | |
| lambda: f"segundo aviso: factura vencida de {amount_small_es()}. evita el corte del servicio", | |
| lambda: f"notificacion de cobro: se intentara debitar {amount_small_es()} de tu cuenta el {random.randint(1,28)}/{random.randint(1,12)}", | |
| # English | |
| lambda: f"your bill of {amount_en()} is due on {random.randint(1,28)}/{random.randint(1,12)}. pay now to avoid penalties", | |
| lambda: f"reminder: your payment of {amount_en()} is due tomorrow. avoid late fees", | |
| lambda: f"your monthly invoice is ready. amount due: {amount_en()}", | |
| lambda: f"payment notice: you owe {amount_en()} due on {random.randint(1,28)}/{random.randint(1,12)}", | |
| lambda: f"pay your bill today and avoid penalties", | |
| lambda: f"your account has an outstanding balance of {amount_en()}. please settle it", | |
| lambda: f"final notice: invoice of {amount_en()} due today. pay now to avoid service interruption", | |
| lambda: f"your subscription of {amount_en()} renews in {random.randint(1,7)} days", | |
| lambda: f"overdue balance: {amount_en()}. pay before {random.randint(1,28)}/{random.randint(1,12)} to avoid interest", | |
| lambda: f"your service will be suspended in {random.randint(1,5)} days due to non-payment", | |
| lambda: f"payment reminder: {amount_en()} due on {random.randint(1,28)}/{random.randint(1,12)}", | |
| lambda: f"second notice: overdue invoice of {amount_en()}. avoid service interruption", | |
| ], | |
| "spam_advertising": [ | |
| # Spanish | |
| lambda: f"felicitaciones! ganaste un premio de {amount_es()}. llama ahora al {random.randint(300,399)}-{random.randint(1000000,9999999)}", | |
| lambda: f"gana {amount_es()} desde casa. sin experiencia necesaria. registrate ya!", | |
| lambda: f"oferta unica! accede ahora antes de que expire: bit.ly/{random.randint(10000,99999)}", | |
| lambda: f"invierte {amount_small_es()} hoy y gana {amount_es()} en 48 horas garantizado", | |
| lambda: f"eres el ganador seleccionado de {amount_es()}! reclama tu premio antes de manana", | |
| lambda: f"trabajo desde casa ganando {amount_es()} al mes. cupos limitados! entra ya", | |
| lambda: f"promo exclusiva solo para ti! no te lo pierdas: www.oferta{random.randint(1,999)}.com", | |
| lambda: f"alerta! tu cuenta tiene un bono de {amount_small_es()} pendiente. activalo en 24h", | |
| lambda: f"replica este metodo secreto y gana {amount_es()} sin salir de casa. mira como", | |
| lambda: f"te regalamos {amount_small_es()} en creditos. canjealos antes de que expiren hoy", | |
| lambda: f"sistema automatico de ganancias! genera {amount_es()} mientras duermes", | |
| lambda: f"urgente: ultimo cupo para ganar {amount_es()}. llama ahora al {random.randint(300,399)}-{random.randint(1000000,9999999)}", | |
| lambda: f"has sido preseleccionado para ganar {amount_es()}. confirma tus datos ya", | |
| lambda: f"oferta de inversion: duplica tu dinero en {random.randint(7,30)} dias. 100% garantizado", | |
| lambda: f"gana puntos canjeables por {amount_es()}. solo hoy! ingresa tu numero", | |
| lambda: f"haz clic aqui y reclama tu regalo de {amount_es()}: www.premio{random.randint(1,999)}.com", | |
| lambda: f"eres uno de los {random.randint(5,20)} ganadores seleccionados. actua ahora!", | |
| lambda: f"metodo probado para ganar {amount_es()} por semana. sin inversion inicial", | |
| lambda: f"tu numero fue sorteado! llama gratis al {random.randint(300,399)}-{random.randint(1000000,9999999)} para reclamar", | |
| lambda: f"consigue {amount_es()} adicionales al mes trabajando solo {random.randint(1,4)} horas al dia", | |
| # English | |
| lambda: f"congratulations! you won {amount_en()}. call now {random.randint(300,399)}-{random.randint(1000000,9999999)}", | |
| lambda: f"earn {amount_en()} from home. no experience needed. sign up now!", | |
| lambda: f"exclusive offer just for you! do not miss it: bit.ly/{random.randint(10000,99999)}", | |
| lambda: f"invest {amount_en()} today and earn {amount_en()} in 48 hours guaranteed", | |
| lambda: f"you have been selected to win {amount_en()}! claim your prize before tomorrow", | |
| lambda: f"work from home earning {amount_en()} per month. limited spots! join now", | |
| lambda: f"secret method to earn {amount_en()} without leaving home. see how", | |
| lambda: f"alert! you have a pending bonus of {amount_en()}. activate it within 24h", | |
| lambda: f"automated profit system! generate {amount_en()} while you sleep", | |
| lambda: f"urgent: last spot to win {amount_en()}. call now {random.randint(300,399)}-{random.randint(1000000,9999999)}", | |
| lambda: f"click here to claim your {amount_en()} reward: www.prize{random.randint(1,999)}.com", | |
| lambda: f"you are one of {random.randint(5,20)} winners selected. act now!", | |
| lambda: f"proven method to earn {amount_en()} per week. no upfront investment", | |
| lambda: f"your number was drawn! call free {random.randint(300,399)}-{random.randint(1000000,9999999)} to claim", | |
| ], | |
| } | |
| EXAMPLES_PER_CATEGORY = 350 | |
| def generate(): | |
| rows = [] | |
| for label, templates in TEMPLATES.items(): | |
| for _ in range(EXAMPLES_PER_CATEGORY): | |
| fn = random.choice(templates) | |
| rows.append({"text": fn(), "category": label}) | |
| random.shuffle(rows) | |
| output_path = Path(__file__).parent / "data" / "sms_dataset.csv" | |
| output_path.parent.mkdir(exist_ok=True) | |
| with open(output_path, "w", newline="", encoding="utf-8") as f: | |
| writer = csv.DictWriter(f, fieldnames=["text", "category"]) | |
| writer.writeheader() | |
| writer.writerows(rows) | |
| print(f"Dataset generado: {output_path}") | |
| print(f"Total ejemplos: {len(rows)}") | |
| for label in TEMPLATES: | |
| count = sum(1 for r in rows if r["category"] == label) | |
| print(f" {label}: {count}") | |
| if __name__ == "__main__": | |
| generate() | |