Spaces:
Sleeping
Sleeping
| 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]) | |