import gradio as gr from transformers import pipeline # 1. Cargar un modelo de Análisis de Sentimiento/Clasificación de Texto # Lo usaremos para simular la clasificación de la "calidad" de la descripción. # Un sentimiento "positivo" alto correlacionará con una descripción de "lujo" o "alta calidad". try: # Usaremos un modelo de análisis de sentimiento text_classifier = pipeline("sentiment-analysis", model="finiteautomata/beto-sentiment-analysis") except Exception: print("Usando un modelo de clasificación de texto genérico (inglés).") # Fallback a un modelo genérico si el de español no está disponible text_classifier = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english") def analyze_description_value(description): """ Analiza la descripción del piso para extraer un 'índice de lujo/calidad'. Args: description (str): La descripción del anuncio inmobiliario. Returns: tuple: El dictado de la IA y una estimación de precio mejorada (simulación). """ if not description or len(description) < 30: return "Introduce una descripción detallada del piso (mínimo 30 caracteres).", "N/A" # 2. Análisis del texto con el modelo (obtenemos el score de Sentimiento/Calidad) try: results = text_classifier(description) sentiment = results[0]['label'] score = results[0]['score'] except Exception as e: return f"Error en el análisis de texto: {e}", "N/A" # 3. Mapeo del score a un "Índice de Lujo" y Tasación (Simulación) if sentiment == 'POS' or sentiment == 'POSITIVE': # El score de positividad lo usamos como un "Factor de Lujo" lujo_factor = score * 0.3 + 0.7 # Rango de 0.7 a 1.0 ai_dictado = f"Análisis de texto: **ALTA CALIDAD/LUJO** ({round(score*100)}% de positividad). Se mencionan características premium." else: # NEG o NEUTRAL lujo_factor = score * 0.3 + 0.3 # Rango de 0.3 a 0.6 ai_dictado = f"Análisis de texto: **CALIDAD MEDIA/ESTÁNDAR**. La descripción es funcional o poco detallada." # SIMULACIÓN DE LA TASACIÓN FINAL # Imaginamos un precio base de 250,000€ para un piso estándar # La IA añade o resta valor basado en el "Lujo Factor" extraído del texto precio_base = 250000 ajuste_por_lujo = precio_base * 0.5 * (lujo_factor - 0.5) # Ajuste entre -25% y +25% precio_final_estimado = precio_base + ajuste_por_lujo precio_formato = f"{precio_final_estimado:,.2f} €" # Formato de moneda return ai_dictado, precio_formato # 4. Diseño de la Interfaz de Gradio with gr.Blocks( title="Tasador Inmobiliario IA") as demo: gr.Markdown( """ # 💰 Tasador Inmobiliario Inteligente Analiza la descripción del anuncio para medir el **factor de lujo/calidad** y mejorar la precisión de la tasación. --- """ ) with gr.Row(): with gr.Column(scale=2): description_input = gr.Textbox( label="📝 Descripción del Piso (A destacar: Vistas, materiales, reformas...)", lines=10, placeholder="Ejemplo: 'Ático de lujo, completamente reformado con materiales de primera calidad (mármol travertino y domótica). Vistas inmejorables a la ciudad.'", ) price_output = gr.Textbox( label="💎 Tasación Final Mejorada por la IA (Simulación)", interactive=False, elem_id="price_box" ) with gr.Column(scale=1): analysis_output = gr.Textbox( label="🤖 Dictado del Análisis de Texto", interactive=False, lines=5 ) gr.Button("Tasación Rápida con Análisis IA", variant="primary").click( fn=analyze_description_value, inputs=description_input, outputs=[analysis_output, price_output] ) # Estilo CSS para destacar el precio final css_style = """ #price_box textarea { font-size: 30px !important; font-weight: bold; color: #FFFFFF !important; background-color: #007bff !important; /* Azul corporativo */ text-align: center; border-radius: 10px; } """ demo.css = css_style # Aplicar el estilo CSS al bloque demo.launch()