pranavagrawal commited on
Commit
f11c347
·
1 Parent(s): 48c6649
.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>