lenawilli commited on
Commit
dfb673b
Β·
verified Β·
1 Parent(s): 32829c9

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +35 -30
src/streamlit_app.py CHANGED
@@ -5,7 +5,7 @@ import tensorflow as tf
5
  import joblib
6
  import os
7
 
8
- # Define file paths
9
  BASE_DIR = os.path.dirname(__file__)
10
  KERAS_MODEL_PATH = os.path.join(BASE_DIR, "recommender_model.keras")
11
  MOVIES_PATH = os.path.join(BASE_DIR, "movies.csv")
@@ -13,6 +13,9 @@ ENCODINGS_PATH = os.path.join(BASE_DIR, "encodings.pkl")
13
 
14
  @st.cache_resource
15
  def load_model():
 
 
 
16
  try:
17
  return tf.keras.models.load_model(KERAS_MODEL_PATH)
18
  except Exception as e:
@@ -21,35 +24,35 @@ def load_model():
21
 
22
  @st.cache_data
23
  def load_assets():
24
- try:
25
- df_movies = pd.read_csv(MOVIES_PATH)
26
- except FileNotFoundError:
27
  st.error("❌ movies.csv not found.")
28
  st.stop()
29
-
 
 
30
  try:
 
31
  user_map, movie_map = joblib.load(ENCODINGS_PATH)
32
- except FileNotFoundError:
33
- st.error("❌ encodings.pkl not found.")
 
34
  st.stop()
35
 
36
- return df_movies, user_map, movie_map
37
-
38
  # Load model and assets
39
  model = load_model()
40
  movies_df, user2idx, movie2idx = load_assets()
41
  reverse_movie_map = {v: k for k, v in movie2idx.items()}
42
 
43
- # App UI
44
  st.title("🎬 TensorFlow Movie Recommender")
45
  st.write("Select some movies you've liked to get personalized recommendations:")
46
 
47
- # Movie selection UI
48
  movie_titles = movies_df.set_index("movieId")["title"].to_dict()
49
  movie_choices = [movie_titles[mid] for mid in movie2idx if mid in movie_titles]
50
  selected_titles = st.multiselect("🎞️ Liked movies", sorted(movie_choices))
51
 
52
- # Create ratings dictionary
53
  user_ratings = {}
54
  for title in selected_titles:
55
  movie_id = next((k for k, v in movie_titles.items() if v == title), None)
@@ -66,23 +69,25 @@ if st.button("🎯 Get Recommendations"):
66
  st.error("⚠️ No valid movie encodings found.")
67
  st.stop()
68
 
69
- # Get embedding averages and scores
70
- avg_embedding = tf.reduce_mean(model.layers[2](tf.constant(liked_indices)), axis=0, keepdims=True)
71
- all_movie_indices = tf.range(len(movie2idx))
72
- movie_embeddings = model.layers[3](all_movie_indices)
73
- scores = tf.reduce_sum(avg_embedding * movie_embeddings, axis=1).numpy()
74
- top_indices = np.argsort(scores)[::-1]
 
75
 
76
- # Top N recommendations excluding already-liked
77
- recommended = []
78
- for idx in top_indices:
79
- mid = reverse_movie_map.get(idx)
80
- if mid not in user_ratings and mid in movie_titles:
81
- recommended.append((movie_titles[mid], scores[idx]))
82
- if len(recommended) >= 10:
83
- break
84
 
85
- # Display recommendations
86
- st.subheader("🍿 Top 10 Recommendations")
87
- for title, score in recommended:
88
- st.write(f"**{title}** β€” Score: `{score:.3f}`")
 
 
5
  import joblib
6
  import os
7
 
8
+ # Define file paths (assuming all files are in the same folder as this script)
9
  BASE_DIR = os.path.dirname(__file__)
10
  KERAS_MODEL_PATH = os.path.join(BASE_DIR, "recommender_model.keras")
11
  MOVIES_PATH = os.path.join(BASE_DIR, "movies.csv")
 
13
 
14
  @st.cache_resource
15
  def load_model():
16
+ if not os.path.exists(KERAS_MODEL_PATH):
17
+ st.error(f"❌ Model file not found at: {KERAS_MODEL_PATH}")
18
+ st.stop()
19
  try:
20
  return tf.keras.models.load_model(KERAS_MODEL_PATH)
21
  except Exception as e:
 
24
 
25
  @st.cache_data
26
  def load_assets():
27
+ if not os.path.exists(MOVIES_PATH):
 
 
28
  st.error("❌ movies.csv not found.")
29
  st.stop()
30
+ if not os.path.exists(ENCODINGS_PATH):
31
+ st.error("❌ encodings.pkl not found.")
32
+ st.stop()
33
  try:
34
+ df_movies = pd.read_csv(MOVIES_PATH)
35
  user_map, movie_map = joblib.load(ENCODINGS_PATH)
36
+ return df_movies, user_map, movie_map
37
+ except Exception as e:
38
+ st.error(f"❌ Failed to load assets:\n\n{e}")
39
  st.stop()
40
 
 
 
41
  # Load model and assets
42
  model = load_model()
43
  movies_df, user2idx, movie2idx = load_assets()
44
  reverse_movie_map = {v: k for k, v in movie2idx.items()}
45
 
46
+ # UI
47
  st.title("🎬 TensorFlow Movie Recommender")
48
  st.write("Select some movies you've liked to get personalized recommendations:")
49
 
50
+ # Movie title selection
51
  movie_titles = movies_df.set_index("movieId")["title"].to_dict()
52
  movie_choices = [movie_titles[mid] for mid in movie2idx if mid in movie_titles]
53
  selected_titles = st.multiselect("🎞️ Liked movies", sorted(movie_choices))
54
 
55
+ # User ratings dict
56
  user_ratings = {}
57
  for title in selected_titles:
58
  movie_id = next((k for k, v in movie_titles.items() if v == title), None)
 
69
  st.error("⚠️ No valid movie encodings found.")
70
  st.stop()
71
 
72
+ try:
73
+ # Calculate average embedding and similarity scores
74
+ avg_embedding = tf.reduce_mean(model.layers[2](tf.constant(liked_indices)), axis=0, keepdims=True)
75
+ all_movie_indices = tf.range(len(movie2idx))
76
+ movie_embeddings = model.layers[3](all_movie_indices)
77
+ scores = tf.reduce_sum(avg_embedding * movie_embeddings, axis=1).numpy()
78
+ top_indices = np.argsort(scores)[::-1]
79
 
80
+ # Top 10 recommendations excluding already liked
81
+ recommended = []
82
+ for idx in top_indices:
83
+ mid = reverse_movie_map.get(idx)
84
+ if mid not in user_ratings and mid in movie_titles:
85
+ recommended.append((movie_titles[mid], scores[idx]))
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}`")
92
+ except Exception as e:
93
+ st.error(f"❌ Error generating recommendations:\n\n{e}")