使用的是<推荐系统开发实战>源码, 官方复现说明可参考公众号搜索与推荐Wiki( 微信号: SearchAndRecWiki )

之前看到这篇有几个同学评论说数据库导入报错, 是下载的源码不对, 重新下载官方给出的源码即可

https://drive.google.com/drive/folders/1z17hFhdM253W1UKLtHPKEVQ0jZKQlodN

Vue环境搭建:

Node.js,版本为10.13

没找到,官网推荐10.16

https://www.cnblogs.com/zhaomeizi/p/8483597.html

在https://nodejs.org/en/下载,安装node,改变安装盘符、默认安装4项

二、设置nodejs prefix(全局)和cache(缓存)路径

1、在nodejs安装路径下,新建node_global和node_cache两个文件夹

2、设置缓存文件夹

npm config set cache "D:\Program Files\nodejs\node_cache"

 设置全局模块存放路径

npm config set prefix "D:\Program Files\nodejs\node_global"

设置成功后,之后用命令npm install XXX -g安装以后模块就在D:\vueProject\nodejs\node_global里

三、基于 Node.js 安装cnpm(淘宝镜像)

npm install -g cnpm --registry=https://registry.npm.taobao.org

四、设置环境变量

说明:设置环境变量可以使得住任意目录下都可以使用cnpm、vue等命令,而不需要输入全路径

1、鼠标右键"此电脑",选择“属性”菜单,在弹出的“系统”对话框中左侧选择“高级系统设置”,弹出“系统属性”对话框。

2、修改系统变量PATH

五、安装Vue

cnpm install vue -g

六、安装vue命令行工具,即vue-cli 脚手架

cnpm install vue-cli -g

七、新项目的创建

1.打开存放新建项目的文件夹,弹出命令提示符

2.根据模版创建新项目

在当前目录下输入“vue init webpack-simple 项目名称(使用英文)”。

vue init webpack-simple mytest

3、安装工程依赖模块

定位到mytest的工程目录下,安装该工程依赖的模块,这些模块将被安装在:mytest\node_module目录下,node_module文件夹会被新建,而且根据package.json的配置下载该项目的modules

cd mytest

cnpm install

4、运行该项目,测试一下该项目是否能够正常工作,这种方式是用nodejs来启动。

cnpm run dev

后端搭建

activate MusicRec

cd /d D:\anacondaProject\MusicRec\z-others\files

pip install -r requirement.txt

运行说明

mysql新建musicrec数据库,将MusicRecSys/MusicRec/z-others/files/musicrec.sql 文件导入

修改 MusicRecSys/MusicRec/MusicRec/settings.py 文件中的ALLOWED_HOSTS为本地IP地址和本地mysql配置信息

修改 MusicRecSys/MusicRec-Vue/config/index.js 中的 serverUrl

修改 MusicRecSys/MusicRec-Vue/src/assets/js/linkBase.js 中的 serverUrl

进入 MusicRecSys/MusicRec 执行python manage.py runserver 0.0.0.0:8000

activate MusicRec

cd /d D:\anacondaProject\MusicRec

python manage.py runserver 0.0.0.0:8000

进入 MusicRecSys/MusicRec-Vue 执行npm install / npm run dev

cd /d D:\Workspaces\Vue\MusicRec-Vue

输入

npm install

npm run dev

浏览器输入 http://127.0.0.1:8001 访问

npm install时有警告

D:\Workspaces\Vue\MusicRec-Vue>npm install

npm WARN ajv-keywords@2.1.1 requires a peer of ajv@^5.0.0 but none is installed. You must install peer dependencies yourself.

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.4 (node_modules\fsevents):

npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.4: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})

audited 29868 packages in 43.88s

found 778 vulnerabilities (67 low, 11 moderate, 699 high, 1 critical)

run `npm audit fix` to fix them, or `npm audit` for details

成功run

    

admin,admin

实现细节

Django编写接口

参考https://www.cnblogs.com/sixrain/p/9138442.html

Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站。Django 中提供了开发网站经常用到的模块,常见的代码都为你写好了,减少重复的代码。

Django 目录结构

urls.py

网址入口,关联到对应的views.py中的一个函数(或者generic类),访问网址就对应一个函数。

views.py

处理用户发出的请求,从urls.py中对应过来, 通过渲染templates中的网页可以将显示内容,比如登陆后的用户名,用户请求的数据,输出到网页。

models.py

与数据库操作相关,存入或读取数据时用到这个,当然用不到数据库的时候 你可以不使用。

forms.py

表单,用户在浏览器上输入数据提交,对数据的验证工作以及输入框的生成等工作,当然你也可以不使用。

