-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.py
66 lines (52 loc) · 2.05 KB
/
main.py
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
from flask import Flask,request, render_template
import pickle
import numpy as np
import pandas as pd
app = Flask(__name__)
KMeansModel = pickle.load(open('models/KMeansModel.pkl','rb'))
KNNModel = pickle.load(open('models/KnnModel.pkl','rb'))
@app.route('/')
def hello_world():
return render_template("music.html")
@app.route('/predict',methods=['POST'])
def recommend(): #recommends the song
song_name = [str(x) for x in request.form.values()]
features =get_features(song_name[0])
if features == -1:
return render_template('music.html', pred = "Song Not Found")
features = np.array([features])
cluster_number = KMeansModel.predict(features)
print(cluster_number)
result = ClusterIndicesNumpy(cluster_number, KMeansModel.labels_)
n = 10
inter_neigh=set()
while len(inter_neigh) < 7:
neighbor = KNNModel.kneighbors(features,n_neighbors=n, return_distance=False)
neighbor = neighbor.flatten()
inter_neigh = np.intersect1d(neighbor, result)
n += 100
recommended_list = getNames(inter_neigh[:7])
recommended_list = [song.capitalize() for song in recommended_list]
print(recommended_list)
return render_template('music.html',lst = recommended_list)
def ClusterIndicesNumpy(clustNum, labels_array):
return np.where(labels_array == clustNum)[0]
def get_features(song_name): # Getting Features on basis of Song Name
song_data = pd.read_csv('dataset/song_data.csv')
for song in song_data.index:
if song_data['name'][song] == song_name:
pred_data = [song_data['genre_ids'][song],song_data['language'][song]]
break
else:
pred_data = -1
return pred_data
def getNames(index_list):
song_data = pd.read_csv('dataset/song_data.csv')
names = []
for value in index_list:
print(song_data['name'][value])
names.append(song_data['name'][value])
print(names)
return names
if __name__ == '__main__':
app.run(debug=True)