Repository navigation
Expand file tree
/
Copy pathMain.py
More file actions
59 lines (49 loc) · 2.28 KB
/
Copy pathMain.py
File metadata and controls
59 lines (49 loc) · 2.28 KB
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
import numpy as np
import pandas as pd
from typing import List, Dict
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
songs = pd.read_csv('songdata.csv')
songs.head()
songs = songs.sample(n=5000).drop('link', axis=1).reset_index(drop=True)
songs['text'] = songs['text'].str.replace(r'\n', '')
tfidf = TfidfVectorizer(analyzer='word', stop_words='english')
lyrics_matrix = tfidf.fit_transform(songs['text'])
cosine_similarities = cosine_similarity(lyrics_matrix)
similarities = {}
for i in range(len(cosine_similarities)):
# Now we'll sort each element in cosine_similarities and get the indexes of the songs.
similar_indices = cosine_similarities[i].argsort()[:-50:-1]
# After that, we'll store in similarities each name of the 50 most similar songs.
# Except the first one that is the same song.
similarities[songs['song'].iloc[i]] = [(cosine_similarities[i][x], songs['song'][x], songs['artist'][x]) for x in similar_indices][1:]
class ContentBasedRecommender:
def __init__(self, matrix):
self.matrix_similar = matrix
def _print_message(self, song, recom_song):
rec_items = len(recom_song)
print(f'The {rec_items} recommended songs for {song} are:')
for i in range(rec_items):
print(f"Number {i+1}:")
print(f"{recom_song[i][1]} by {recom_song[i][2]} with {round(recom_song[i][0], 3)} similarity score")
print("--------------------")
def recommend(self, recommendation):
# Get song to find recommendations for
song = recommendation['song']
# Get number of songs to recommend
number_songs = recommendation['number_songs']
# Get the number of songs most similars from matrix similarities
recom_song = self.matrix_similar[song][:number_songs]
# print each item
self._print_message(song=song, recom_song=recom_song)
recommedations = ContentBasedRecommender(similarities)
recommendation = {
"song": songs['song'].iloc[10],
"number_songs": 4
}
recommedations.recommend(recommendation)
recommendation2 = {
"song": songs['song'].iloc[120],
"number_songs": 4
}
recommedations.recommend(recommendation2)