khalednabawi11 commited on
Commit
00f351b
·
verified ·
1 Parent(s): 115db3e

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +80 -0
app.py ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import os
3
+ import pickle
4
+ import numpy as np
5
+ from surprise import SVDpp
6
+ from sklearn.metrics.pairwise import cosine_similarity
7
+
8
+ # --- Download Model from Kaggle ---
9
+ def download_kaggle_model():
10
+ kaggle_username = os.environ.get("KAGGLE_USERNAME")
11
+ kaggle_key = os.environ.get("KAGGLE_KEY")
12
+ if not kaggle_username or not kaggle_key:
13
+ raise ValueError("Set KAGGLE_USERNAME and KAGGLE_KEY as HF secrets!")
14
+
15
+ os.system("mkdir -p ~/.kaggle")
16
+ with open("/root/.kaggle/kaggle.json", "w") as f:
17
+ f.write(f'{{"username":"{kaggle_username}","key":"{kaggle_key}"}}')
18
+ os.chmod("/root/.kaggle/kaggle.json", 0o600)
19
+
20
+ # Download your Kaggle model
21
+ print("📥 Downloading model from Kaggle...")
22
+ os.system("kaggle datasets download -d <your-username>/<your-model-dataset> -p ./model --unzip")
23
+
24
+ # --- Load Models ---
25
+ def load_models():
26
+ with open("./model/svdpp_model.pkl", "rb") as f:
27
+ svdpp_model = pickle.load(f)
28
+
29
+ with open("./model/content_features.pkl", "rb") as f:
30
+ content_features = pickle.load(f)
31
+
32
+ with open("./model/mappings.pkl", "rb") as f:
33
+ mappings = pickle.load(f)
34
+
35
+ return svdpp_model, content_features, mappings
36
+
37
+ # --- Hybrid Prediction ---
38
+ def hybrid_predict(user_id, book_id, alpha=0.7):
39
+ try:
40
+ uid = user_encoder.transform([user_id])[0]
41
+ iid = item_encoder.transform([book_id])[0]
42
+ except:
43
+ return "Unknown user_id or book_id"
44
+
45
+ svd_pred = svdpp_model.predict(uid, iid).est
46
+
47
+ user_liked = np.where(svdpp_model.trainset.ur[uid])[0]
48
+ if len(user_liked) == 0:
49
+ content_score = 0
50
+ else:
51
+ similarities = cosine_similarity(content_features[iid], content_features[user_liked])
52
+ content_score = np.mean(similarities)
53
+
54
+ hybrid_score = alpha * svd_pred + (1 - alpha) * content_score * 5
55
+ return round(hybrid_score, 2)
56
+
57
+ # --- Gradio Interface ---
58
+ def recommend(user_id, book_id, alpha=0.7):
59
+ return f"Predicted Rating: {hybrid_predict(user_id, book_id, alpha)}"
60
+
61
+ # Download model from Kaggle and load
62
+ download_kaggle_model()
63
+ svdpp_model, content_features, mappings = load_models()
64
+ user_encoder = mappings["user_encoder"]
65
+ item_encoder = mappings["item_encoder"]
66
+
67
+ # Start Gradio app
68
+ demo = gr.Interface(
69
+ fn=recommend,
70
+ inputs=[
71
+ gr.Textbox(label="User ID"),
72
+ gr.Textbox(label="Book ID"),
73
+ gr.Slider(0, 1, value=0.7, step=0.1, label="Hybrid Weight (alpha)")
74
+ ],
75
+ outputs="text",
76
+ title="📚 Hybrid Book Recommender",
77
+ description="Enter a user_id and book_id to get a predicted rating using a Hybrid SVD++ and Content-based model."
78
+ )
79
+
80
+ demo.launch()