File size: 2,265 Bytes
a3ddd02
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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.")