2026/1/9 18:44:03
网站建设
项目流程
成都设计网站建设,公司网站突然404,做网站开发要装什么软件,惠州建设局官方网站音乐推荐系统 基于协同过滤的音乐推荐系统 基于用户画像的音乐推荐系统
使用基于协同过滤与用户画像相结合的方法#xff0c;为用户推荐音乐#xff0c;同时实现注册、登陆、搜索音乐等多种功能
后台管理员可以实现增删改查等多种功能
使用的数据集为kaggle平台上的公开数据集…音乐推荐系统 基于协同过滤的音乐推荐系统 基于用户画像的音乐推荐系统 使用基于协同过滤与用户画像相结合的方法为用户推荐音乐同时实现注册、登陆、搜索音乐等多种功能 后台管理员可以实现增删改查等多种功能 使用的数据集为kaggle平台上的公开数据集拥有超过3000万首音乐曲目。 采用pythonDjango框架实现 数据库采用mysql 前端采用htmlcssjs音乐推荐系统这玩意儿听起来玄乎实际拆解起来就是让机器学会猜你喜欢什么歌。这次咱们用PythonDjango搞了个能同时玩转协同过滤和用户画像的推荐系统光数据库就存了3000万条音乐数据光看这数字我都觉得硬盘在哀嚎。先说用户模块Django自带的auth模块省了不少事但注册时得让用户选几个喜欢的音乐类型。这里用了个骚操作——直接在注册页面用JS动态加载标签云// 前端标签选择 document.getElementById(genreCloud).innerHTML [流行, 摇滚, 电子].map(genre span classgenre-tag onclicktoggleSelect(this)${genre}/span ).join();后台处理注册请求时得把用户选择的标签存进MySQL的user_profile表。这里注意别用Django的默认User模型咱们得扩展个Profileclass UserProfile(models.Model): user models.OneToOneField(User, on_deletemodels.CASCADE) favorite_genres models.JSONField(defaultlist) # 存成[pop,rock]格式 last_played models.ForeignKey(Song, nullTrue, on_deletemodels.SET_NULL)推荐算法这块最有意思。协同过滤直接用surprise库但得先处理千万级数据。这里有个坑——直接加载CSV会内存爆炸得用生成器逐批处理# 数据处理 def get_dataset(): with open(ratings.csv, r) as f: next(f) # 跳过表头 for line in f: user_id, song_id, rating line.strip().split(,)[:3] yield (user_id, song_id, float(rating)) # 创建Trainset时改用生成器 data Dataset.load_from_folds(get_dataset(), readerReader(line_formatuser item rating)) algo SVD() for trainset, testset in data.folds(): algo.train(trainset)用户画像部分更讲究实时性用Redis缓存用户最近播放记录。当用户点击播放时后台立马更新他的画像权重# 播放事件处理 def handle_play(user_id, song): r redis.StrictRedis() key fuser:{user_id}:prefs # 增加流派权重 for genre in song.genres: r.zincrby(key, 1, genre) # 记录相似用户 similar_users User.objects.filter(favorite_genres__containssong.genres) r.sadd(fuser:{user_id}:similar, *[u.id for u in similar_users])前后端联调时最头疼的是推荐结果的实时加载。用AJAX轮询太low换成WebSocket才带劲。Django Channels配置起来略麻烦但效果拔群// 前端实时推荐 const ws new WebSocket(ws://localhost:8000/recommend/); ws.onmessage function(e) { const songs JSON.parse(e.data); document.querySelector(#recommendations).innerHTML songs.map(s div classsong-card${s.title}/div).join(); };最后给管理员留了个后门——在Django admin里可以直接编辑歌曲信息但得重写delete_queryset方法防止误删# admin.py class SongAdmin(admin.ModelAdmin): def delete_queryset(self, request, queryset): for obj in queryset: obj.is_active False # 软删除 obj.save()这系统跑起来后最魔幻的是当你深夜听电子音乐时推荐列表会突然蹦出上世纪八十年代的迪斯科金曲——别怀疑这就是协同过滤和用户画像在battle呢