lenawilli commited on
Commit
0eec7e8
Β·
verified Β·
1 Parent(s): 0be83b6

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +21 -13
src/streamlit_app.py CHANGED
@@ -5,21 +5,25 @@ import tensorflow as tf
5
  import joblib
6
  import os
7
  import zipfile
 
8
 
9
- # Define paths
10
  BASE_DIR = os.path.dirname(__file__)
11
  ZIP_MODEL_PATH = os.path.join(BASE_DIR, "recommender_model.zip")
12
- EXTRACTED_MODEL_DIR = os.path.join(BASE_DIR, "recommender_model")
13
  MOVIES_PATH = os.path.join(BASE_DIR, "movies.csv")
14
  ENCODINGS_PATH = os.path.join(BASE_DIR, "encodings.pkl")
15
 
16
  @st.cache_resource
17
  def load_model():
18
  try:
19
- if not os.path.exists(EXTRACTED_MODEL_DIR):
 
 
 
20
  with zipfile.ZipFile(ZIP_MODEL_PATH, "r") as zip_ref:
21
- zip_ref.extractall(EXTRACTED_MODEL_DIR)
22
- return tf.keras.models.load_model(EXTRACTED_MODEL_DIR)
 
23
  except Exception as e:
24
  st.error(f"Failed to load model: {e}")
25
  st.stop()
@@ -29,25 +33,29 @@ def load_assets():
29
  try:
30
  df_movies = pd.read_csv(MOVIES_PATH)
31
  except FileNotFoundError:
32
- st.error("movies.csv not found.")
33
  st.stop()
 
34
  try:
35
  user_map, movie_map = joblib.load(ENCODINGS_PATH)
36
  except FileNotFoundError:
37
- st.error("encodings.pkl not found.")
38
  st.stop()
 
39
  return df_movies, user_map, movie_map
40
 
 
41
  model = load_model()
42
  movies_df, user2idx, movie2idx = load_assets()
43
  reverse_movie_map = {v: k for k, v in movie2idx.items()}
44
 
 
45
  st.title("🎬 TensorFlow Movie Recommender")
46
- st.write("Select some movies you've liked to get recommendations:")
47
 
48
  movie_titles = movies_df.set_index("movieId")["title"].to_dict()
49
  movie_choices = [movie_titles[mid] for mid in movie2idx.keys() if mid in movie_titles]
50
- selected_titles = st.multiselect("Liked movies", sorted(movie_choices))
51
 
52
  user_ratings = {}
53
  for title in selected_titles:
@@ -55,13 +63,13 @@ for title in selected_titles:
55
  if movie_id:
56
  user_ratings[movie_id] = 5.0
57
 
58
- if st.button("Get Recommendations"):
59
  if not user_ratings:
60
  st.warning("Please select at least one movie.")
61
  else:
62
  liked_indices = [movie2idx[m] for m in user_ratings if m in movie2idx]
63
  if not liked_indices:
64
- st.error("No valid movie encodings found.")
65
  st.stop()
66
 
67
  avg_embedding = tf.reduce_mean(model.layers[2](tf.constant(liked_indices)), axis=0, keepdims=True)
@@ -78,6 +86,6 @@ if st.button("Get Recommendations"):
78
  if len(recommended) >= 10:
79
  break
80
 
81
- st.subheader("🎯 Top Recommendations")
82
  for title, score in recommended:
83
- st.write(f"{title} β€” Score: {score:.3f}")
 
5
  import joblib
6
  import os
7
  import zipfile
8
+ import tempfile
9
 
10
+ # Paths
11
  BASE_DIR = os.path.dirname(__file__)
12
  ZIP_MODEL_PATH = os.path.join(BASE_DIR, "recommender_model.zip")
 
13
  MOVIES_PATH = os.path.join(BASE_DIR, "movies.csv")
14
  ENCODINGS_PATH = os.path.join(BASE_DIR, "encodings.pkl")
15
 
16
  @st.cache_resource
17
  def load_model():
18
  try:
19
+ extract_dir = os.path.join(tempfile.gettempdir(), "recommender_model")
20
+
21
+ # Extract only if not already extracted
22
+ if not os.path.exists(extract_dir):
23
  with zipfile.ZipFile(ZIP_MODEL_PATH, "r") as zip_ref:
24
+ zip_ref.extractall(extract_dir)
25
+
26
+ return tf.keras.models.load_model(extract_dir)
27
  except Exception as e:
28
  st.error(f"Failed to load model: {e}")
29
  st.stop()
 
33
  try:
34
  df_movies = pd.read_csv(MOVIES_PATH)
35
  except FileNotFoundError:
36
+ st.error("❌ Error: movies.csv not found.")
37
  st.stop()
38
+
39
  try:
40
  user_map, movie_map = joblib.load(ENCODINGS_PATH)
41
  except FileNotFoundError:
42
+ st.error("❌ Error: encodings.pkl not found.")
43
  st.stop()
44
+
45
  return df_movies, user_map, movie_map
46
 
47
+ # Load model and assets
48
  model = load_model()
49
  movies_df, user2idx, movie2idx = load_assets()
50
  reverse_movie_map = {v: k for k, v in movie2idx.items()}
51
 
52
+ # UI
53
  st.title("🎬 TensorFlow Movie Recommender")
54
+ st.write("Select some movies you've liked to get personalized recommendations:")
55
 
56
  movie_titles = movies_df.set_index("movieId")["title"].to_dict()
57
  movie_choices = [movie_titles[mid] for mid in movie2idx.keys() if mid in movie_titles]
58
+ selected_titles = st.multiselect("🎞️ Liked movies", sorted(movie_choices))
59
 
60
  user_ratings = {}
61
  for title in selected_titles:
 
63
  if movie_id:
64
  user_ratings[movie_id] = 5.0
65
 
66
+ if st.button("🎯 Get Recommendations"):
67
  if not user_ratings:
68
  st.warning("Please select at least one movie.")
69
  else:
70
  liked_indices = [movie2idx[m] for m in user_ratings if m in movie2idx]
71
  if not liked_indices:
72
+ st.error("⚠️ No valid movie encodings found.")
73
  st.stop()
74
 
75
  avg_embedding = tf.reduce_mean(model.layers[2](tf.constant(liked_indices)), axis=0, keepdims=True)
 
86
  if len(recommended) >= 10:
87
  break
88
 
89
+ st.subheader("🍿 Top 10 Recommendations")
90
  for title, score in recommended:
91
+ st.write(f"**{title}** β€” Score: `{score:.3f}`")