Upload 5 files
Browse files- .gitattributes +1 -0
- app.py +55 -0
- encodings.pkl +3 -0
- movies.csv +0 -0
- recommender_model.keras +3 -0
- 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
|