import gradio as gr import re # Cargar el archivo de alojamientos en memoria def cargar_alojamientos(filename="alojamientos.txt"): try: with open(filename, "r", encoding="utf-8") as file: return [bloque.strip() for bloque in file.read().split("\n\n") if bloque.strip()] except FileNotFoundError: print(f"Error: El archivo {filename} no se encontró.") return [] alojamientos = cargar_alojamientos() # Diccionario de sinónimos para términos generales relacionados con "alojamiento" sinonimos = { "alquiler": "alojamiento", "casa": "alojamiento", "departamento": "alojamiento", "apartamento": "alojamiento", "hospedaje": "alojamiento", "alojamiento": "alojamiento", "habitaciones": "alojamiento", "bungalow": "alojamiento" } # Diccionario de sinónimos para servicios y características de los alojamientos sinonimos_servicios = { "wifi": ["wifi", "internet", "conexión a internet", "red inalámbrica", "wifi gratis", "internet inalámbrico"], "directv": ["directv", "tv por cable", "televisión por satélite", "televisión digital"], "ropa blanca (cama)": ["ropa blanca", "sábanas", "fundas de almohada", "ropa de cama"], "ropa blanca (baño)": ["toallas", "toallones", "ropa de baño", "toallas de baño", "toalla"], "mascotas": ["mascotas", "animales permitidos", "animales de compañía", "admite mascotas", "perros permitidos", "gatos permitidos"], "habilitación provincial": ["habilitación provincial", "registro provincial", "licencia provincial"], "gas natural": ["gas natural", "gas", "gas de red"], "estacionamiento": ["estacionamiento", "aparcar", "garaje", "parqueadero", "estacionamiento cubierto", "estacionamiento cerrado"], "parrilla": ["parrilla", "asador", "parrilla exterior", "parrilla compartida", "parrilla individual"], "quincho": ["quincho", "quincho con parrilla", "espacio para parrilla", "salón con parrilla"], "aire acondicionado": ["aire acondicionado", "ac", "aire frío/calor", "climatización", "aire", "aire acondicionado frío"], "ventiladores": ["ventiladores", "ventilador de pie", "ventilador de techo", "ventilador portátil"], "cámaras de seguridad": ["cámaras de seguridad", "cámaras de vigilancia", "sistema de cámaras", "circuito cerrado de televisión", "CCTV"], "alarma": ["alarma", "sistema de alarma", "alarma de seguridad", "alarma antirrobo"], "pileta recreativa": ["pileta", "piscina", "piscina recreativa", "alberca", "piscina exterior", "pileta climatizada"], "ducha exterior": ["ducha exterior", "ducha al aire libre", "ducha en jardín", "ducha exterior privada"], "lavarropas": ["lavarropas", "lavadora", "máquina de lavar", "lavadora automática"], "secarropas": ["secarropas", "secadora", "secadora de ropa"], "kit de baño": ["kit de baño", "set de baño", "kit de higiene personal", "set de higiene personal"], "desayuno seco": ["desayuno seco", "desayuno incluido", "desayuno de bienvenida", "desayuno de cortesía"], "cuna": ["cuna", "cuna para bebé", "cuna de viaje"], "practicuna": ["practicuna", "practicuna portátil"], "juegos de mesa": ["juegos de mesa", "juegos de tablero", "juegos de salón"], "reposeras": ["reposeras", "sillas de playa", "sillas reclinables", "sillas para sol"], "biblioteca": ["biblioteca", "librería", "zona de lectura"], "amigable con el medioambiente": ["amigable con el medioambiente", "eco-friendly", "sostenible", "ecológico"], "apto para discapacidad": ["apto para discapacidad", "accesible", "adaptado para discapacitados", "accesibilidad"], "caja de seguridad": ["caja de seguridad", "caja fuerte", "caja personal", "caja de seguridad en habitación"], "pack tv premium": ["pack tv premium", "paquete de tv premium", "televisión de pago", "paquete de canales premium"], "kit de costura": ["kit de costura", "set de costura", "set de reparación de ropa"], "kit facial": ["kit facial", "set de cuidado facial", "set de belleza"], "juegos de playa": ["juegos de playa", "juguetes de playa", "juegos para la arena"], "paravientos": ["paravientos", "pantalla para viento", "protección contra viento"], "tender para la ropa": ["tender para ropa", "tendedero", "tendedero para ropa"], "garaje": ["garaje", "cochera", "garaje cerrado", "garaje privado", "estacionamiento privado"], "patio cerrado": ["patio cerrado", "patio privado", "patio trasero"], "balcón con parrilla": ["balcón con parrilla", "balcón con asador", "balcón con espacio para parrilla"], "terraza compartida": ["terraza compartida", "terraza común", "terraza para uso común"], "entrada para auto": ["entrada para auto", "entrada de vehículos", "aparcamiento privado", "entrada para vehículos"], "rampa para discapacidad": ["rampa para discapacidad", "acceso para discapacitados", "acceso adaptado"], "patio parquizado": ["patio parquizado", "jardín cuidado", "patio con césped"], "pileta para lavar ropa": ["pileta para lavar ropa", "lavadero exterior", "pileta"], "lavadero": ["lavadero", "zona de lavandería", "lavandería"], "sala de estar con tv": ["sala de estar con tv", "salón con tv", "sala de entretenimiento"], "balcón privado": ["balcón privado", "balcón propio"], "terraza pequeña": ["terraza pequeña", "terraza privada"], "patio individual": ["patio individual", "patio privado"], "servicio de limpieza": ["servicio de limpieza", "limpieza diaria", "limpieza opcional"], "recambio de ropa blanca": ["recambio de ropa blanca", "cambio de sábanas", "cambio de toallas"], "servicio de lavandería": ["servicio de lavandería", "lavado de ropa", "lavado de prendas"], "servicio de desayuno": ["servicio de desayuno", "desayuno", "desayuno a la habitación"], "servicio de cena": ["servicio de cena", "cena incluida", "cena a la habitación"], "servicio de almuerzo": ["servicio de almuerzo", "almuerzo incluido", "almuerzo a la habitación"], "servicio de traslado": ["servicio de traslado", "transporte", "servicio de transporte"], "servicio de excursiones": ["servicio de excursiones", "excursiones", "tours guiados"], "servicio de masajes": ["servicio de masajes", "masajes", "tratamientos de spa"], "servicio de spa": ["servicio de spa", "spa", "bienestar"] } # Función para normalizar términos de la consulta, incluyendo servicios y características def normalizar_consulta(consulta): for palabra, sinonimos_lista in sinonimos_servicios.items(): for sinonimo in sinonimos_lista: consulta = consulta.replace(sinonimo, palabra) for palabra, sinonimo in sinonimos.items(): consulta = consulta.replace(palabra, sinonimo) return consulta # Búsqueda optimizada por palabras clave y plazas def buscar_alojamiento(consulta): consulta = consulta.lower() consulta = normalizar_consulta(consulta) # Normalizamos la consulta usando sinónimos match_plazas = re.search(r"(\d+)\s*(personas|plazas)", consulta) plazas = int(match_plazas.group(1)) if match_plazas else None resultados = [] for alojamiento in alojamientos: if (plazas is None or f"{plazas} personas" in alojamiento or f"para {plazas} personas" in alojamiento): if any(sinonimo in alojamiento for sinonimo in sinonimos_servicios.keys()): resultados.append(alojamiento) return resultados # Función para formatear la respuesta def formatear_respuesta(resultados): if resultados: return "\n\n".join(resultados) else: return "Lo siento, no encontré alojamientos que coincidan con tu búsqueda. 😔" # Interfaz gráfica con Gradio def buscar_entre_alojamientos(consulta, historial=""): resultados = buscar_alojamiento(consulta) respuesta = formatear_respuesta(resultados) historial += f"Pregunta: {consulta}\nRespuesta: {respuesta}\n\n" return historial, historial # Crear la interfaz de usuario iface = gr.Interface( fn=buscar_entre_alojamientos, inputs=[gr.Textbox(label="Pregunta", placeholder="Escribe tu consulta aquí...", lines=2)], outputs=[gr.Textbox(label="Respuestas", placeholder="Las respuestas aparecerán aquí...", lines=10)], title="Asistente de Alojamiento", description="Consulta sobre opciones de alojamiento con información sobre servicios y características disponibles.", layout="vertical" # Para poner el cuadro de preguntas debajo de las respuestas ) iface.launch()