Python打造个性化音乐推荐引擎

在这个信息爆炸的时代,如何从海量的音乐中找到自己喜欢的歌曲,成为了许多音乐爱好者的难题。今天,我们将用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爬虫教程PDF,Python爬虫书PDF

2026年09月02日

31阅读

外国教程python,python编程教学视频

2026年09月02日

25阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

26阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

22阅读