Update app.py
Browse files
app.py
CHANGED
|
@@ -61,6 +61,7 @@ morph = MorphAnalyzer()
|
|
| 61 |
base_types = ["офис", "квартира", "апартаменты", "свободное назначение", "студия", "дом", "ОСЗ"]
|
| 62 |
|
| 63 |
|
|
|
|
| 64 |
# Анализ запроса пользователя
|
| 65 |
def analyze_query(query):
|
| 66 |
query = query.lower()
|
|
@@ -96,7 +97,6 @@ def analyze_query(query):
|
|
| 96 |
else:
|
| 97 |
return int(number)
|
| 98 |
|
| 99 |
-
|
| 100 |
# Поиск цены
|
| 101 |
price_keywords = ["руб", "р.", "рублей", "рубля"]
|
| 102 |
price_range_match = re.findall(rf"от\s*(\d+[\s]*[.,]?\d*)\s*до\s*(\d+[\s]*[.,]?\d*)\s*({'|'.join(price_keywords)})\b", query)
|
|
@@ -109,7 +109,7 @@ def analyze_query(query):
|
|
| 109 |
filters["price_min"] = normalized_price_min
|
| 110 |
filters["price_max"] = normalized_price_max
|
| 111 |
|
| 112 |
-
# Обработка остальных случаев (
|
| 113 |
price_match = re.findall(rf"(до|\s*)(\d+[\s]*[.,]?\d*)\s*(млн|тр|т\.р|тыс|тысруб|тыс\.руб|тр|т\.р.|тыр|тыр.|тыщ|тыш|тысяч|млнруб|млн\.руб|мн|М|миллионов|милионов|лямов|лимонов)?\s*({'|'.join(price_keywords)})\b", query)
|
| 114 |
if price_match:
|
| 115 |
operator = price_match[0][0]
|
|
@@ -121,7 +121,6 @@ def analyze_query(query):
|
|
| 121 |
else:
|
| 122 |
filters["price_min"] = normalized_price
|
| 123 |
|
| 124 |
-
|
| 125 |
# Поиск площади
|
| 126 |
area_keywords = ["квм", "кв.м", "кв метров", "кв м", "кв.м.", "квадратов", "квадрата", "м2", "метров", "м²"]
|
| 127 |
area_range_match = re.findall(rf"от\s*(\d+[\s]*[.,]?\d*)\s*до\s*(\d+[\s]*[.,]?\d*)\s*({'|'.join(area_keywords)})\b", query)
|
|
@@ -134,30 +133,19 @@ def analyze_query(query):
|
|
| 134 |
filters["area_min"] = normalized_area_min
|
| 135 |
filters["area_max"] = normalized_area_max
|
| 136 |
|
| 137 |
-
# Обработка остальных случаев (
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
if
|
| 141 |
-
filters["area_min"] = int(
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
filters["area_min"] = int(area_range_match_2[0][0])
|
| 145 |
-
filters["area_max"] = int(area_range_match_2[0][1])
|
| 146 |
-
else:
|
| 147 |
-
area_min_match = re.findall(rf"\b(от)\s*(\d+)\s*({'|'.join(area_keywords)})", query)
|
| 148 |
-
area_max_match = re.findall(rf"\b(до)\s*(\d+)\s*({'|'.join(area_keywords)})", query)
|
| 149 |
-
if area_min_match:
|
| 150 |
-
filters["area_min"] = int(area_min_match[0][1])
|
| 151 |
-
if area_max_match:
|
| 152 |
-
filters["area_max"] = int(area_max_match[0][1])
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
|
|
|
|
| 157 |
|
| 158 |
|
| 159 |
# Поиск объектов недвижимости в CSV
|
| 160 |
-
|
| 161 |
if not filters:
|
| 162 |
return []
|
| 163 |
|
|
@@ -189,45 +177,6 @@ def analyze_query(query):
|
|
| 189 |
|
| 190 |
# Возвращаем все подходящие объекты
|
| 191 |
return dataframe[mask].to_dict(orient="records")
|
| 192 |
-
"""
|
| 193 |
-
# Поиск объектов недвижимости в CSV
|
| 194 |
-
def search_real_estate(dataframe, filters):
|
| 195 |
-
if not filters:
|
| 196 |
-
return []
|
| 197 |
-
mask = pd.Series([True] * len(dataframe))
|
| 198 |
-
# Фильтрация по типу недвижимости
|
| 199 |
-
if "type" in filters:
|
| 200 |
-
mask &= dataframe["type"].str.lower().isin(filters["type"])
|
| 201 |
-
|
| 202 |
-
# Фильтрация по виду сделки (Аренда/Продажа)
|
| 203 |
-
if "rent" in filters:
|
| 204 |
-
mask &= dataframe["RENT"].str.lower() == filters["rent"].lower()
|
| 205 |
-
|
| 206 |
-
# Фильтрация по цене
|
| 207 |
-
if "price_min" in filters and "price_max" in filters:
|
| 208 |
-
mask &= (dataframe["price"] >= filters["price_min"]) & (dataframe["price"] <= filters["price_max"])
|
| 209 |
-
elif "price_min" in filters:
|
| 210 |
-
mask &= dataframe["price"] >= filters["price_min"]
|
| 211 |
-
elif "price_max" in filters:
|
| 212 |
-
mask &= dataframe["price"] <= filters["price_max"]
|
| 213 |
-
# Фильтрация по площади
|
| 214 |
-
if "area_min" in filters and "area_max" in filters:
|
| 215 |
-
mask &= (dataframe["area"] >= filters["area_min"]) & (dataframe["area"] <= filters["area_max"])
|
| 216 |
-
elif "area_min" in filters:
|
| 217 |
-
mask &= dataframe["area"] >= filters["area_min"]
|
| 218 |
-
elif "area_max" in filters:
|
| 219 |
-
mask &= dataframe["area"] <= filters["area_max"]
|
| 220 |
-
results = dataframe[mask]
|
| 221 |
-
# Проверяем, есть ли результаты
|
| 222 |
-
if not results.empty:
|
| 223 |
-
return results.to_dict(orient="records") # Возвращаем список словарей
|
| 224 |
-
# Fallback: Если нет подходящих объектов, предлагаем все объекты данного типа
|
| 225 |
-
if "type" in filters:
|
| 226 |
-
fallback_mask = dataframe["type"].str.lower().isin(filters["type"])
|
| 227 |
-
fallback_results = dataframe[fallback_mask]
|
| 228 |
-
if not fallback_results.empty:
|
| 229 |
-
return {"fallback": True, "results": fallback_results.to_dict(orient="records")} # Возвращаем fallback-результаты
|
| 230 |
-
return [] # Возвращаем пустой список, если ничего не найдено
|
| 231 |
|
| 232 |
# Создание контекста для модели
|
| 233 |
def create_context(dataframe, filters):
|
|
|
|
| 61 |
base_types = ["офис", "квартира", "апартаменты", "свободное назначение", "студия", "дом", "ОСЗ"]
|
| 62 |
|
| 63 |
|
| 64 |
+
|
| 65 |
# Анализ запроса пользователя
|
| 66 |
def analyze_query(query):
|
| 67 |
query = query.lower()
|
|
|
|
| 97 |
else:
|
| 98 |
return int(number)
|
| 99 |
|
|
|
|
| 100 |
# Поиск цены
|
| 101 |
price_keywords = ["руб", "р.", "рублей", "рубля"]
|
| 102 |
price_range_match = re.findall(rf"от\s*(\d+[\s]*[.,]?\d*)\s*до\s*(\d+[\s]*[.,]?\d*)\s*({'|'.join(price_keywords)})\b", query)
|
|
|
|
| 109 |
filters["price_min"] = normalized_price_min
|
| 110 |
filters["price_max"] = normalized_price_max
|
| 111 |
|
| 112 |
+
# Обработка остальных случаев (до/от)
|
| 113 |
price_match = re.findall(rf"(до|\s*)(\d+[\s]*[.,]?\d*)\s*(млн|тр|т\.р|тыс|тысруб|тыс\.руб|тр|т\.р.|тыр|тыр.|тыщ|тыш|тысяч|млнруб|млн\.руб|мн|М|миллионов|милионов|лямов|лимонов)?\s*({'|'.join(price_keywords)})\b", query)
|
| 114 |
if price_match:
|
| 115 |
operator = price_match[0][0]
|
|
|
|
| 121 |
else:
|
| 122 |
filters["price_min"] = normalized_price
|
| 123 |
|
|
|
|
| 124 |
# Поиск площади
|
| 125 |
area_keywords = ["квм", "кв.м", "кв метров", "кв м", "кв.м.", "квадратов", "квадрата", "м2", "метров", "м²"]
|
| 126 |
area_range_match = re.findall(rf"от\s*(\d+[\s]*[.,]?\d*)\s*до\s*(\d+[\s]*[.,]?\d*)\s*({'|'.join(area_keywords)})\b", query)
|
|
|
|
| 133 |
filters["area_min"] = normalized_area_min
|
| 134 |
filters["area_max"] = normalized_area_max
|
| 135 |
|
| 136 |
+
# Обработка остальных случаев (до/от)
|
| 137 |
+
area_min_match = re.findall(rf"\b(от)\s*(\d+)\s*({'|'.join(area_keywords)})", query)
|
| 138 |
+
area_max_match = re.findall(rf"\b(до)\s*(\d+)\s*({'|'.join(area_keywords)})", query)
|
| 139 |
+
if area_min_match:
|
| 140 |
+
filters["area_min"] = int(area_min_match[0][1])
|
| 141 |
+
if area_max_match:
|
| 142 |
+
filters["area_max"] = int(area_max_match[0][1])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 143 |
|
| 144 |
+
return filters
|
| 145 |
|
| 146 |
|
| 147 |
# Поиск объектов недвижимости в CSV
|
| 148 |
+
def search_real_estate(dataframe, filters):
|
| 149 |
if not filters:
|
| 150 |
return []
|
| 151 |
|
|
|
|
| 177 |
|
| 178 |
# Возвращаем все подходящие объекты
|
| 179 |
return dataframe[mask].to_dict(orient="records")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 180 |
|
| 181 |
# Создание контекста для модели
|
| 182 |
def create_context(dataframe, filters):
|