Python打造个性化音乐推荐引擎
在这个信息爆炸的时代,如何从海量的音乐中找到自己喜欢的歌曲,成为了许多音乐爱好者的难题。今天,我们将用Python语言,打造一个个性化的音乐推荐引擎,帮助你轻松发现心仪的音乐。

项目背景
音乐推荐系统早已不是新鲜事物,但市面上的推荐算法往往千篇一律,难以满足个性化的需求。我们的目标是开发一个基于用户喜好和音乐特征的双向推荐引擎,让每一次推荐都精准触达用户的心。
技术选型
为了实现这一目标,我们将采用以下技术栈:
- 数据存储:使用SQLite数据库存储用户信息和音乐数据。
- 特征提取:利用Librosa库提取音乐的音频特征。
- 推荐算法:基于协同过滤和内容推荐的混合模型。
数据准备
首先,我们需要构建一个包含用户信息和音乐数据的数据库。假设我们已有以下数据表:
CREATE TABLE users (
user_id INTEGER PRIMARY KEY,
username TEXT NOT NULL
);
CREATE TABLE songs (
song_id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
artist TEXT NOT NULL,
genre TEXT,
audio_file_path TEXT NOT NULL
);
CREATE TABLE ratings (
user_id INTEGER,
song_id INTEGER,
rating INTEGER,
FOREIGN KEY(user_id) REFERENCES users(user_id),
FOREIGN KEY(song_id) REFERENCES songs(song_id)
);
特征提取
使用Librosa库提取音乐的音频特征,如梅尔频谱、节奏等:
import librosa
import numpy as np
def extract_features(audio_file_path):
y, sr = librosa.load(audio_file_path)
mfcc = librosa.feature.mfcc(y=y, sr=sr)
chroma = librosa.feature.chroma_stft(y=y, sr=sr)
return np.concatenate((np.mean(mfcc, axis=1), np.mean(chroma, axis=1)))
推荐算法
协同过滤
基于用户的历史评分数据,计算用户之间的相似度,推荐相似用户喜欢的歌曲:
from sklearn.metrics.pairwise import cosine_similarity
def user_based_recommendation(user_id, num_recommendations=5):
user_ratings = pd.read_sql_query("SELECT * FROM ratings WHERE user_id = ?", conn, params=(user_id,))
all_ratings = pd.read_sql_query("SELECT * FROM ratings", conn)
user_similarity = cosine_similarity(all_ratings.pivot(index='user_id', columns='song_id', values='rating').fillna(0))
similar_users = user_similarity[user_id].argsort()[-num_recommendations-1:-1]
recommended_songs = []
for similar_user in similar_users:
recommended_songs.extend(all_ratings[all_ratings['user_id'] == similar_user]['song_id'].tolist())
return list(set(recommended_songs))[:num_recommendations]
内容推荐
基于音乐的音频特征,推荐与用户喜欢的歌曲相似的歌曲:
def content_based_recommendation(user_id, num_recommendations=5):
user_ratings = pd.read_sql_query("SELECT * FROM ratings WHERE user_id = ?", conn, params=(user_id,))
liked_songs = user_ratings[user_ratings['rating'] > 3]['song_id'].tolist()
song_features = {}
for song_id in liked_songs:
audio_file_path = pd.read_sql_query("SELECT audio_file_path FROM songs WHERE song_id = ?", conn, params=(song_id,))['audio_file_path'][0]
song_features[song_id] = extract_features(audio_file_path)
all_songs = pd.read_sql_query("SELECT * FROM songs", conn)
all_song_features = {song_id: extract_features(row['audio_file_path']) for index, row in all_songs.iterrows()}
recommended_songs = []
for song_id, features in all_song_features.items():
if song_id not in liked_songs:
similarity = cosine_similarity([features], [song_features[liked_song] for liked_song in liked_songs])
recommended_songs.append((song_id, np.mean(similarity)))
recommended_songs.sort(key=lambda x: x[1], reverse=True)
return [song_id for song_id, score in recommended_songs[:num_recommendations]]
混合推荐
结合协同过滤和内容推荐的结果,给出最终的推荐列表:
def hybrid_recommendation(user_id, num_recommendations=5):
user_based_songs = user_based_recommendation(user_id, num_recommendations)
content_based_songs = content_based_recommendation(user_id, num_recommendations)
combined_songs = list(set(user_based_songs + content_based_songs))
return combined_songs[:num_recommendations]
总结
通过以上步骤,我们成功构建了一个基于Python的音乐推荐引擎。它不仅考虑了用户的历史行为
« 上一篇
Python在线活动推广助手:轻松策划,高效执行
下一篇 »
用Python构建在线摄影社区平台