File size: 2,780 Bytes
83bb1bd |
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 |
"""
FINAL SMART RECOMMENDER SYSTEM
Embeddings + Intent + Filtering + Reranking + Keyword Boosting
"""
from filtered_search_engine import SmartRecommender
from reranker import Reranker
from keyword_boosting_layer import apply_keyword_boost
import pandas as pd
class FinalSalahkar:
def __init__(self):
print("β¨ Initializing Final AI Recommender...")
self.engine = SmartRecommender()
self.reranker = Reranker()
self.df = pd.read_csv("salahkar_enhanced.csv")
# Optimization: Pre-compute name-to-row mapping for O(1) lookup
# This is much faster than running df[df["name"] == name] for every result
self.name_map = self.df.set_index("name").to_dict('index')
print("π System Ready!")
def ask(self, query, k=7):
print("\n==============================================")
print(f"π§ INPUT QUERY β {query}")
print("==============================================")
# STEP 1 β BASE SEARCH (filtered FAISS)
# Now returns (results_list, detected_intent)
results, intent = self.engine.recommend(query, k=k)
# STEP 2 β Prepare embedding text for reranking
prepared = []
for item in results:
name = item["name"]
# Optimization: FAST LOOKUP
row = self.name_map.get(name)
if row:
prepared.append({
"name": name,
"domain": item["domain"],
"category": item["category"],
"region": item["region"],
"embedding_score": item["score"],
"text": row["search_embedding_text"], # Use index text for reranking
"intent": intent
})
# STEP 3 β Cross-Encoder Reranking
ranked = self.reranker.rerank(query, prepared)
# STEP 4 β Keyword Boost (final scoring)
# This applies the location/food/heritage boosts we configured
boosted = apply_keyword_boost(query, ranked)
# STEP 5 β Display final sorted results
print("\nπ FINAL SMART RANKED RESULTS:")
for i, item in enumerate(boosted[:k]):
score = item.get('final_score', item.get('rerank_score', 0))
print(f"{i+1}. {item['name']} | Final Score: {round(score, 3)}")
return boosted
if __name__ == "__main__":
bot = FinalSalahkar()
# Test the complex new queries to verify accuracy
bot.ask("romantic historical place india")
bot.ask("spiritual peaceful temple")
bot.ask("best south indian spicy breakfast")
bot.ask("sweet festival food india")
bot.ask("famous beaches near ongole") # Test new data point |