templates 文件夹

views.py 中的函数渲染templates中的Html模板,得到动态内容的网页,当然可以用缓存来提高速度。

admin.py

后台,可以用很少量的代码就拥有一个强大的后台。

settings.py

Django 的设置,配置文件,比如 DEBUG 的开关,静态文件的位置等。

URL:

有关详细信息,请参阅:

https://docs.djangoproject.com/en/2.1/topics/http/urls/

例子:

函数视图Function views

1. 添加导入:from my_app import views

2. 将 URL 添加到  URLPATTERNS:path('', views.home, name='home')

基于类的view,Class-based views

1. 添加导入:from other_app.views import Home

2. 将 URL 添加到  URLPATTERNS:path('', Home.as_view(), name='home')

Including another URLconf

1. 导入 include() 功能:from django.urls import include, path

2. 将 URL 添加到  URLPATTERNS:path('blog/', include('blog.urls'))
Setting.py

在MusicRec文件夹中

接口

接口使用rest_framework,rest_framework是一套基于Django 的 REST 框架,是一个强大灵活的构建 Web API 的工具包。

写接口三步完成:连接数据库、取数据、数据输出

1)连接数据库

在工程目录下的settings.py文件下配置

2)取数据

既然要取数据,那model肯定得和数据库的一致,我发现一个快捷的方式可以把数据库中的表生成对应的model,在项目目录下执行命令

python manage.py inspectdb

取我们表的model拷贝到app下的models.py里

class Meizis(models.Model):

mid = models.CharField(max_length=10)

title = models.CharField(max_length=50, blank=True, null=True)

picname = models.CharField(max_length=10, blank=True, null=True)

page_url = models.CharField(max_length=50, blank=True, null=True)

img_url = models.CharField(max_length=50, blank=True, null=True)

class Meta:

managed = False

db_table = 'meizi_meizis'

创建一个序列化Serializer类

提供序列化和反序列化的途径,使之可以转化为,某种表现形式如json。我们可以借助serializer来实现,类似于Django表单(form)的运作方式。在app目录下,创建文件serializers.py。

这样在views.py就可以来获取数据库的数据了

meizis = Meizis.objects.all()

serializer = MeiziSerializer(meizis, many=True)

return Response(serializer.data)

3) 数据输出客户端或前端

REST框架提供了两种编写API视图的封装。

@api_view装饰器,基于方法的视图。

继承APIView类,基于类的视图。

request.data会自行处理输入的json请求

使用格式后缀明确的指向指定的格式,需要添加一个format关键字参数

http://127.0.0.1:8000/getlist.json # JSON 后缀

http://127.0.0.1:8000/getlist.api # 可视化 API 后缀

http://127.0.0.1:8000/getlist/ code="print 123"post

最后别忘了在urls.py配置URL,通过浏览器就可以看到json数据了。

4)分页

我们的数据有好几千条,一块返回来很不合理,所以需要分页,当然rest_framework框架提供了这个功能,post请求不支持,需要自己查数据库或者切片来进行返回

在views.py里编写

@api_view(['GET'])

def getlist(request, format=None):

if request.method == 'GET':

meizis = Meizis.objects.values('mid','title').distinct()

# http: // 127.0.0.1:8000 / getlist?limit = 20

# http: // 127.0.0.1:8000 / getlist?limit = 20 & offset = 20

# http: // 127.0.0.1:8000 / getlist?limit = 20 & offset = 40

# 根据url参数 获取分页数据

obj = StandardResultSetPagination()

page_list = obj.paginate_queryset(meizis, request)

# 对数据序列化 普通序列化 显示的只是数据

ser = ListSerialize(instance=page_list, many=True)  # 多个many=True # instance:把对象序列化

response = obj.get_paginated_response(ser.data)

return response

源码获取推荐

# 获取单个歌单的推荐

def getRecBasedOne(pl_id):

pl_tags = PlayList.objects.filter(pl_id= pl_id).values("pl_tags")[0]["pl_tags"]

pl_tags_list = pl_tags.replace(" ","").split(",")

print(pl_tags_list)

results = list(PlayList.objects.filter(pl_tags=pl_tags).filter(~Q(pl_id=pl_id)))

if results.__len__() < 10:

for tag in pl_tags_list:

for pl in PlayList.objects.filter(pl_tags__contains=tag):

results.append(pl)

if results.__len__() >= 10:

break

if results.__len__() >= 10:

break

# print(results)

# 拼接返回结果

rec_pl_list = list()

for one in results:

rec_pl_list.append({

"id": one.pl_id,

"name": one.pl_name,

"creator": one.pl_creator.u_name,

"img_url": one.pl_img_url,

"cate": "2"

})

