RaviRaj988/Entertainment_Engine_Content_based_recommender_system
0
1import re2import pandas as pd3import streamlit as st4import requests5import random6import nltk7nltk.download('all') 8from nltk.corpus import stopwords9import cloudpickle10import pickle11from urllib.request import urlopen12 13 14final_df = pd.read_csv('final_df.csv')15global similarity_bert16global similarity_bag_of_Words17global similarity_with_tf_idf_word_2_vec18global similarity_with_word_2_vec19global tf_idf_similarities20similarity = {'similarity_bert':'',21 'similarity_bag_of_Words':'',22 'tf_idf_similarities':'',23 'similarity_with_word_2_vec':'',24 'similarity_with_tf_idf_word_2_vec':''}25 26model_sentiment = pickle.load(open('model_sentiment.pkl','rb'))27tf_idf_vectorizer = pickle.load(open('tf_idf_vectorizer.pkl','rb'))28 29 30def find_closest(text):31 text = text.strip()32 new_text = text.split(' ')33 for word in new_text[:]:34 if word in stopwords.words('english'):35 new_text.remove(word)36 index = random.randint(0,len(new_text)-1)37 text = new_text[index]38 spliteer = final_df['title_y'].str.split(' ')39 i = 040 for val in spliteer.to_list():41 if text in val:42 break43 i+=144 return i45 46def recommend(movie,model):47 result = []48 movie = movie.lower()49 titles = final_df['title_y'].str.lower().to_list()50 51 if movie in titles:52 index = final_df.loc[final_df['title_y'].str.lower() == movie].index[0]53 else:54 index = find_closest(movie)55 if index==4800:56 raise ValueError('Please Enter a correct movie name so that we can recommend properly Please recheck')57 if(model == 'bert'):58 similarity_bert = similarity['similarity_bert']59 distances = sorted(list(enumerate(similarity_bert[index])),reverse=True,key = lambda x: x[1])60 61 elif(model=='bag_of_words'):62 st.write(similarity['similarity_bag_of_Words'])63 similarity_bag_of_Words = similarity['similarity_bag_of_Words']64 distances = sorted(list(enumerate(similarity_bag_of_Words[index])), reverse=True,key = lambda x: x[1])65 66 elif(model=='tf-idf'):67 tf_idf_similarities = similarity['tf_idf_similarities']68 distances = sorted(list(enumerate(tf_idf_similarities[index])), reverse=True,key = lambda x: x[1])69 70 elif(model=='word2vec'):71 similarity_with_word_2_vec = similarity['similarity_with_word_2_vec']72 distances = sorted(list(enumerate(similarity_with_word_2_vec[index])), reverse=True,key = lambda x: x[1])73 74 elif(model=='tf-idf+word2vec'):75 similarity_with_tf_idf_word_2_vec = similarity['similarity_with_tf_idf_word_2_vec']76 distances = sorted(list(enumerate(similarity_with_tf_idf_word_2_vec[index])), reverse=True,key = lambda x: x[1])77 78 for i in distances[0:6]:79 result.append([final_df.iloc[i[0]].id, final_df.iloc[i[0]].title_y])80 return result81 82def main():83 st.set_page_config(layout="wide")84 html_footer = """85 <style>86 .footer {87 position: fixed;88 bottom: 0%;89 left: 0%;90 margin: 0px, 0px, 0px, 0px;91 text-align: center;92 width: 99%;93 }94 </style>95 <div class = 'footer'>96 <p>Copyright(c)Tushar Nautiyal 2022</p>97 </div>98 99 """100 st.markdown(html_footer,unsafe_allow_html=True)101 hide_footer_style = """102 <style>103 .css-2ykyy6 { 104 visibility: hidden;105 }106 </style> 107 """108 st.markdown(hide_footer_style, unsafe_allow_html=True)109 110 #We will use session states. This will help in saving models once loaded so that for one instance you don't have to do downloads again. 111 112 113 with st.form("my_form"):114 st.title('Movie Recommeder System')115 st.text('You Can Switch Between models to see the performance of recommendation')116 st.markdown('We have used Bag of Words ,**BERT** specifically **(multi-qa-MiniLM-L6-cos-v1)** , **TF-IDF**, and implemented **TF-IDF + Word2Vec** Model Check repo to understand better. By Default the Flow is in BERT if you want to swith select a model from below. This recommender system is a content base recommendation system.')117 model = st.selectbox('Select A Model Procedure',('Bert', 'Bag of Words','TF-IDF','Word2Vec','TF-IDF + Word2Vec'))118 query = st.text_input('Enter Any Movie Name or something related to that movie')119 submitted = st.form_submit_button("RECOMMEND")120 121 if st.session_state.get('button') != True:122 st.session_state['button'] = submitted # Saved the state123 124 125 if st.session_state['button'] == True:126 if(model=='Bert'):127 model= 'bert'128 if 'similarity_bert' not in st.session_state:129 with st.spinner('Wait Model is Loading.....Till Then How much you like movies'):130 st.session_state.similarity_bert = ''131 similarity['similarity_bert'] = cloudpickle.load(urlopen('https://drive.google.com/uc?export=download&id=131DguHzk9ZF6AGNozHRawwdFupgycqUT'))132 st.session_state.similarity_bert = similarity['similarity_bert']133 else:134 similarity['similarity_bert'] = st.session_state['similarity_bert']135 st.success(f'Done!')136 137 138 elif(model == 'Bag of Words'):139 model = 'bag_of_words'140 141 if 'similarity_bag_of_Words' not in st.session_state:142 with st.spinner('Wait Model is Loading.....Till Then How much you like movies'):143 st.session_state.similarity_bag_of_Words = ''144 similarity['similarity_bag_of_Words'] = cloudpickle.load(urlopen('https://drive.google.com/uc?export=download&id=1o7pWZfaku_43do0beNfOI6Pz9JeAM6n3&confirm=t&uuid=ccc39f37-f727-49fb-8a30-c9214b30e5f3'))145 st.session_state['similarity_bag_of_Words'] = similarity['similarity_bag_of_Words']146 else:147 similarity['similarity_bag_of_Words'] = st.session_state['similarity_bag_of_Words']148 st.success(f'Done!')149 150 151 elif(model == 'TF-IDF'):152 model = 'tf-idf'153 154 if 'tf_idf_similarities' not in st.session_state:155 with st.spinner('Wait Model is Loading.....Till Then How much you like movies'):156 st.session_state.tf_idf_similarities = ''157 similarity['tf_idf_similarities'] = cloudpickle.load(urlopen("https://drive.google.com/uc?export=download&id=1ZcL60svASwVrLoAgBnj43tM8i9IkES_E&confirm=t&uuid=e38591c2-777b-490e-a574-700b33ea642e"))158 st.session_state.tf_idf_similarities = similarity['tf_idf_similarities']159 else:160 similarity['tf_idf_similarities'] = st.session_state.tf_idf_similarities161 st.success(f'Done!')162 163 elif(model == 'TF-IDF + Word2Vec'):164 model = 'tf-idf+word2vec'165 if 'similarity_with_tf_idf_word_2_vec' not in st.session_state:166 with st.spinner('Wait Model is Loading.....Till Then How much you like movies?'):167 st.session_state.similarity_with_tf_idf_word_2_vec = ''168 similarity['similarity_with_tf_idf_word_2_vec'] = cloudpickle.load(urlopen("https://drive.google.com/uc?export=download&id=1Ykoqty6n9uXn1oBXRCjuFr6mnqUuIVq6&confirm=t&uuid=12d331b1-5ff7-4c7b-92eb-884dfd7525ab"))169 st.session_state.similarity_with_tf_idf_word_2_vec = similarity['similarity_with_tf_idf_word_2_vec']170 else:171 similarity['similarity_with_tf_idf_word_2_vec'] = st.session_state.similarity_with_tf_idf_word_2_vec172 st.success(f'Done!')173 174 175 elif(model == 'Word2Vec'):176 model = 'word2vec'177 if 'similarity_with_word_2_vec' not in st.session_state:178 with st.spinner('Wait Model is Loading.....Till Then How much you like movies'):179 st.session_state.similarity_with_word_2_vec = ''180 similarity['similarity_with_word_2_vec'] = cloudpickle.load(urlopen("https://drive.google.com/uc?export=download&id=1dpWQotH3TEPVyJTaBonwTILY3DCtTodb"))181 st.session_state.similarity_with_word_2_vec = similarity['similarity_with_word_2_vec']182 else:183 similarity['similarity_with_word_2_vec'] = st.session_state.similarity_with_word_2_vec184 st.success(f'Done!')185 186 output_images = []187 output_names = []188 if query!=None:189 res = recommend(query,model)190 if len(res)<=1:191 raise TypeError("Hi Looks Like The Query You have entered iam not able to find Please Try Again dont add spaces during the start of the text or Don't Add special characters like @ - # etc")192 for ele in res:193 image = requests.get(f'https://api.themoviedb.org/3/movie/{ele[0]}/images?api_key=81428e7817728a742c8e842120989817')194 data = image.json()195 data = data['backdrops'][0]['file_path']196 output_images.append('http://image.tmdb.org/t/p/w500/'+data)197 output_names.append(ele[1])198 199 col1, col2, col3 = st.columns(3)200 with col1:201 st.image(output_images[0])202 st.markdown(output_names[0].upper())203 review = st.text_input(f"How much you liked the movie {output_names[0]}",key='review1')204 btn0 = st.button('submit',key = 'btn0')205 if btn0:206 review = re.sub('[^a-zA-Z0-9 ]','',review)207 review = tf_idf_vectorizer.transform([review])208 ans = model_sentiment.predict(review)209 if ans == 0:210 review = 'Thanks for your positive review'211 else:212 review = 'Sorry for your negative review'213 st.write(review)214 with col2:215 st.image(output_images[1])216 st.markdown(output_names[1].upper())217 review = st.text_input(f"How much you liked the movie {output_names[1]}",key='review2')218 btn1 = st.button('submit',key = 'btn1')219 if btn1:220 review = re.sub('[^a-zA-Z0-9 ]','',review)221 review = tf_idf_vectorizer.transform([review])222 ans = model_sentiment.predict(review)223 if ans == 0:224 review = 'Thanks for your positive review'225 else:226 review = 'Sorry for your negative review'227 st.write(review)228 229 with col3:230 st.image(output_images[2])231 st.markdown(output_names[2].upper())232 review = st.text_input(f"How much you liked the movie {output_names[2]}",key='review3')233 btn2 = st.button('submit',key = 'btn2')234 if btn2:235 review = re.sub('[^a-zA-Z0-9 ]','',review)236 review = tf_idf_vectorizer.transform([review])237 ans = model_sentiment.predict(review)238 if ans == 0:239 review = 'Thanks for your positive review'240 else:241 review = 'Sorry for your negative review'242 st.write(review)243 244 col4, col5, col6 = st.columns(3)245 246 with col4:247 st.image(output_images[3])248 st.markdown(output_names[3].upper())249 review = st.text_input(f"How much you liked the movie {output_names[3]}",key='review4')250 if st.button('submit',key='btn3'):251 review = re.sub('[^a-zA-Z0-9 ]','',review)252 review = tf_idf_vectorizer.transform([review])253 ans = model_sentiment.predict(review)254 if ans == 0:255 review = 'Thanks for your positive review'256 else:257 review = 'Sorry for your negative review'258 st.write(review)259 260 with col5:261 st.image(output_images[4])262 st.markdown(output_names[4].upper())263 review = st.text_input(f"How much you liked the movie {output_names[4]}",key='review5')264 if st.button('submit',key='btn4'):265 review = re.sub('[^a-zA-Z0-9 ]','',review)266 review = tf_idf_vectorizer.transform([review])267 ans = model_sentiment.predict(review)268 if ans == 0:269 review = 'Thanks for your positive review'270 else:271 review = 'Sorry for your negative review'272 st.write(review)273 274 with col6:275 st.image(output_images[5])276 st.markdown(output_names[5].upper())277 review = st.text_input(f"How much you liked the movie {output_names[5]}",key='review6')278 if st.button('submit',key = 'btn5'):279 review = re.sub('[^a-zA-Z0-9 ]','',review)280 review = tf_idf_vectorizer.transform([review])281 ans = model_sentiment.predict(review)282 if ans == 0:283 review = 'Thanks for your positive review'284 else:285 review = 'Sorry for your negative review'286 st.write(review)287 288 289if __name__ == '__main__':290 main()