krishnaveni76 commited on
Commit
ab6b19a
ยท
verified ยท
1 Parent(s): 36b8d54

Updated app

Browse files
Files changed (1) hide show
  1. app.py +241 -241
app.py CHANGED
@@ -1,242 +1,242 @@
1
- import pandas as pd
2
- import streamlit as st
3
- from anime_recommender.model_trainer.content_based_modelling import ContentBasedRecommender
4
- from anime_recommender.model_trainer.collaborative_modelling import CollaborativeAnimeRecommender
5
- from anime_recommender.model_trainer.top_anime_filtering import PopularityBasedFiltering
6
- import joblib
7
- from anime_recommender.constant import *
8
- from huggingface_hub import hf_hub_download
9
- from datasets import load_dataset
10
-
11
- def run_app():
12
- """
13
- Initializes the Streamlit app, loads necessary datasets and models,
14
- and provides a UI for anime recommendations based on three methods:
15
- Content-Based, Collaborative, and Popularity-Based Filtering. ๐ŸŽฌ๐ŸŽฎ
16
- """
17
-
18
- # Set page configuration
19
- st.set_page_config(page_title="Anime Recommendation System", layout="wide")
20
-
21
- # Load datasets if not present in session state
22
- if "anime_data" not in st.session_state or "anime_user_ratings" not in st.session_state:
23
- # Load datasets from Hugging Face (assuming no splits)
24
- animedataset = load_dataset(ANIME_FILE_PATH, split=None)
25
- mergeddataset = load_dataset(ANIMEUSERRATINGS_FILE_PATH, split=None)
26
-
27
- # Convert the dataset to Pandas DataFrame
28
- st.session_state.anime_data = pd.DataFrame(animedataset["train"])
29
- st.session_state.anime_user_ratings = pd.DataFrame(mergeddataset["train"])
30
-
31
- # Load models only once
32
- if "models_loaded" not in st.session_state:
33
- st.session_state.models_loaded = {}
34
- # Load models
35
- st.session_state.models_loaded["cosine_similarity_model"] = hf_hub_download(MODELS_FILEPATH, MODEL_TRAINER_COSINESIMILARITY_MODEL_NAME)
36
- st.session_state.models_loaded["item_based_knn_model_path"] = hf_hub_download(MODELS_FILEPATH, MODEL_TRAINER_ITEM_KNN_TRAINED_MODEL_NAME)
37
- st.session_state.models_loaded["user_based_knn_model_path"] = hf_hub_download(MODELS_FILEPATH, MODEL_TRAINER_USER_KNN_TRAINED_MODEL_NAME)
38
- st.session_state.models_loaded["svd_model_path"] = hf_hub_download(MODELS_FILEPATH, MODEL_TRAINER_SVD_TRAINED_MODEL_NAME)
39
-
40
- # Load the models using joblib
41
- with open(st.session_state.models_loaded["item_based_knn_model_path"], "rb") as f:
42
- st.session_state.models_loaded["item_based_knn_model"] = joblib.load(f)
43
-
44
- with open(st.session_state.models_loaded["user_based_knn_model_path"], "rb") as f:
45
- st.session_state.models_loaded["user_based_knn_model"] = joblib.load(f)
46
-
47
- with open(st.session_state.models_loaded["svd_model_path"], "rb") as f:
48
- st.session_state.models_loaded["svd_model"] = joblib.load(f)
49
-
50
- print("Models loaded successfully!")
51
-
52
- # Access the data from session state
53
- anime_data = st.session_state.anime_data
54
- anime_user_ratings = st.session_state.anime_user_ratings
55
-
56
- # # Display dataset info
57
- # st.write("Anime Data:")
58
- # st.dataframe(anime_data.head())
59
-
60
- # st.write("Anime User Ratings Data:")
61
- # st.dataframe(anime_user_ratings.head())
62
-
63
- # Access the models from session state
64
- cosine_similarity_model_path = hf_hub_download(MODELS_FILEPATH, MODEL_TRAINER_COSINESIMILARITY_MODEL_NAME)
65
- item_based_knn_model = st.session_state.models_loaded["item_based_knn_model"]
66
- user_based_knn_model = st.session_state.models_loaded["user_based_knn_model"]
67
- svd_model = st.session_state.models_loaded["svd_model"]
68
- print("Models loaded successfully!")
69
-
70
- # Streamlit UI
71
- app_selector = st.sidebar.radio(
72
- "Select App", ("Content-Based Recommender", "Collaborative Recommender", "Top Anime Recommender")
73
- )
74
-
75
- # Content-Based Recommender App
76
- if app_selector == "Content-Based Recommender":
77
- st.title("Content-Based Recommendation System")
78
- try:
79
-
80
- anime_list = anime_data["name"].tolist()
81
- anime_name = st.selectbox("Pick an anime..unlock similar anime recommendations..", anime_list)
82
-
83
- # Set number of recommendations
84
- max_recommendations = min(len(anime_data), 100)
85
- n_recommendations = st.slider("Number of Recommendations", 1, max_recommendations, 10)
86
-
87
- # Inject custom CSS for anime name font size
88
- st.markdown(
89
- """
90
- <style>
91
- .anime-title {
92
- font-size: 14px !important;
93
- font-weight: bold;
94
- text-align: center;
95
- margin-top: 5px;
96
- }
97
- </style>
98
- """,
99
- unsafe_allow_html=True,
100
- )
101
- # Get Recommendations
102
- if st.button("Get Recommendations"):
103
- try:
104
- recommender = ContentBasedRecommender(anime_data)
105
- recommendations = recommender.get_rec_cosine(anime_name, n_recommendations=n_recommendations,model_path=cosine_similarity_model_path)
106
-
107
- if isinstance(recommendations, str):
108
- st.warning(recommendations)
109
- elif recommendations.empty:
110
- st.warning("No recommendations found.๐Ÿง")
111
- else:
112
- st.write(f"Here are the Content-based Recommendations for {anime_name}:")
113
- cols = st.columns(5)
114
- for i, row in enumerate(recommendations.iterrows()):
115
- col = cols[i % 5]
116
- with col:
117
- st.image(row[1]['Image URL'], use_container_width=True)
118
- st.markdown(
119
- f"<div class='anime-title'>{row[1]['Anime name']}</div>",
120
- unsafe_allow_html=True,
121
- )
122
- st.caption(f"Genres: {row[1]['Genres']} | Rating: {row[1]['Rating']}")
123
- except Exception as e:
124
- st.error(f"Unexpected error: {str(e)}")
125
-
126
- except Exception as e:
127
- st.error(f"Unexpected error: {str(e)}")
128
-
129
- elif app_selector == "Collaborative Recommender":
130
- st.title("Collaborative Recommender System ๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘๐Ÿ’ฌ")
131
-
132
- try:
133
- # Sidebar for choosing the collaborative filtering method
134
- collaborative_method = st.sidebar.selectbox(
135
- "Choose a collaborative filtering method:",
136
- ["SVD Collaborative Filtering", "User-Based Collaborative Filtering", "Anime-Based KNN Collaborative Filtering"]
137
- )
138
-
139
- # User input
140
- if collaborative_method == "SVD Collaborative Filtering" or collaborative_method == "User-Based Collaborative Filtering":
141
- user_ids = anime_user_ratings['user_id'].unique()
142
- user_id = st.selectbox("Choose a user, and we'll show you animes they'd recommend", user_ids)
143
- n_recommendations = st.slider("Number of Recommendations:", min_value=1, max_value=50, value=10)
144
- elif collaborative_method == "Anime-Based KNN Collaborative Filtering":
145
- anime_list = anime_user_ratings["name"].dropna().unique().tolist()
146
- anime_name = st.selectbox("Pick an anime, and we'll suggest more titles you'll love", anime_list)
147
- n_recommendations = st.slider("Number of Recommendations:", min_value=1, max_value=50, value=10)
148
-
149
- # Get recommendations
150
- if st.button("Get Recommendations"):
151
- # Load the recommender
152
- recommender = CollaborativeAnimeRecommender(anime_user_ratings)
153
- if collaborative_method == "SVD Collaborative Filtering":
154
- recommendations = recommender.get_svd_recommendations(user_id, n=n_recommendations, svd_model=svd_model)
155
- elif collaborative_method == "User-Based Collaborative Filtering":
156
- recommendations = recommender.get_user_based_recommendations(user_id, n_recommendations=n_recommendations, knn_user_model=user_based_knn_model)
157
- elif collaborative_method == "Anime-Based KNN Collaborative Filtering":
158
- if anime_name:
159
- recommendations = recommender.get_item_based_recommendations(anime_name, n_recommendations=n_recommendations, knn_item_model=item_based_knn_model)
160
- else:
161
- st.error("Invalid Anime Name. Please enter a valid anime title.")
162
-
163
- if isinstance(recommendations, pd.DataFrame) and not recommendations.empty:
164
- if len(recommendations) < n_recommendations:
165
- st.warning(f"Oops...Only {len(recommendations)} recommendations available, fewer than the requested {n_recommendations}.")
166
- st.write(f"Here are the {collaborative_method} Recommendations:")
167
- cols = st.columns(5)
168
- for i, row in enumerate(recommendations.iterrows()):
169
- col = cols[i % 5]
170
- with col:
171
- st.image(row[1]['Image URL'], use_container_width=True)
172
- st.markdown(
173
- f"<div class='anime-title'>{row[1]['Anime Name']}</div>",
174
- unsafe_allow_html=True,
175
- )
176
- st.caption(f"Genres: {row[1]['Genres']} | Rating: {row[1]['Rating']}")
177
- else:
178
- st.error("No recommendations found.")
179
- except Exception as e:
180
- st.error(f"An error occurred: {e}")
181
-
182
- elif app_selector == "Top Anime Recommender":
183
- st.title("Top Anime Recommender System ๐ŸŒŸ๐Ÿ”ฅ")
184
-
185
- try:
186
- popularity_method = st.sidebar.selectbox(
187
- "Choose a Popularity-Based Filtering method:",
188
- [
189
- "Popular Animes",
190
- "Top Ranked Animes",
191
- "Overall Top Rated Animes",
192
- "Favorite Animes",
193
- "Top Animes by Members",
194
- "Popular Anime Among Members",
195
- "Top Average Rated Animes",
196
- ]
197
- )
198
-
199
- n_recommendations = st.slider("Number of Recommendations:", min_value=1, max_value=500 , value=10)
200
-
201
- if st.button("Get Recommendations"):
202
- recommender = PopularityBasedFiltering(anime_data)
203
-
204
- # Get recommendations based on selected method
205
- if popularity_method == "Popular Animes":
206
- recommendations = recommender.popular_animes(n=n_recommendations)
207
- elif popularity_method == "Top Ranked Animes":
208
- recommendations = recommender.top_ranked_animes(n=n_recommendations)
209
- elif popularity_method == "Overall Top Rated Animes":
210
- recommendations = recommender.overall_top_rated_animes(n=n_recommendations)
211
- elif popularity_method == "Favorite Animes":
212
- recommendations = recommender.favorite_animes(n=n_recommendations)
213
- elif popularity_method == "Top Animes by Members":
214
- recommendations = recommender.top_animes_members(n=n_recommendations)
215
- elif popularity_method == "Popular Anime Among Members":
216
- recommendations = recommender.popular_anime_among_members(n=n_recommendations)
217
- elif popularity_method == "Top Average Rated Animes":
218
- recommendations = recommender.top_avg_rated(n=n_recommendations)
219
- else:
220
- st.error("Invalid selection. Please choose a valid method.")
221
- recommendations = None
222
-
223
- # Display recommendations
224
- if isinstance(recommendations, pd.DataFrame) and not recommendations.empty:
225
- st.write(f" Here are the Recommendations:")
226
- cols = st.columns(5)
227
- for i, row in recommendations.iterrows():
228
- col = cols[i % 5]
229
- with col:
230
- st.image(row['Image URL'], use_container_width=True)
231
- st.markdown(
232
- f"<div class='anime-title'>{row['Anime name']}</div>",
233
- unsafe_allow_html=True,
234
- )
235
- st.caption(f"Genres: {row['Genres']} | Rating: {row['Rating']}")
236
- else:
237
- st.error("No recommendations found.")
238
- except Exception as e:
239
- st.error(f"An error occurred: {e}")
240
-
241
- if __name__ == "__main__":
242
  run_app()
 
