Sourudra's picture
Upload 6 files
c360375 verified
import pickle
import streamlit as st
import numpy as np
# Load artifacts
model = pickle.load(open('artifacts/model.pkl', 'rb'))
book_names = pickle.load(open('artifacts/book_names.pkl', 'rb'))
final_rating = pickle.load(open('artifacts/final_rating.pkl', 'rb'))
book_pivot = pickle.load(open('artifacts/book_pivot.pkl', 'rb'))
# Function to fetch poster URLs
def fetch_poster(suggestion):
book_name = []
ids_index = []
poster_url = []
for book_id in suggestion:
book_name.append(book_pivot.index[book_id])
for name in book_name[0]:
ids = np.where(final_rating['title'] == name)[0][0]
ids_index.append(ids)
for idx in ids_index:
url = final_rating.iloc[idx]['image_url']
poster_url.append(url)
return poster_url
# Function to recommend books
def recommend_book(book_name):
books_list = []
book_id = np.where(book_pivot.index == book_name)[0][0]
distance, suggestion = model.kneighbors(book_pivot.iloc[book_id, :].values.reshape(1, -1), n_neighbors=4)
poster_url = fetch_poster(suggestion)
for i in range(len(suggestion[0])):
book = book_pivot.index[suggestion[0][i]]
books_list.append(book)
return books_list[1:], poster_url[1:] # Skip the input book itself
# Apply custom CSS for glassmorphism
def local_css(file_name):
with open(file_name) as f:
st.markdown(f'<style>{f.read()}</style>', unsafe_allow_html=True)
# Page configuration
st.set_page_config(page_title='Book Recommendation System', layout='centered')
# Load CSS for styling
local_css("style.css")
# Add a fancy header with emojis
st.markdown("""
<div class="glass">
<h1>📚Book Finder📚</h1>
<p>Let AI find your perfect book match.</p>
</div>
""", unsafe_allow_html=True)
# Centered dropdown for book selection with glass effect
st.markdown("""
<div class="glass">
<p>🔎 Type or select a book from the dropdown</p>
</div>
""", unsafe_allow_html=True)
# Dropdown for book selection
selected_books = st.selectbox("", book_names)
# Apply custom button styling to Streamlit's default button using CSS
st.markdown("""
<style>
.stButton > button {
background: linear-gradient(135deg, #8B5E3C, #B8860B); /* Warm vintage gold-brown gradient */
border: none;
color: white; /* White text */
padding: 12px 24px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
margin: 10px 5px;
cursor: pointer;
border-radius: 12px; /* Rounded corners for a soft vintage touch */
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.25); /* Soft, deep shadow for antique feel */
font-family: 'Georgia', serif; /* Classic serif font for the button */
text-transform: uppercase; /* Uppercase text for a formal touch */
}
.stButton > button:hover {
background: linear-gradient(135deg, #704214, #B8860B); /* Slightly darker gold-brown */
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3); /* Stronger shadow for depth on hover */
transform: translateY(-2px); /* Lift effect */
}
</style>
""", unsafe_allow_html=True)
# Streamlit button with custom styling applied
if st.button('Show Recommendation', key='show_recommendation_button'):
recommended_books, poster_url = recommend_book(selected_books)
# Display recommendations in a grid
st.markdown("<h3>Recommended Books:</h3>", unsafe_allow_html=True)
col1, col2, col3 = st.columns(3)
with col1:
st.markdown(f"<div class='glass'><p>{recommended_books[0]}</p></div>", unsafe_allow_html=True)
st.image(poster_url[0])
with col2:
st.markdown(f"<div class='glass'><p>{recommended_books[1]}</p></div>", unsafe_allow_html=True)
st.image(poster_url[1])
with col3:
st.markdown(f"<div class='glass'><p>{recommended_books[2]}</p></div>", unsafe_allow_html=True)
st.image(poster_url[2])