import streamlit as st import pickle import pandas as pd import numpy as np popular_dict = pickle.load(open('popular_dict.pkl', 'rb')) pt = pickle.load(open('pt.pkl', 'rb')) books_dict = pickle.load(open('books_dict.pkl', 'rb')) similarity_scores = pickle.load(open('similarity_scores.pkl', 'rb')) popular_df = pd.DataFrame(popular_dict) books = pd.DataFrame(books_dict) st.title('Book Recommendation System') st.write('This is a simple book recommendation system based on the content of the book and the popularity of the book. ' 'Select a book from the dropdown below to get recommendations.') def recommend_books(book_name): if book_name not in pt.index: return [] index = np.where(pt.index == book_name)[0][0] similar_items = sorted(list(enumerate(similarity_scores[index])), key=lambda x: x[1], reverse=True)[1:5] data = [] for i in similar_items: item = [] temp_df = books[books['Book-Title'] == pt.index[i[0]]] popular_df1 = popular_df[popular_df['Book-Title'] == pt.index[i[0]]] item.extend(list(temp_df.drop_duplicates('Book-Title')['Book-Title'].values)) item.extend(list(temp_df.drop_duplicates('Book-Title')['Book-Author'].values)) item.extend(list(temp_df.drop_duplicates('Book-Title')['Image-URL-L'].values)) if not popular_df1.empty: item.extend(list(popular_df1.drop_duplicates('Book-Title')['num_ratings'].values)) item.extend(list(popular_df1.drop_duplicates('Book-Title')['avg_rating'].values.round(2))) else: item.extend([None, None]) # Placeholder for missing ratings and avg_rating data.append(item) return data book_name = st.selectbox('Select a book', pt.index) recommendations = recommend_books(book_name) if recommendations: st.write(f"Recommendations based on '{book_name}':") for i in recommendations: st.image(i[2], caption=i[0]) st.write('Author:', i[1]) st.write('Number of Ratings:', i[3] if i[3] is not None else 'Not Available') st.write('Average Rating:', i[4] if i[4] is not None else 'Not Available') st.write('---------------------------------') else: st.write(f"No recommendations found for '{book_name}'.")