Обычно существует три типа системы рекомендаций:
- Совместная фильтрация
- Фильтрация на основе содержания
- Гибридные системы рекомендаций
Совместная фильтрация:
Совместная фильтрация – это метод, позволяющий отфильтровывать элементы, которые могут понравиться пользователю, на основе реакции похожих пользователей. Он работает, ища большую группу людей и находя меньший набор пользователей со вкусами, похожими на конкретного пользователя. Для иллюстрации: если Джону нравятся элементы A, B, C и D, а Майку нравятся элементы A, B и C. , ему, скорее всего, также понравится пункт D.
Контентная фильтрация:
Фильтрация на основе содержания,также называемая когнитивной фильтрацией, рекомендует элементы на основе сравнения содержимого элементов и профиля пользователя. Содержимое каждого элемента представлено в виде набора дескрипторов или терминов, обычно слов, встречающихся в документе.
Гибридные рекомендательные системы:
Гибридные рекомендательные системы используют как представление контента, так и сходство между пользователями. Netflix является примером гибридного механизма рекомендаций, объединяющего данные о привычках похожих пользователей и сходных характеристиках с контентом, ранее понравившимся пользователю, чтобы предоставить потрясающие рекомендации фильмов.
Система музыкальных рекомендаций с использованием алгоритма KNN:
В k-ближайших соседях точки данных, которые находятся рядом друг с другом, называются «соседями». K-ближайшие соседи основаны на этой парадигме: «Подобные случаи с одинаковыми метками классов находятся рядом друг с другом». Таким образом, расстояние между двумя случаями является мерой их непохожести.
Импорт библиотек и чтение данных
import pandas as pd from google.colab import drive drive.mount('/content/drive') # to import data from google drive path = "/content/drive/My Drive/Music Recommendation/song_data.csv" # read data from song_data.csv file song_data = pd.read_csv(path, usecols=['user_id','song_id','listen_count','title','artist','song'] ,dtype={'user_id':'str','song_id':'str','listen_count':'int32', 'title':'str','artist':'str','song':'str'})
Показать данные
song_data.head(10)
Оптимизировать данные (выбрать и сохранить только необходимые данные)
# to fetch only required column from dataset song_data = song_data[['song','listen_count']] # use groupby().sum() to make 'song' column unique and to count # it's respective sum of listen_count song_data = song_data.groupby('song').sum() # now sort above data by descending order of listen_count song_data.sort_values(by=['listen_count'], inplace=True, ascending=False) # reset index of changed data song_data = song_data.reset_index()
Список оптимизированных данных
song_data.head(10)
Внедрить KNN и дать рекомендации
На этом этапе я использую алгоритм KNN, чтобы дать рекомендацию, используя значение k=10 (10 лучших песен рекомендации, основанные на песне, которую ищет пользователь) и метод евклидова расстояния для расчета расстояния между точкой (песней) с использованием данных listen_count. например, после расчета расстояния от всех песен, 10 самых близких (самых низких) расстояний будут рекомендованы пользователю.
# function to recommend new songs def Music_Recommendation(song_name, k): # to convert dataframe into array song_list = (song_data['song']).to_list() # to check if song selected by user is available? if song_name in song_list : print("Song "+"'"+song_name+"'"+" is available") song_index = (song_list.index(song_name)) # total listen count of the song which is selected by user song_listen_count = (song_data['listen_count'].iloc[song_index]) new_distance_list = [] for i in range(len(song_data)): if i != song_index : # calculate euclidean distance abs_distance = abs(song_listen_count -song_data['listen_count'][i]) new_distance_list.append([abs_distance,song_data['song'][i]]) # to sort distance list by ascending order new_distance_list = sorted(new_distance_list) print("Top " + str(k) + " Recommendation for you.......") for i in range(k): print(i+1,")",new_distance_list[i][1]) else: print("Song "+"'"+song_name+"'"+" is not available") print("Top " + str(k) + " Recommendation for you.......") recommend_song = song_data[['song']].head(k) for i in range(k): print(i+1,")",recommend_song['song'][i]) k = 10 Music_Recommendation('Trahison By Vitalic', k)
Вывод (список 10 лучших рекомендуемых песен)
Github: https://github.com/17IT089/Music-Recommendation-System