lenawilli commited on
Commit
4115a7a
·
verified ·
1 Parent(s): 663be69

Upload 5 files

Browse files
Files changed (6) hide show
  1. .gitattributes +1 -0
  2. app.py +55 -0
  3. encodings.pkl +3 -0
  4. movies.csv +0 -0
  5. recommender_model.keras +3 -0
  6. requirements.txt +5 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ recommender_model.keras filter=lfs diff=lfs merge=lfs -text
app.py ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import streamlit as st
3
+ import pandas as pd
4
+ import numpy as np
5
+ import tensorflow as tf
6
+ import joblib
7
+
8
+ @st.cache_resource
9
+ def load_model():
10
+ return tf.keras.models.load_model("recommender_model.keras")
11
+
12
+ @st.cache_data
13
+ def load_assets():
14
+ df_movies = pd.read_csv("movies.csv")
15
+ user_map, movie_map = joblib.load("encodings.pkl")
16
+ return df_movies, user_map, movie_map
17
+
18
+ model = load_model()
19
+ movies_df, user2idx, movie2idx = load_assets()
20
+ reverse_movie_map = {v: k for k, v in movie2idx.items()}
21
+
22
+ st.title("TensorFlow Movie Recommender")
23
+ st.write("Select some movies you've liked to get recommendations:")
24
+
25
+ movie_titles = movies_df.set_index("movieId")["title"].to_dict()
26
+ movie_choices = [movie_titles[mid] for mid in movie2idx.keys() if mid in movie_titles]
27
+ selected_titles = st.multiselect("Liked movies", sorted(movie_choices))
28
+
29
+ user_ratings = {}
30
+ for title in selected_titles:
31
+ movie_id = [k for k, v in movie_titles.items() if v == title][0]
32
+ user_ratings[movie_id] = 5.0
33
+
34
+ if st.button("Get Recommendations"):
35
+ if not user_ratings:
36
+ st.warning("Please select at least one movie.")
37
+ else:
38
+ liked_indices = [movie2idx[m] for m in user_ratings if m in movie2idx]
39
+ avg_embedding = tf.reduce_mean(model.layers[2](tf.constant(liked_indices)), axis=0, keepdims=True)
40
+ all_movie_indices = tf.range(len(movie2idx))
41
+ movie_embeddings = model.layers[3](all_movie_indices)
42
+ scores = tf.reduce_sum(avg_embedding * movie_embeddings, axis=1).numpy()
43
+ top_indices = np.argsort(scores)[::-1]
44
+
45
+ recommended = []
46
+ for idx in top_indices:
47
+ mid = reverse_movie_map[idx]
48
+ if mid not in user_ratings and mid in movie_titles:
49
+ recommended.append((movie_titles[mid], scores[idx]))
50
+ if len(recommended) >= 10:
51
+ break
52
+
53
+ st.subheader("Top Recommendations")
54
+ for title, score in recommended:
55
+ st.write(f"{title} — Score: {score:.3f}")
encodings.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0e5618ac303f871d6fd0f81aa96848b0b52d722566b829b3dcbdd6a0d83ee771
3
+ size 5069676
movies.csv ADDED
The diff for this file is too large to render. See raw diff
 
recommender_model.keras ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1d08c6ecc96d18ac1f75494bcae2ef6fba657bd3ee02175dc7c05176ba1cc143
3
+ size 4121755
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ streamlit
2
+ tensorflow
3
+ pandas
4
+ numpy
5
+ joblib