Spaces:
Runtime error
Runtime error
Commit
·
f11c347
1
Parent(s):
48c6649
app files
Browse files- .idea/.gitignore +8 -0
- Dockerfile +12 -0
- books.pkl +3 -0
- main.py +76 -0
- popular_books.pkl +3 -0
- pt.pkl +3 -0
- requirements.txt +4 -0
- similarity_scores.pkl +3 -0
- templates/all.html +58 -0
- templates/index.html +66 -0
- templates/recommend.html +73 -0
.idea/.gitignore
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Default ignored files
|
2 |
+
/shelf/
|
3 |
+
/workspace.xml
|
4 |
+
# Editor-based HTTP Client requests
|
5 |
+
/httpRequests/
|
6 |
+
# Datasource local storage ignored files
|
7 |
+
/dataSources/
|
8 |
+
/dataSources.local.xml
|
Dockerfile
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
FROM python:3.9
|
2 |
+
|
3 |
+
WORKDIR /code
|
4 |
+
|
5 |
+
COPY ./requirements.txt /code/requirements.txt
|
6 |
+
|
7 |
+
RUN pip python.exe -m pip install --upgrade pip
|
8 |
+
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
|
9 |
+
|
10 |
+
COPY . .
|
11 |
+
|
12 |
+
CMD ["gunicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
|
books.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:016d6dfd03e12b3ea03e517b958bd9057027c6b4358f171731ce13471e9299de
|
3 |
+
size 71737055
|
main.py
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from flask import Flask, render_template, request, jsonify
|
2 |
+
|
3 |
+
import pandas as pd
|
4 |
+
import numpy as np
|
5 |
+
|
6 |
+
# Load your data
|
7 |
+
popular_df = pd.read_pickle("popular_books.pkl")
|
8 |
+
pt = pd.read_pickle("pt.pkl")
|
9 |
+
books = pd.read_pickle("books.pkl")
|
10 |
+
similarity_scores = pd.read_pickle("similarity_scores.pkl")
|
11 |
+
|
12 |
+
app = Flask(__name__)
|
13 |
+
|
14 |
+
|
15 |
+
# Function to retrieve book suggestions based on user input
|
16 |
+
def get_suggestions(query):
|
17 |
+
# Replace this with your logic to fetch book suggestions
|
18 |
+
# For example, you can search for book titles or authors that match the query
|
19 |
+
suggestions = []
|
20 |
+
for title in books["Book-Title"]:
|
21 |
+
if query.lower() in title.lower():
|
22 |
+
suggestions.append(title)
|
23 |
+
return suggestions
|
24 |
+
|
25 |
+
|
26 |
+
@app.route("/")
|
27 |
+
def home():
|
28 |
+
return render_template("index.html", book_name=popular_df["Book-Title"].to_list(),
|
29 |
+
author_name=popular_df["Book-Author"].to_list(),
|
30 |
+
image=popular_df["Image-URL-M"].to_list(),
|
31 |
+
votes=popular_df["num_ratings"].to_list(),
|
32 |
+
rating=popular_df["avg_ratings"].to_list()
|
33 |
+
)
|
34 |
+
|
35 |
+
|
36 |
+
@app.route("/recommend")
|
37 |
+
def recommend_ui():
|
38 |
+
return render_template("recommend.html")
|
39 |
+
|
40 |
+
|
41 |
+
@app.route('/recommend_books', methods=['post'])
|
42 |
+
def recommend():
|
43 |
+
user_input = request.form.get('user_input')
|
44 |
+
index = np.where(pt.index == user_input)[0][0]
|
45 |
+
similar_items = sorted(list(enumerate(similarity_scores[index])), key=lambda x: x[1], reverse=True)[1:5]
|
46 |
+
|
47 |
+
data = []
|
48 |
+
for i in similar_items:
|
49 |
+
item = []
|
50 |
+
temp_df = books[books['Book-Title'] == pt.index[i[0]]]
|
51 |
+
item.extend(temp_df.drop_duplicates('Book-Title')['Book-Title'].to_list())
|
52 |
+
item.extend(temp_df.drop_duplicates('Book-Title')['Book-Author'].to_list())
|
53 |
+
item.extend(temp_df.drop_duplicates('Book-Title')['Image-URL-M'].to_list())
|
54 |
+
|
55 |
+
data.append(item)
|
56 |
+
|
57 |
+
return render_template('recommend.html', data=data)
|
58 |
+
|
59 |
+
|
60 |
+
@app.route("/books", methods=["GET"])
|
61 |
+
def all_books():
|
62 |
+
return render_template("all.html", book_name=books["Book-Title"].to_list(),
|
63 |
+
author_name=books["Book-Author"].to_list(),
|
64 |
+
image=books["Image-URL-M"].to_list()
|
65 |
+
)
|
66 |
+
|
67 |
+
|
68 |
+
@app.route('/get_suggestions')
|
69 |
+
def suggestions():
|
70 |
+
query = request.args.get('query')
|
71 |
+
suggestions = get_suggestions(query)
|
72 |
+
return jsonify(suggestions)
|
73 |
+
|
74 |
+
|
75 |
+
if __name__ == "__main__":
|
76 |
+
app.run(debug=True)
|
popular_books.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:8862d266fb9a8c51da5dd7d9e2be1ac10045fe902ee0f0a6b24d362719301823
|
3 |
+
size 14235
|
pt.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:f661040b419c55d55e158a18856b2a76efe02f7e3670da09fb9922e87bf59291
|
3 |
+
size 14030021
|
requirements.txt
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
gunicorn
|
2 |
+
pandas
|
3 |
+
numpy
|
4 |
+
flask
|
similarity_scores.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:aeff922803acddd309426db6a91cfd087649a3819db5d660ff25e0597c53e072
|
3 |
+
size 3987651
|
templates/all.html
ADDED
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html lang="en">
|
3 |
+
<head>
|
4 |
+
<meta charset="UTF-8">
|
5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6 |
+
<title>Book Recommender System</title>
|
7 |
+
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
|
8 |
+
<style>
|
9 |
+
.book-card {
|
10 |
+
margin-top: 20px;
|
11 |
+
}
|
12 |
+
</style>
|
13 |
+
</head>
|
14 |
+
<body>
|
15 |
+
|
16 |
+
<header>
|
17 |
+
<nav class="navbar navbar-expand-lg bg-light">
|
18 |
+
<div class="container">
|
19 |
+
<a class="navbar-brand" href="/">Book Recommender System</a>
|
20 |
+
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
|
21 |
+
data-bs-target="#navbarSupportedContent"
|
22 |
+
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
23 |
+
<span class="navbar-toggler-icon"></span>
|
24 |
+
</button>
|
25 |
+
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
26 |
+
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
|
27 |
+
<li class="nav-item">
|
28 |
+
<a class="nav-link active" aria-current="page" href="/">Home</a>
|
29 |
+
</li>
|
30 |
+
<li class="nav-item">
|
31 |
+
<a class="nav-link active" aria-current="page" href="/recommend">Recommend</a>
|
32 |
+
</li>
|
33 |
+
<li class="nav-item">
|
34 |
+
<a class="nav-link active" aria-current="page" href="/books">All Books</a>
|
35 |
+
</li>
|
36 |
+
</ul>
|
37 |
+
</div>
|
38 |
+
</div>
|
39 |
+
</nav>
|
40 |
+
</header>
|
41 |
+
|
42 |
+
<main>
|
43 |
+
<div class="container">
|
44 |
+
{% for i in range(book_name|length) %}
|
45 |
+
<div class="col-md-3 book-card">
|
46 |
+
<div class="card-body">
|
47 |
+
<img src="{{ image[i] }}" alt="Book Cover">
|
48 |
+
<h6 style="margin-top: 20px">{{ book_name[i] }}</h6>
|
49 |
+
<p>{{ author_name[i] }}</p>
|
50 |
+
</div>
|
51 |
+
</div>
|
52 |
+
{% endfor %}
|
53 |
+
</div>
|
54 |
+
</main>
|
55 |
+
|
56 |
+
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js"></script>
|
57 |
+
</body>
|
58 |
+
</html>
|
templates/index.html
ADDED
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html lang="en">
|
3 |
+
<head>
|
4 |
+
<meta charset="UTF-8">
|
5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6 |
+
<title>Book Recommender System</title>
|
7 |
+
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
|
8 |
+
<style>
|
9 |
+
.book-card {
|
10 |
+
margin-top: 50px;
|
11 |
+
}
|
12 |
+
</style>
|
13 |
+
</head>
|
14 |
+
<body>
|
15 |
+
|
16 |
+
<header>
|
17 |
+
<nav class="navbar navbar-expand-lg bg-light">
|
18 |
+
<div class="container">
|
19 |
+
<a class="navbar-brand" href="/">Book Recommender System</a>
|
20 |
+
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
|
21 |
+
data-bs-target="#navbarSupportedContent"
|
22 |
+
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
23 |
+
<span class="navbar-toggler-icon"></span>
|
24 |
+
</button>
|
25 |
+
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
26 |
+
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
|
27 |
+
<li class="nav-item">
|
28 |
+
<a class="nav-link active" aria-current="page" href="/">Home</a>
|
29 |
+
</li>
|
30 |
+
<li class="nav-item">
|
31 |
+
<a class="nav-link active" aria-current="page" href="/recommend">Recommend</a>
|
32 |
+
</li>
|
33 |
+
<li class="nav-item">
|
34 |
+
<a class="nav-link active" aria-current="page" href="/books">All Books</a>
|
35 |
+
</li>
|
36 |
+
</ul>
|
37 |
+
</div>
|
38 |
+
</div>
|
39 |
+
</nav>
|
40 |
+
</header>
|
41 |
+
|
42 |
+
<main>
|
43 |
+
<div class="container">
|
44 |
+
<div class="row">
|
45 |
+
<div class="col-md-12">
|
46 |
+
<h1 style="font-size: 50px">Top 100 Books</h1>
|
47 |
+
</div>
|
48 |
+
|
49 |
+
{% for i in range(book_name|length) %}
|
50 |
+
<div class="col-md-3 book-card">
|
51 |
+
<div class="card-body">
|
52 |
+
<img src="{{ image[i] }}" alt="Book Cover">
|
53 |
+
<h6 style="margin-top: 20px">{{ book_name[i] }}</h6>
|
54 |
+
<p>{{ author_name[i] }}</p>
|
55 |
+
<p><b>Votes:</b> {{ votes[i] }}</p>
|
56 |
+
<p><b>Ratings:</b> {{ "%.2f"%rating[i] }}</p>
|
57 |
+
</div>
|
58 |
+
</div>
|
59 |
+
{% endfor %}
|
60 |
+
</div>
|
61 |
+
</div>
|
62 |
+
</main>
|
63 |
+
|
64 |
+
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js"></script>
|
65 |
+
</body>
|
66 |
+
</html>
|
templates/recommend.html
ADDED
@@ -0,0 +1,73 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html lang="en">
|
3 |
+
<head>
|
4 |
+
<meta charset="UTF-8">
|
5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6 |
+
<title>Book Recommender System</title>
|
7 |
+
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
|
8 |
+
<style>
|
9 |
+
.book-card {
|
10 |
+
margin-top: 50px;
|
11 |
+
}
|
12 |
+
</style>
|
13 |
+
</head>
|
14 |
+
<body>
|
15 |
+
|
16 |
+
<header>
|
17 |
+
<nav class="navbar navbar-expand-lg bg-light">
|
18 |
+
<div class="container">
|
19 |
+
<a class="navbar-brand" href="/">Book Recommender System</a>
|
20 |
+
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
|
21 |
+
data-bs-target="#navbarSupportedContent"
|
22 |
+
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
23 |
+
<span class="navbar-toggler-icon"></span>
|
24 |
+
</button>
|
25 |
+
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
26 |
+
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
|
27 |
+
<li class="nav-item">
|
28 |
+
<a class="nav-link active" aria-current="page" href="/">Home</a>
|
29 |
+
</li>
|
30 |
+
<li class="nav-item">
|
31 |
+
<a class="nav-link active" aria-current="page" href="/recommend">Recommend</a>
|
32 |
+
</li>
|
33 |
+
<li class="nav-item">
|
34 |
+
<a class="nav-link active" aria-current="page" href="/books">All Books</a>
|
35 |
+
</li>
|
36 |
+
</ul>
|
37 |
+
</div>
|
38 |
+
</div>
|
39 |
+
</nav>
|
40 |
+
</header>
|
41 |
+
|
42 |
+
|
43 |
+
<main>
|
44 |
+
<div class="container">
|
45 |
+
<div class="row">
|
46 |
+
<div class="col-md-12">
|
47 |
+
<h1 style="font-size: 50px">Recommend Books</h1>
|
48 |
+
<form action="/recommend_books" method="post">
|
49 |
+
<input name="user_input" type="text" class="form-control"><br>
|
50 |
+
<input type="submit" class="btn btn-lg btn-warning">
|
51 |
+
</form>
|
52 |
+
</div>
|
53 |
+
|
54 |
+
{% if data %}
|
55 |
+
{% for i in data %}
|
56 |
+
<div class="col-md-3" style="margin-top:50px">
|
57 |
+
<div class="card-body">
|
58 |
+
<img src="{{ i[2] }}">
|
59 |
+
<p>{{ i[0] }}</p>
|
60 |
+
<h4>{{ i[1] }}</h4>
|
61 |
+
</div>
|
62 |
+
</div>
|
63 |
+
{% endfor %}
|
64 |
+
|
65 |
+
{% endif %}
|
66 |
+
|
67 |
+
|
68 |
+
</div>
|
69 |
+
</div>
|
70 |
+
</main>
|
71 |
+
|
72 |
+
</body>
|
73 |
+
</html>
|