import streamlit as st import pandas as pd from utils import * # Assuming data is loaded and matrices are prepared as discussed def load_data(): ratings = pd.read_csv('./collaborative_books_df.csv', index_col=0) books = pd.read_csv('./collaborative_book_metadata.csv', index_col=0) # book_titles=pd.read_csv('./data/book_titles.csv', index_col=0) # book_titles = book_titles.reset_index() # Merge data ratings = ratings.merge(books, on='book_id') book_titles = dict(zip(ratings['book_id'], ratings['title_x'])) return ratings, books,book_titles def initialize_session_state(): if "ratings" not in st.session_state: st.session_state.ratings, st.session_state.books, st.session_state.book_titles = load_data() st.session_state.X, st.session_state.user_mapper, st.session_state.book_mapper, st.session_state.user_inv_mapper, st.session_state.book_inv_mapper = create_matrix(st.session_state.ratings) st.session_state.book_id_mapping = pd.Series( st.session_state.books.book_id.values, index= st.session_state.books.title).to_dict() initialize_session_state() # Streamlit interface for book recommendation st.title('Book Recommender System') # User inputs title_input = st.selectbox('Select or type a book title', st.session_state.books['title'].unique()) k_input = st.number_input('How many recommendations do you want?', min_value=1, max_value=20, value=5) if st.button('Find Similar Books'): if title_input in st.session_state.book_id_mapping: book_id = st.session_state.book_id_mapping[title_input] distances, similar_ids = find_similar_books(book_id, st.session_state.X, k=k_input,book_mapper= st.session_state.book_mapper,book_inv_mapper= st.session_state.book_inv_mapper) similar_books = pd.DataFrame({ 'Book Title': [ st.session_state.book_titles[ids] for ids in similar_ids], 'Distance': distances[0][1:] }) st.write(f"Books similar to {title_input}:") st.dataframe(similar_books.sort_values(by='Distance', ascending=True)) else: st.error("Book title not found. Please check the spelling or try another title.")