import streamlit as st import pandas as pd import numpy as np from sklearn.metrics.pairwise import cosine_similarity books = pd.read_csv("books.csv") books["Book-Title"] = books["Book-Title"] + " by " + books["Book-Author"] weighted_similarity = np.load("weighted_similarity.npy") def recommend_books(input_books, top_n=5): recommended_books_set = set() book_vectors = [] for book_title in input_books: if book_title in books['Book-Title'].values: book_index = books[books['Book-Title'] == book_title].index[0] book_vectors.append(weighted_similarity[book_index]) # Sum the vectors summed_vector = np.sum(book_vectors, axis=0) # Calculate cosine similarity cosine_sim = cosine_similarity(summed_vector.reshape(1, -1), weighted_similarity) # Get top book indices top_books_indices = cosine_sim.argsort()[0][-top_n - 1:-1][::-1] recommended_books_set.update(books.loc[top_books_indices, 'Book-Title']) recommended_books_list = list(recommended_books_set)[:top_n] return recommended_books_list st.title("Multi-Modal Book Recommendation") st.write("Book Recommender is an open-source application designed to enhance the book selection process. By incorporating user ratings, publication years, author names, book descriptions, and cover photos, Book Recommender employs cosine similarity to provide personalized book recommendations. Interested individuals can access project on [GitHub](https://github.com/egecandrsn/multimodal_book_recommendation) to explore its functionalities. Future plans include considering neural collaborative filtering for improved recommendation accuracy.") search = st.multiselect("Pick your favorites:", options=books['Book-Title'].unique()) if search: cols = st.columns(len(search)) for i, book_title in enumerate(search): with cols[i]: try: book_image_url = books.loc[books['Book-Title'] == book_title, 'Image-URL-L'].values cols[i].image(book_image_url[0], width=150) except: cols[i].warning(f"No image available for {book_title}") recommend = st.button("Recommend") if recommend: recommended_books = recommend_books(search) st.write("Recommended Books:") columns = st.columns(5) for i, book_title in enumerate(recommended_books, start=1): with columns[i-1]: book_image_url = books.loc[books['Book-Title'] == book_title, 'Image-URL-L'].values try: columns[i-1].image(book_image_url[0], caption=book_title, width=150) except: columns[i-1].warning(f"No image available for {book_title}")