Spaces:
Runtime error
Runtime error
| 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() | |