Spaces:
Sleeping
Sleeping
| """ | |
| query_parse.py — pull price constraints out of a natural-language prompt. | |
| "bird pendant under 15000" -> clean="bird pendant", max_price=15000 | |
| "rose gold ring above 5k" -> clean="rose gold ring", min_price=5000 | |
| "anklet between 1000 and 3000" -> min_price=1000, max_price=3000 | |
| Deterministic (regex) so the demo behaves predictably — no LLM needed. The | |
| cleaned prompt (price words removed) is what we embed, so the vector focuses on | |
| the product, not the number. | |
| """ | |
| import re | |
| def _to_number(raw: str) -> float: | |
| """'15,000' -> 15000, '15k' -> 15000, '1.5k' -> 1500.""" | |
| s = raw.lower().replace(",", "").replace("₹", "").replace("rs", "").strip() | |
| mult = 1 | |
| if s.endswith("k"): | |
| mult = 1000 | |
| s = s[:-1] | |
| elif s.endswith("l") or s.endswith("lakh"): | |
| mult = 100000 | |
| s = s.rstrip("lakh").strip() | |
| try: | |
| return float(s) * mult | |
| except ValueError: | |
| return None | |
| # A price token like 15000 | 15,000 | 15k | ₹15000 | rs 2.5k | |
| _NUM = r"(?:₹\s*|rs\.?\s*)?(\d[\d,]*\.?\d*\s*(?:k|l|lakh)?)" | |
| _BETWEEN = re.compile(r"between\s+" + _NUM + r"\s+(?:and|to|-)\s+" + _NUM, re.I) | |
| _UNDER = re.compile( | |
| r"(?:under|below|less than|within|upto|up to|max(?:imum)?|no more than|<=?)\s+" + _NUM, re.I) | |
| _OVER = re.compile( | |
| r"(?:over|above|more than|min(?:imum)?|at least|starting (?:from|at)|>=?)\s+" + _NUM, re.I) | |
| def parse_constraints(prompt: str): | |
| """Return (clean_prompt, min_price, max_price). Bounds are None if absent.""" | |
| text = prompt | |
| min_price = max_price = None | |
| m = _BETWEEN.search(text) | |
| if m: | |
| a, b = _to_number(m.group(1)), _to_number(m.group(2)) | |
| if a is not None and b is not None: | |
| min_price, max_price = min(a, b), max(a, b) | |
| text = _BETWEEN.sub(" ", text) | |
| m = _UNDER.search(text) | |
| if m: | |
| v = _to_number(m.group(1)) | |
| if v is not None: | |
| max_price = v | |
| text = _UNDER.sub(" ", text) | |
| m = _OVER.search(text) | |
| if m: | |
| v = _to_number(m.group(1)) | |
| if v is not None: | |
| min_price = v | |
| text = _OVER.sub(" ", text) | |
| clean = re.sub(r"\s{2,}", " ", text).strip(" .,-") or prompt | |
| return clean, min_price, max_price | |
| if __name__ == "__main__": | |
| for q in ["bird pendant under 15000", "rose gold ring above 5k", | |
| "anklet between 1000 and 3000", "gold studs upto ₹20,000", | |
| "silver bracelet less than 2.5k", "diamond necklace"]: | |
| print(q, "->", parse_constraints(q)) | |