File size: 8,550 Bytes
23695db
e9b12f1
 
8adc9f0
2d5b85b
 
 
 
 
46c87b5
2d5b85b
3a16a85
2d5b85b
7e8fd71
6b8fb54
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2d5b85b
e9b12f1
8adc9f0
6b8fb54
46c87b5
2d5b85b
3990686
2d5b85b
 
13b5a7b
 
 
2d5b85b
e9b12f1
13b5a7b
2d5b85b
13b5a7b
 
 
 
e9b12f1
13b5a7b
 
6b8fb54
13b5a7b
 
 
6b8fb54
 
 
 
13b5a7b
 
6b8fb54
 
b8eb3fb
6b8fb54
e9b12f1
6b8fb54
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
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()