
毕业设计:音乐推荐系统 深度学习数据分析 可视化 requests爬虫 TensorFlow 推荐算法 Django框架
技术栈:python语言、django框架、Echarts可视化、requests爬虫技术、HTML、深度学习、TensorFlow、推荐算法、千千音乐网站、音乐播放功能首页:展示了数据概况,包括统计数据、音乐类型分析、歌曲发布时间分析、歌曲时长分析等,帮助用户了解平台的整体情况和音乐趋势。音乐推荐:根据用户的听歌历史和偏好,智能推荐歌曲,提升用户体验。歌曲列表:展示了平台上的所有歌曲,用户可以通
1、项目介绍
技术栈:
python语言、django框架、Echarts可视化、requests爬虫技术、HTML、深度学习、TensorFlow、推荐算法、千千音乐网站、音乐播放功能
首页:展示了数据概况,包括统计数据、音乐类型分析、歌曲发布时间分析、歌曲时长分析等,帮助用户了解平台的整体情况和音乐趋势。
音乐推荐:根据用户的听歌历史和偏好,智能推荐歌曲,提升用户体验。
歌曲列表:展示了平台上的所有歌曲,用户可以通过搜索或浏览的方式找到自己喜欢的歌曲。
歌单歌曲列表:用户可以根据自己的喜好创建或加入歌单,方便管理和分享歌曲。
音乐播放:提供了音乐播放功能,用户可以在线收听歌曲,享受音乐带来的愉悦。
音乐评论:用户可以对歌曲进行评论和打分,与其他用户分享听歌感受。
歌曲评分:用户可以对歌曲进行打分,系统会根据打分情况对歌曲进行排序和推荐。
我的收藏:用户可以收藏自己喜欢的歌曲或歌单,方便以后再次收听。
音乐类型选择分析:通过图表的形式展示了不同音乐类型的分布情况,帮助用户了解平台的音乐类型偏好。
歌曲词云图分析:利用词云图展示了歌曲中的关键词和热门词汇,帮助用户了解歌曲的主题和情感。
历史播放记录:记录了用户的播放历史,方便用户回顾和继续收听之前的歌曲。
注册登录:提供了用户注册和登录功能,保护用户数据安全,同时方便用户管理自己的个人信息和偏好。
后台数据管理:管理员可以通过后台管理系统对平台上的数据进行管理和维护,包括歌曲信息、用户信息、评论数据等。
2、项目界面
(1)首页—数据概况(统计数据、音乐类型分析、歌曲发布时间分析、歌曲时长分析)
3、项目说明
一、技术栈
前端:使用了HTML进行页面布局和设计,同时结合了Echarts进行数据可视化,使得统计数据和分析结果能够以图表的形式直观展现。
后端:基于Python语言和Django框架开发,Django提供了强大的路由管理、模板渲染和用户认证等功能,使得后端开发更加高效和稳定。
爬虫技术:利用requests库进行数据抓取,可以从千千音乐网站等音乐平台上获取歌曲信息、歌词等数据,为系统的音乐库提供丰富的资源。
深度学习:通过TensorFlow等深度学习框架,实现了智能音乐推荐功能,能够根据用户的听歌历史和偏好,为其推荐相似的歌曲。
推荐算法:除了深度学习外,还可能结合了其他推荐算法,如协同过滤、基于内容的推荐等,以进一步提升推荐的准确性和多样性。
二、功能模块
首页:展示了数据概况,包括统计数据、音乐类型分析、歌曲发布时间分析、歌曲时长分析等,帮助用户了解平台的整体情况和音乐趋势。
音乐推荐:根据用户的听歌历史和偏好,智能推荐歌曲,提升用户体验。
歌曲列表:展示了平台上的所有歌曲,用户可以通过搜索或浏览的方式找到自己喜欢的歌曲。
歌单歌曲列表:用户可以根据自己的喜好创建或加入歌单,方便管理和分享歌曲。
音乐播放:提供了音乐播放功能,用户可以在线收听歌曲,享受音乐带来的愉悦。
音乐评论:用户可以对歌曲进行评论和打分,与其他用户分享听歌感受。
歌曲评分:用户可以对歌曲进行打分,系统会根据打分情况对歌曲进行排序和推荐。
我的收藏:用户可以收藏自己喜欢的歌曲或歌单,方便以后再次收听。
音乐类型选择分析:通过图表的形式展示了不同音乐类型的分布情况,帮助用户了解平台的音乐类型偏好。
歌曲词云图分析:利用词云图展示了歌曲中的关键词和热门词汇,帮助用户了解歌曲的主题和情感。
历史播放记录:记录了用户的播放历史,方便用户回顾和继续收听之前的歌曲。
注册登录:提供了用户注册和登录功能,保护用户数据安全,同时方便用户管理自己的个人信息和偏好。
后台数据管理:管理员可以通过后台管理系统对平台上的数据进行管理和维护,包括歌曲信息、用户信息、评论数据等。
三、总结
该系统是一个集音乐播放、数据分析、智能推荐和用户互动于一体的综合性音乐平台。通过先进的技术栈和丰富的功能模块,为用户提供了优质的听歌体验和便捷的数据分析服务。同时,后台管理系统的引入也保证了平台数据的稳定性和安全性。无论是音乐爱好者还是数据分析师,都能在该系统中找到属于自己的乐趣和价值。
4、核心代码
from django.shortcuts import render
import json
from user.models import User, CollectSong, HistorySong, RateSong, CommentSong
from music.models import Song, SongSheet, SongType
from utils import homeUtilsFn, recommendationTensorflow
# Create your views here.
def home(request):
username = request.session.get('username')
userInfo = User.objects.get(username=username)
typeList = homeUtilsFn.getSongTypeList()
HotSongSheetList = homeUtilsFn.getHotSongSheetData()[:8]
TopData10 = homeUtilsFn.getTopData10()
a = 0
for i in TopData10:
a += 1
i.num = a
# print(recommentList)
recommendList = homeUtilsFn.get_default_recommend()
# print(recommendList)
try:
computeList = recommendationTensorflow.predict(userInfo.id)
recommendList = computeList + recommendList[len(computeList):]
# print(computeList)
except:
pass
return render(request, 'index.html', {
'userInfo': userInfo,
'typeList': typeList,
'recommendList': recommendList,
'HotSongSheetList': HotSongSheetList,
'TopData10': TopData10,
})
def music(request, id):
username = request.session.get('username')
userInfo = User.objects.get(username=username)
# print(id)
# 获取指定ID的歌曲信息
musicInfo = Song.objects.get(songId=id)
# 初始化标志位,假设用户未收藏该歌曲
flag = True
# 获取当前用户的历史歌曲收藏记录
userHistoryList = HistorySong.objects.filter(user=userInfo)
# 遍历用户的历史收藏记录
for collect in userHistoryList:
# 如果用户已经收藏了这首歌曲
if collect.song.songId == int(id):
flag = False
break
# 如果用户没有收藏这首歌曲,flag保持为True
# 如果标志位为True,说明用户未收藏该歌曲,创建新的收藏记录
if flag:
HistorySong.objects.create(user=userInfo, song_id=int(id))
if request.method == 'POST':
# 创建新的评论对象
CommentSong.objects.create(
user=userInfo, # 假设userInfo是已经定义的用户实例
song=musicInfo, # musicInfo是歌曲的实例
content=request.POST.get('content') # 从POST请求中获取评论内容
)
# 获取该歌曲的所有评论
CommentList = CommentSong.objects.filter(song=musicInfo)
return render(request, 'music.html', {
'userInfo': userInfo,
'musicInfo': musicInfo,
'songId': id,
'CommentList': CommentList,
})
# 歌单类型
def songSheetList(request):
username = request.session.get('username')
userInfo = User.objects.get(username=username)
typeList = homeUtilsFn.getSongTypeList()
defaultType = int(typeList[0].SongTypeId)
if request.GET.get('defaultType'):
defaultType = int(request.GET.get('defaultType'))
typeId = homeUtilsFn.getSongTypeList(defaultType)
# print(typeId)
songSheet = SongSheet.objects.filter(song_type=typeId)[::-1]
# print(songSheet)
return render(request, 'songSheetList.html', {
'userInfo': userInfo,
'songSheetList': songSheet,
'typeList': typeList,
'defaultType': defaultType,
})
# 歌曲
def songSheetDetail(request, id):
# 从session中获取当前登录的用户名
username = request.session.get('username')
userInfo = User.objects.get(username=username) # 获取用户信息
songSheet = SongSheet.objects.get(sheetId=id) # 获取歌单信息
# 获取当前歌单的类型,并转换标签列表
song_type = songSheet.song_type
tagList = json.loads(song_type.tagList) # 将标签列表转换为Python字典
# 获取该歌单的歌曲列表
songList = homeUtilsFn.getSongBysheet(id)
# print(songList)
userCollectList = CollectSong.objects.filter(user=userInfo) # 获取用户收藏的歌曲列表
def map_fn(item):
item.status = False
for i in userCollectList:
if i.song.songId == item.songId:
item.status = True
break
return item
songList = list(map(map_fn, songList))
# 渲染模板,并传递变量
return render(request, 'songSheetDetail.html', {
'userInfo': userInfo,
'songList': songList,
'songSheet': songSheet,
'userCollectList': userCollectList,
'tagList': tagList,
})
# 搜索
def search(request):
username = request.session.get('username')
userInfo = User.objects.get(username=username)
if request.method == 'POST':
searchWord = request.POST.get('searchWord')
resultData = Song.objects.filter(title__icontains=searchWord)
return render(request, 'search.html', {
'userInfo': userInfo,
'resultData': resultData
})
else:
return render(request, 'search.html', {
'userInfo': userInfo
})
# 歌曲基础数据
def basicData(request):
username = request.session.get('username')
userInfo = User.objects.get(username=username)
sumMusic, sumUser, maxSinger, maxType = homeUtilsFn.gerOrdinary()
lineX, lineY, x2Data, y2Data = homeUtilsFn.getSongType()
timeList = homeUtilsFn.getMusicTime()
durationX, durationY = homeUtilsFn.getSquareData()
return render(request, 'basicData.html', {
'userInfo': userInfo,
'sumMusic': sumMusic,
'sumUser': sumUser,
'maxSinger': maxSinger,
'maxType': maxType,
'lineX': lineX,
'lineY': lineY,
'timeList': timeList,
'durationX': durationX,
'durationY': durationY,
})
# 歌曲类型查歌手
def typeData(request):
username = request.session.get('username')
userInfo = User.objects.get(username=username)
lineX, lineY, x2Data, y2Data = homeUtilsFn.getSongType()
defaultType = x2Data[0]
if request.method == 'POST':
defaultType = request.POST.get('type')
singerX, singerY = homeUtilsFn.getsingerNum(defaultType)
# print(defaultType)
return render(request, 'typeData.html', {
'userInfo': userInfo,
'x2Data': x2Data,
'singerX': singerX,
'singerY': singerY
})
# 歌曲标题词云图
def titleCloud(request):
username = request.session.get('username')
userInfo = User.objects.get(username=username)
return render(request, 'titleCloud.html', {
'userInfo': userInfo,
})
# 歌曲标题词云图
def singerCloud(request):
username = request.session.get('username')
userInfo = User.objects.get(username=username)
return render(request, 'singerCloud.html', {
'userInfo': userInfo,
})
5、源码获取方式
🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅
感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻
更多推荐
所有评论(0)