return rec_pl_list

可以看出,歌曲的推荐通过tag选取。

# 获得歌曲、歌单标签推荐

def getSongAndPlRecTags(songs, base_click):

song_tags = list()

pl_tags =  list()

if base_click == 1: # 表示前端是基于点击行为进入为你推荐模块

click_songs = UserBrowse.objects.filter(click_cate="3").values("click_id")

if click_songs.__len__() != 0:

for one in click_songs:

filter_one = SongTag.objects.filter(song_id=one["click_id"])

if filter_one.__len__() != 0 and filter_one[0].tag not in song_tags:

song_tags.append(filter_one[0].tag)

# 歌单tag

pl_one = PlayListToSongs.objects.filter( song_id=filter_one[0].song_id )

if pl_one.__len__() !=0:

for pl_tag_one in PlayListToTag.objects.filter(pl_id=pl_one[0].song_id):

if pl_tag_one.tag not in pl_tags:

pl_tags.append(pl_tag_one.tag)

if songs.__len__() != 0:  # 表示前端选择了相关歌曲

for sing in songs:

choose_one = SongTag.objects.filter(song_id=sing)

if choose_one.__len__() != 0 and choose_one[0].tag not in song_tags:

song_tags.append(choose_one[0].tag)

# 歌单tag

pl_one = PlayListToSongs.objects.filter(song_id=choose_one[0].song_id)

if pl_one.__len__() != 0:

for pl_tag_one in PlayListToTag.objects.filter(pl_id=pl_one[0].song_id):

if pl_tag_one.tag not in pl_tags:

pl_tags.append(pl_tag_one.tag)

# print("songs_tags_by_click %s" % songs_tags_by_click)

# print("pl_tags_by_click %s" % pl_tags_by_click)

else:     # 表示用户是首次进入为你推荐模块

if songs.__len__() != 0:  # 表示前端选择了相关歌曲

for sing in songs:

choose_one = SongTag.objects.filter(song_id=sing)

if choose_one.__len__() != 0 and choose_one[0].tag not in song_tags:

song_tags.append(choose_one[0].tag)

# 歌单tag

pl_one = PlayListToSongs.objects.filter(song_id=choose_one[0].song_id)

if pl_one.__len__() != 0:

for pl_tag_one in PlayListToTag.objects.filter(pl_id=pl_one[0].song_id):

if pl_tag_one.tag not in pl_tags:

pl_tags.append(pl_tag_one.tag)

# print("songs_tags_by_choose: %s" % songs_tags_by_choose)

# print("pl_tags_by_choose: %s" % pl_tags_by_choose)

# 如果 click 和 choose的tag不够 以 hot来补充

if song_tags.__len__() < 15:

hot_tag_dict = dict()

for one in SongTag.objects.all():

hot_tag_dict.setdefault(one.tag, 0)

hot_tag_dict[one.tag] += 1

tag_dict_song = sorted(hot_tag_dict.items(), key=lambda k: k[1], reverse=True)[:15-song_tags.__len__()]

for one in tag_dict_song:

if one[0] not in song_tags:

song_tags.append(one[0])

# print("songs_tags_by_hot: %s" % songs_tags_by_hot)

# 如果 click 和 choose的tag不够 以 hot来补充

if pl_tags.__len__() < 15:

hot_tag_dict = dict()

for one in PlayListToTag.objects.all():

hot_tag_dict.setdefault(one.tag, 0)

hot_tag_dict[one.tag] += 1

tag_dict_pl = sorted(hot_tag_dict.items(), key=lambda k: k[1], reverse=True)[:15-pl_tags.__len__()]

for one in tag_dict_pl:

if one[0] not in pl_tags:

pl_tags.append(one[0])

# print("pl_tags_by_hot: %s" % pl_tags_by_hot)

return song_tags,pl_tags

而这些标签来源于:用户选择的标签,用户行为对象对应的标签,热门标签