1
+ import pandas as pd
2
+ import streamlit as st
3
+ from anime_recommender.model_trainer.content_based_modelling import ContentBasedRecommender
4
+ from anime_recommender.model_trainer.collaborative_modelling import CollaborativeAnimeRecommender
5
+ from anime_recommender.model_trainer.top_anime_filtering import PopularityBasedFiltering
6
+ import joblib
7
+ from anime_recommender.constant import *
8
+ from huggingface_hub import hf_hub_download
9
+ from datasets import load_dataset
10
+
11
+ def run_app():
12
+ """
13
+ Initializes the Streamlit app, loads necessary datasets and models,
14
+ and provides a UI for anime recommendations based on three methods:
15
+ Content-Based, Collaborative, and Popularity-Based Filtering. ๐ŸŽฌ๐ŸŽฎ
16
+ """
17
+
18
+ # Set page configuration
19
+ st.set_page_config(page_title="Anime Recommendation System", layout="wide")
20
+
21
+ # Load datasets if not present in session state
22
+ if "anime_data" not in st.session_state or "anime_user_ratings" not in st.session_state:
23
+ # Load datasets from Hugging Face (assuming no splits)
24
+ animedataset = load_dataset(ANIME_FILE_PATH, split=None)
25
+ mergeddataset = load_dataset(ANIMEUSERRATINGS_FILE_PATH, split=None)
26
+
27
+ # Convert the dataset to Pandas DataFrame
28
+ st.session_state.anime_data = pd.DataFrame(animedataset["train"])
29
+ st.session_state.anime_user_ratings = pd.DataFrame(mergeddataset["train"])
30
+
31
+ # Load models only once
32
+ if "models_loaded" not in st.session_state:
33
+ st.session_state.models_loaded = {}
34
+ # Load models
35
+ st.session_state.models_loaded["cosine_similarity_model"] = hf_hub_download(MODELS_FILEPATH, MODEL_TRAINER_COSINESIMILARITY_MODEL_NAME)
36
+ st.session_state.models_loaded["item_based_knn_model_path"] = hf_hub_download(MODELS_FILEPATH, MODEL_TRAINER_ITEM_KNN_TRAINED_MODEL_NAME)
37
+ st.session_state.models_loaded["user_based_knn_model_path"] = hf_hub_download(MODELS_FILEPATH, MODEL_TRAINER_USER_KNN_TRAINED_MODEL_NAME)
38
+ st.session_state.models_loaded["svd_model_path"] = hf_hub_download(MODELS_FILEPATH, MODEL_TRAINER_SVD_TRAINED_MODEL_NAME)
39
+
40
+ # Load the models using joblib
41
+ with open(st.session_state.models_loaded["item_based_knn_model_path"], "rb") as f:
42
+ st.session_state.models_loaded["item_based_knn_model"] = joblib.load(f)
43
+
44
+ with open(st.session_state.models_loaded["user_based_knn_model_path"], "rb") as f:
45
+ st.session_state.models_loaded["user_based_knn_model"] = joblib.load(f)
46
+
47
+ with open(st.session_state.models_loaded["svd_model_path"], "rb") as f:
48
+ st.session_state.models_loaded["svd_model"] = joblib.load(f)
49
+
50
+ print("Models loaded successfully!")
51
+
52
+ # Access the data from session state
53
+ anime_data = st.session_state.anime_data
54
+ anime_user_ratings = st.session_state.anime_user_ratings
55
+
56
+ # # Display dataset info
57
+ # st.write("Anime Data:")
58
+ # st.dataframe(anime_data.head())
59
+
60
+ # st.write("Anime User Ratings Data:")
61
+ # st.dataframe(anime_user_ratings.head())
62
+
63
+ # Access the models from session state
64
+ cosine_similarity_model_path = hf_hub_download(MODELS_FILEPATH, MODEL_TRAINER_COSINESIMILARITY_MODEL_NAME)
65
+ item_based_knn_model = st.session_state.models_loaded["item_based_knn_model"]
66
+ user_based_knn_model = st.session_state.models_loaded["user_based_knn_model"]
67
+ svd_model = st.session_state.models_loaded["svd_model"]
68
+ print("Models loaded successfully!")
69
+
70
+ # Streamlit UI
71
+ app_selector = st.sidebar.radio(
72
+ "Select App", ("Content-Based Recommender", "Collaborative Recommender", "Top Anime Recommender")
73
+ )
74
+
75
+ # Content-Based Recommender App
76
+ if app_selector == "Content-Based Recommender":
77
+ st.title("Content-Based Recommendation System")
78
+ try:
79
+
80
+ anime_list = anime_data["name"].tolist()
81
+ anime_name = st.selectbox("Pick an anime..unlock similar anime recommendations..", anime_list)
82
+
83
+ # Set number of recommendations
84
+ max_recommendations = min(len(anime_data), 100)
85
+ n_recommendations = st.slider("Number of Recommendations", 1, max_recommendations, 10)
86
+
87
+ # Inject custom CSS for anime name font size
88
+ st.markdown(
89
+ """
90
+ <style>
91
+ .anime-title {
92
+ font-size: 14px !important;
93
+ font-weight: bold;
94
+ text-align: center;
95
+ margin-top: 5px;
96
+ }
97
+ </style>
98
+ """,
99
+ unsafe_allow_html=True,
100
+ )
101
+ # Get Recommendations
102
+ if st.button("Get Recommendations"):
103
+ try:
104
+ recommender = ContentBasedRecommender(anime_data)
105
+ recommendations = recommender.get_rec_cosine(anime_name, n_recommendations=n_recommendations,model_path=cosine_similarity_model_path)
106
+
107
+ if isinstance(recommendations, str):
108
+ st.warning(recommendations)
109
+ elif recommendations.empty:
110
+ st.warning("No recommendations found.๐Ÿง")
111
+ else:
112
+ st.write(f"Here are the Content-based Recommendations for {anime_name}:")
113
+ cols = st.columns(5)
114
+ for i, row in enumerate(recommendations.iterrows()):
115
+ col = cols[i % 5]
116
+ with col:
117
+ st.image(row[1]['Image URL'], use_container_width=True)
118
+ st.markdown(
119
+ f"<div class='anime-title'>{row[1]['Anime name']}</div>",
120
+ unsafe_allow_html=True,
121
+ )
122
+ st.caption(f"Genres: {row[1]['Genres']} | Rating: {row[1]['Rating']}")
123
+ except Exception as e:
124
+ st.error(f"Unexpected error: {str(e)}")
125
+
126
+ except Exception as e:
127
+ st.error(f"Unexpected error: {str(e)}")
128
+
129
+ elif app_selector == "Collaborative Recommender":
130
+ st.title("Collaborative Recommender System ๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘๐Ÿ’ฌ")
131
+
132
+ try:
133
+ # Sidebar for choosing the collaborative filtering method
134
+ collaborative_method = st.sidebar.selectbox(
135
+ "Choose a collaborative filtering method:",
136
+ ["SVD Collaborative Filtering", "User-Based Collaborative Filtering", "Anime-Based KNN Collaborative Filtering"]
137
+ )
138
+
139
+ # User input
140
+ if collaborative_method == "SVD Collaborative Filtering" or collaborative_method == "User-Based Collaborative Filtering":
141
+ user_ids = anime_user_ratings['user_id'].unique()
142
+ user_id = st.selectbox("Select your MyAnimeList user ID to get anime recommendations based on similar users", user_ids)
143
+ n_recommendations = st.slider("Number of Recommendations:", min_value=1, max_value=50, value=10)
144
+ elif collaborative_method == "Anime-Based KNN Collaborative Filtering":
145
+ anime_list = anime_user_ratings["name"].dropna().unique().tolist()
146
+ anime_name = st.selectbox("Pick an anime, and we'll suggest more titles you'll love", anime_list)
147
+ n_recommendations = st.slider("Number of Recommendations:", min_value=1, max_value=50, value=10)
148
+
149
+ # Get recommendations
150
+ if st.button("Get Recommendations"):
151
+ # Load the recommender
152
+ recommender = CollaborativeAnimeRecommender(anime_user_ratings)
153
+ if collaborative_method == "SVD Collaborative Filtering":
154
+ recommendations = recommender.get_svd_recommendations(user_id, n=n_recommendations, svd_model=svd_model)
155
+ elif collaborative_method == "User-Based Collaborative Filtering":
156
+ recommendations = recommender.get_user_based_recommendations(user_id, n_recommendations=n_recommendations, knn_user_model=user_based_knn_model)
157
+ elif collaborative_method == "Anime-Based KNN Collaborative Filtering":
158
+ if anime_name:
159
+ recommendations = recommender.get_item_based_recommendations(anime_name, n_recommendations=n_recommendations, knn_item_model=item_based_knn_model)
160
+ else:
161
+ st.error("Invalid Anime Name. Please enter a valid anime title.")
162
+
163
+ if isinstance(recommendations, pd.DataFrame) and not recommendations.empty:
164
+ if len(recommendations) < n_recommendations:
165
+ st.warning(f"Oops...Only {len(recommendations)} recommendations available, fewer than the requested {n_recommendations}.")
166
+ st.write(f"Here are the {collaborative_method} Recommendations:")
167
+ cols = st.columns(5)
168
+ for i, row in enumerate(recommendations.iterrows()):
169
+ col = cols[i % 5]
170
+ with col:
171
+ st.image(row[1]['Image URL'], use_container_width=True)
172
+ st.markdown(
173
+ f"<div class='anime-title'>{row[1]['Anime Name']}</div>",
174
+ unsafe_allow_html=True,
175
+ )
176
+ st.caption(f"Genres: {row[1]['Genres']} | Rating: {row[1]['Rating']}")
177
+ else:
178
+ st.error("No recommendations found.")
179
+ except Exception as e:
180
+ st.error(f"An error occurred: {e}")
181
+
182
+ elif app_selector == "Top Anime Recommender":
183
+ st.title("Top Anime Recommender System ๐Ÿ”ฅ")
184
+
185
+ try:
186
+ popularity_method = st.sidebar.selectbox(
187
+ "Choose a Popularity-Based Filtering method:",
188
+ [
189
+ "Popular Animes",
190
+ "Top Ranked Animes",
191
+ "Overall Top Rated Animes",
192
+ "Favorite Animes",
193
+ "Top Animes by Members",
194
+ "Popular Anime Among Members",
195
+ "Top Average Rated Animes",
196
+ ]
197
+ )
198
+
199
+ n_recommendations = st.slider("Number of Recommendations:", min_value=1, max_value=500 , value=10)
200
+
201
+ if st.button("Get Recommendations"):
202
+ recommender = PopularityBasedFiltering(anime_data)
203
+
204
+ # Get recommendations based on selected method
205
+ if popularity_method == "Popular Animes":
206
+ recommendations = recommender.popular_animes(n=n_recommendations)
207
+ elif popularity_method == "Top Ranked Animes":
208
+ recommendations = recommender.top_ranked_animes(n=n_recommendations)
209
+ elif popularity_method == "Overall Top Rated Animes":
210
+ recommendations = recommender.overall_top_rated_animes(n=n_recommendations)
211
+ elif popularity_method == "Favorite Animes":
212
+ recommendations = recommender.favorite_animes(n=n_recommendations)
213
+ elif popularity_method == "Top Animes by Members":
214
+ recommendations = recommender.top_animes_members(n=n_recommendations)
215
+ elif popularity_method == "Popular Anime Among Members":
216
+ recommendations = recommender.popular_anime_among_members(n=n_recommendations)
217
+ elif popularity_method == "Top Average Rated Animes":
218
+ recommendations = recommender.top_avg_rated(n=n_recommendations)
219
+ else:
220
+ st.error("Invalid selection. Please choose a valid method.")
221
+ recommendations = None
222
+
223
+ # Display recommendations
224
+ if isinstance(recommendations, pd.DataFrame) and not recommendations.empty:
225
+ st.write(f" Here are the Recommendations:")
226
+ cols = st.columns(5)
227
+ for i, row in recommendations.iterrows():
228
+ col = cols[i % 5]
229
+ with col:
230
+ st.image(row['Image URL'], use_container_width=True)
231
+ st.markdown(
232
+ f"<div class='anime-title'>{row['Anime name']}</div>",
233
+ unsafe_allow_html=True,
234
+ )
235
+ st.caption(f"Genres: {row['Genres']} | Rating: {row['Rating']}")
236
+ else:
237
+ st.error("No recommendations found.")
238
+ except Exception as e:
239
+ st.error(f"An error occurred: {e}")
240
+
241
+ if __name__ == "__main__":
242
  run_app()