Valer-IA-1.0 / app.py
DanielRN's picture
Update app.py
b8eb3fb verified
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()