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

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +17 -8
src/streamlit_app.py CHANGED
@@ -7,7 +7,7 @@ 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")
@@ -16,16 +16,19 @@ ENCODINGS_PATH = os.path.join(BASE_DIR, "encodings.pkl")
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()
30
 
31
  @st.cache_data
@@ -33,13 +36,13 @@ def load_assets():
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
@@ -49,20 +52,23 @@ 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:
62
  movie_id = next((k for k, v in movie_titles.items() if v == title), None)
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.")
@@ -72,12 +78,14 @@ if st.button("🎯 Get Recommendations"):
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)
76
  all_movie_indices = tf.range(len(movie2idx))
77
  movie_embeddings = model.layers[3](all_movie_indices)
78
  scores = tf.reduce_sum(avg_embedding * movie_embeddings, axis=1).numpy()
79
  top_indices = np.argsort(scores)[::-1]
80
 
 
81
  recommended = []
82
  for idx in top_indices:
83
  mid = reverse_movie_map.get(idx)
@@ -86,6 +94,7 @@ if st.button("🎯 Get Recommendations"):
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}`")
 
7
  import zipfile
8
  import tempfile
9
 
10
+ # Define static file 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")
 
16
  @st.cache_resource
17
  def load_model():
18
  try:
19
+ # Define extraction directory in a writable temp location
20
+ extract_dir = os.path.join(tempfile.gettempdir(), "recommender_model_extracted")
21
 
22
+ # Only extract if not already done
23
  if not os.path.exists(extract_dir):
24
  with zipfile.ZipFile(ZIP_MODEL_PATH, "r") as zip_ref:
25
  zip_ref.extractall(extract_dir)
26
 
27
+ # Load model from extracted directory
28
  return tf.keras.models.load_model(extract_dir)
29
+
30
  except Exception as e:
31
+ st.error(f"❌ Failed to load model:\n\n{e}")
32
  st.stop()
33
 
34
  @st.cache_data
 
36
  try:
37
  df_movies = pd.read_csv(MOVIES_PATH)
38
  except FileNotFoundError:
39
+ st.error("❌ movies.csv not found.")
40
  st.stop()
41
 
42
  try:
43
  user_map, movie_map = joblib.load(ENCODINGS_PATH)
44
  except FileNotFoundError:
45
+ st.error("❌ encodings.pkl not found.")
46
  st.stop()
47
 
48
  return df_movies, user_map, movie_map
 
52
  movies_df, user2idx, movie2idx = load_assets()
53
  reverse_movie_map = {v: k for k, v in movie2idx.items()}
54
 
55
+ # App UI
56
  st.title("🎬 TensorFlow Movie Recommender")
57
  st.write("Select some movies you've liked to get personalized recommendations:")
58
 
59
+ # Movie selection UI
60
  movie_titles = movies_df.set_index("movieId")["title"].to_dict()
61
+ movie_choices = [movie_titles[mid] for mid in movie2idx if mid in movie_titles]
62
  selected_titles = st.multiselect("🎞️ Liked movies", sorted(movie_choices))
63
 
64
+ # Create ratings dictionary
65
  user_ratings = {}
66
  for title in selected_titles:
67
  movie_id = next((k for k, v in movie_titles.items() if v == title), None)
68
  if movie_id:
69
  user_ratings[movie_id] = 5.0
70
 
71
+ # Generate recommendations
72
  if st.button("🎯 Get Recommendations"):
73
  if not user_ratings:
74
  st.warning("Please select at least one movie.")
 
78
  st.error("⚠️ No valid movie encodings found.")
79
  st.stop()
80
 
81
+ # Get embedding averages and scores
82
  avg_embedding = tf.reduce_mean(model.layers[2](tf.constant(liked_indices)), axis=0, keepdims=True)
83
  all_movie_indices = tf.range(len(movie2idx))
84
  movie_embeddings = model.layers[3](all_movie_indices)
85
  scores = tf.reduce_sum(avg_embedding * movie_embeddings, axis=1).numpy()
86
  top_indices = np.argsort(scores)[::-1]
87
 
88
+ # Top N recommendations excluding already-liked
89
  recommended = []
90
  for idx in top_indices:
91
  mid = reverse_movie_map.get(idx)
 
94
  if len(recommended) >= 10:
95
  break
96
 
97
+ # Display recommendations
98
  st.subheader("🍿 Top 10 Recommendations")
99
  for title, score in recommended:
100
  st.write(f"**{title}** β€” Score: `{score:.3f}`")