音乐推荐系统搭建试验相关推荐

  1. 混合音乐推荐系统_比女朋友更懂你的“音乐推荐系统”,是怎样搭建出来的?...

    相信你一定有过这样的体验! 每当想听音乐的时候,无论是打开网易云音乐.酷狗.QQ音乐还是虾米......里面的"推荐音乐"总能get到你的喜好. 说起来大家都懂,这不就是个智能音乐 ...

  2. 【云栖直播】精彩推荐第3期:个性化推荐系统搭建实践

    热门推荐  (1)即将直播 持续集成与交付:分层自动化之UI自动化体系建设 直播简介:本系列直播由阿里旗下一站式研发提效平台云效策划推出,主要为大家详细介绍阿里巴巴在持续集成和持续交付的最佳实践. 直 ...

  3. 《推荐系统实战(二)》音乐推荐系统(数据清洗、召回、排序)

    前言 在本篇博客中,我们将从0搭建一个音乐推荐系统,其中的流程也可以用来搭建其他内容的推荐系统. 我们将整个过程分为三个部分,分别是 数据预处理 召回 排序 拿到原始数据集之后,我们需要对其进行处理, ...

  4. Java语言开发在线音乐推荐网 音乐推荐系统 网易云音乐爬虫 基于用户、物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)框架 大数据、人工智能、机器学习项目开发

    Java语言开发在线音乐推荐网 音乐推荐系统 网易云音乐爬虫 基于用户.物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)框架 大数据.人工智能.机器学习项目开发Mus ...

  5. 私人定制——使用深度学习Keras和TensorFlow打造一款音乐推荐系统

    随着生活水平的极大提高,人们在很多情况下都会边听音乐边做一些事情,比如在健身房.出行路上等,越来越多的人也开始慢慢走在Hifi发烧友的这一条不归路上,频繁地换耳机.换功放等,小编在这里劝一下大家不要向 ...

  6. 基于深度学习的音乐推荐系统

    ♚ 作者:沂水寒城,CSDN博客专家,个人研究方向:机器学习.深度学习.NLP.CV Blog: http://yishuihancheng.blog.csdn.net 推荐系统在我们日常生活中发挥着 ...

  7. Python的网易云音乐数据分析系统 爬虫 echarts可视化 Flask框架 音乐推荐系统 源码下载

    Python的网易云音乐数据分析系统 爬虫 echarts可视化 Flask框架 音乐推荐系统 一.技术说明 网易云音乐数据(歌单.用户.歌词.评论)Python爬取Flask框架搭建ECharts. ...

  8. 在线音乐推荐网 Python+Django+Mysql开发技术 基于用户、物品的协同过滤推荐算法 个性化音乐推荐系统 音乐网站+协同过滤推荐算法 机器学习、分布式大数据、人工智能开发

    在线音乐推荐网 Python+Django+Mysql开发技术 基于用户.物品的协同过滤推荐算法 个性化音乐推荐系统 音乐网站+协同过滤推荐算法 机器学习.分布式大数据.人工智能开发 MusicRec ...

  9. 简单在线音乐推荐网 基于用户、物品的协同过滤推荐算法 使用Python+Django+Mysql开发技术 在线音乐推荐系统 音乐网站推荐系统 个性化推荐算法开发 人工智能、大数据分布式、机器学习开发

    简单在线音乐推荐网 基于用户.物品的协同过滤推荐算法 使用Python+Django+Mysql开发技术 在线音乐推荐系统 音乐网站推荐系统 个性化推荐算法开发 人工智能.大数据分布式.机器学习开发S ...

最新文章

  1. 加强版dd工具dc3dd
  2. 《Flume日志收集与MapReduce模式》一2.2 Flume配置文件概览
  3. 图像检索从入门到进阶
  4. [2013.8.16]小议innerText/HTML以及outerText/HTML
  5. sparksql与hql语法差异
  6. puppeteer中如何复用启动中的浏览器
  7. 中国最惨创业者的惨痛教训!
  8. elasticsearch sql插件 2.4及以下版本配置
  9. tracert和traceroute区别在哪?
  10. 网络空间安全领域可投的期刊和会议
  11. 亲属卡额度是什么意思_2019信用卡权益总结之十二:附属卡
  12. 纯CSS实现图片动画
  13. Excel-制作各国历年GDP动态图
  14. criterial查询(2014-05-29 03:51)续-----Example
  15. 在 Linux 终端中自定义 Bash 配色和提示内容
  16. PowerQuery操作分类3
  17. 2020工作第一天,免费请大家喝星巴克咖啡了,速来!
  18. python3 打字小游戏
  19. 那些忍了很久的话——人工智能盲目跟风该休了
  20. html 5 压缩zip,Zip

热门文章

  1. Java中的时间、时区和夏令时
  2. 小程序实现商品详情页的tap标签与页面滚动联动效果
  3. 探究from表单的身份证号码的校验逻辑 javascript
  4. 老友记台词笔记S0101-ijk英语
  5. 4、spss做多元线性回归
  6. 3、 如何搭建高德离线地图服务
  7. 在线教育报告上线,助力职业与成人教育行业高效运营
  8. python成语接龙到为所欲为_python成语接龙
  9. 架构升级、性能优化,高德技术专家 infoQ 全球架构师峰会开讲啦
  10. python 词库 匹配_python从一段文本中找出存在于词库的词语