python音乐推荐系统_音乐推荐系统

article/2025/11/1 9:34:28

音乐频道推荐业务,支持各个产品业务和策略。这里我先使用CB+CF+LR实现推荐部分,下面具体展开:

一、推荐系统流程图

a23493112655d811abd627074561c578.png

CB,CF算法在召回阶段使用,推荐出来的item是粗排的,利用LR算法,可以将CB,CF召回来的item进行精排,然后选择分数最高,给用户推荐出来。后续我们可以采用矩阵分解、聚类、深度学习算法来实现对候选集合的召回。

二、推荐系统思路详解

话不多说,这里先放上代码思路:

1、数据预处理(用户画像数据、物品元数据、用户行为数据)

2、召回(CB、CF算法)

3、LR训练模型的数据准备,即用户特征数据,物品特征数据

4、模型准备,即通过LR算法训练模型数据得到w,b

5、推荐系统流程:

(1)解析请求:userid,itemid

(2)加载模型:加载排序模型(model.w,model.b)

(3)检索候选集合:利用cb,cf去redis里面检索数据库,得到候选集合

(4)获取用户特征:userid

(5)获取物品特征:itemid

(6)打分(逻辑回归,深度学习),排序

(7)top-n过滤

(8)数据包装(itemid->name),返回

三、推荐系统实现

3.1、数据预处理

(1)用户画像数据:user_profile.data

userid,性别,年龄,收入,地域

a1a9633014182a1d87f36a45511bd5c5.png

(2)物品(音乐)元数据:music_metaitemid,name,desc,时长,地域,标签

cbba202fb761c54eaefa5190686ba4b9.png

(3)用户行为数据:user_watch_pref.sml

userid,itemid,该用户对该物品的收听时长,点击时间(小时)

50d594d30f56a262e9db61c113233abe.png

首先,将3份数据融合到一份数据中

执行python gen_base.py

1 #coding=utf-8

2

3 '''

4 总体思路:处理原始的数据:1、用户画像数据 2、物品元数据 3、用户行为数据5 把三类数据统一到一个文件里面,供后面cb、cf算法进行计算权重6 '''

7

8 importsys9

10 #找到三类原始数据文件,用户画像数据、物品元数据,用户行为数据

11 user_action_data = '../data/user_watch_pref.sml'

12 music_meta_data = '../data/music_meta'

13 user_profile_data = '../data/user_profile.data'

14

15 #将三类处理后的元数据放到新的文件里面,这里我们需要定一个文件名,路径

16 output_file = '../data/merge_base.data'

17

18 #将3份数据merge后的结果输出,供下游数据处理

19 ofile = open(output_file, 'w')20

21 #step 1. 处理物品元数据,将处理后的结果放入字典里面,key是itemid,value为物品对应的信息,为最后写入做准备

22 item_info_dict ={}23 with open(music_meta_data, 'r') as fd:24 for line infd:25 ss = line.strip().split('\001')26 if len(ss) != 6:27 continue

28 itemid, name, desc, total_timelen, location, tags =ss29 item_info_dict[itemid] = '\001'.join([name, desc, total_timelen, location, tags])30

31 #step 2. 处理用户画像数据,将处理后的结果放入字典里面,key是用户id,value是用户信息

32 user_profile_dict ={}33 with open(user_profile_data, 'r') as fd:34 for line infd:35 ss = line.strip().split(',')36 if len(ss) != 5:37 continue

38 userid, gender, age, salary, location =ss39 user_profile_dict[userid] = '\001'.join([gender, age, salary, location])40

41 #step 3. 写入最后的信息,将用户行为数据进行处理,把step1和step2得到的数据一并归纳在文件里面

42 with open(user_action_data, 'r') as fd:43 for line infd:44 ss = line.strip().split('\001')45 if len(ss) != 4:46 continue

47 userid, itemid, watch_len, hour =ss48

49 if userid not inuser_profile_dict:50 continue

51

52 if itemid not initem_info_dict:53 continue

54

55 ofile.write('\001'.join([userid, itemid, watch_len, hour, \56 user_profile_dict[userid], item_info_dict[itemid]]))57 ofile.write("\n")58

59 ofile.close()

得到类似下面数据merge_base.data

882eff0085c2dbf99e81da9a31452493.png

01e3fdf415107cd6046a07481fbed499^A6470209102^A1635^A21^A男^A36-45^A20000-100000^A内蒙古^A黄家驹1993演唱会高清视频^A^A1969^A^A演唱会

3.2、【召回】CB算法

(1)以token itemid score形式整理训练数据利用jieba分词,对item name进行中文分词

python gen_cb_train.py

1 #coding=utf-8

2

3 '''

4 总体思路:将初始化好的用户,物品,用户行为数据进行处理,目的是为了得到token,itemid,score,我们知道生成的数据里面的name,5 将itemName进行分词,得到tfidf权重,同时将desc进行分词,处理name和desc,我们在元数据中还有已经分类好的tags,tags已经切分好6 了没必要再次进行切分,只需要用idf词表查处权重即可,但是对于name、desc、tags这三个分词结果,我们对name的结果应该更加偏重一7 点,所以分别对这三类得出的分数再次进行分数权重划分,最后得到cb的初始数据8 '''

9

10 importsys11 sys.path.append('../')12 reload(sys)13 sys.setdefaultencoding('utf-8')14

15 importjieba16 importjieba.posseg17 importjieba.analyse18

19

20 #读入初始数据

21 input_file = "../data/merge_base.data"

22

23 #输出cb训练数据

24 output_file = '../data/cb_train.data'

25 ofile = open(output_file, 'w')26

27 #定义三类的权重分数

28 RATIO_FOR_NAME = 0.9

29 RATIO_FOR_DESC = 0.1

30 RATIO_FOR_TAGS = 0.05

31

32

33 #为tags读入idf权重值

34 idf_file = '../data/idf.txt'

35 idf_dict ={}36 with open(idf_file, 'r') as fd:37 for line infd:38 token, idf_score = line.strip().split(' ')39 idf_dict[token] =idf_score40

41 #开始处理初始数据

42 itemid_set =set()43 with open(input_file, 'r') as fd:44 for line infd:45 ss = line.strip().split('\001')46 #用户行为

47 userid =ss[0].strip()48 itemid = ss[1].strip()49 watch_len = ss[2].strip()50 hour = ss[3].strip()51 #用户画像

52 gender = ss[4].strip()53 age = ss[5].strip()54 salary = ss[6].strip()55 user_location = ss[7].strip()56 #物品元数据

57 name = ss[8].strip()58 desc = ss[9].strip()59 total_timelen = ss[10].strip()60 item_location = ss[11].strip()61 tags = ss[12].strip()62

63 #对item去重,相同的itemid不用再计算,因为都一样,这里用到continue特性,当不同的时候才继续执行下面的代码

64 if itemid not initemid_set:65 itemid_set.add(itemid)66 else:67 continue

68

69 #去掉重复后的itemid,然后我们进行分词,计算权重,放到字典里面

70 token_dict ={}71 #对name统计

72 for a in jieba.analyse.extract_tags(name, withWeight=True):73 token =a[0]74 score = float(a[1])75 token_dict[token] = score *RATIO_FOR_NAME76

77 #对desc进行分词,这里需要注意的是描述一般会含有name中的词,这里我们把有的词的分数进行相加,没有的放入

78 for a in jieba.analyse.extract_tags(desc, withWeight=True):79 token =a[0]80 score = float(a[1])81 if token intoken_dict:82 token_dict[token] += score *RATIO_FOR_DESC83 else:84 token_dict[token] = score *RATIO_FOR_DESC85

86 #对tags 进行分数计算

87 for tag in tags.strip().split(','):88 if tag not inidf_dict:89 continue

90 else:91 if tag intoken_dict:92 token_dict[tag] += float(idf_dict[tag]) *RATIO_FOR_TAGS93 else:94 token_dict[tag] = float(idf_dict[tag]) *RATIO_FOR_TAGS95

96 #循环遍历token_dict,输出toke,itemid,score

97 for k, v intoken_dict.items():98 token =k.strip()99 score =str(v)100 ofile.write(','.join([token, itemid, score]))101 ofile.write("\n")102

103

104 ofile.close()

得到如下数据:

04051d45ce7fadd43d3ff90f070a84e6.png

翻译,4090309101,0.561911164569(最后一个是一个不是传统的TF-IDF,因为分出的词在name,desc,tag里面他的重要性是不一样的)

(2)用协同过滤算法跑出item-item数据

相似的item配对,II矩阵的形成。相似度计算,我们要用到MapReduce的框架来进行,只要是用到shuffle阶段,对map出来的结果排序,reduce进行两两配对,这里就是主要的wordcount逻辑,主要说下注


http://chatgpt.dhexx.cn/article/E8vaAb1Q.shtml

相关文章

(附源码)计算机毕业设计SSM音乐推荐系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

音乐推荐系统设计

文章目录 问题描述如何解决系统设计评测指标推荐系统的用户画像运动音乐场景用户行为分析睡眠音乐场景用户行为分析治愈音乐场景用户行为分析其他音乐场景用户行为分析 问题描述 移动网络和数字多媒体技术的飞速发展促进了数字音乐产业的共享与广泛传播.对用户而言…

音乐推荐系统(协同过滤和SVD)

python音乐推荐系统 首先对音乐数据集进行数据清洗和特征提取,基于矩阵分解方式来进行音乐推荐。 直接上源码和数据集文件 链接:https://pan.baidu.com/s/1Q45-pTRgXcQ4H-Z2WsRbVQ?pwd55z0 提取码:55z0音乐数据处理 读取音乐数据集&#x…

基于深度学习的音乐推荐系统简述

本文简要介绍我做的基于深度学习的音乐推荐系统。主要从需求分析与设计实现的角度来进行介绍。 (一)需求分析 基于深度学习的音乐推荐系统旨在以个性化音乐推荐模型为基础,使用B/S架构的形式实现。个性化推荐模型使用了 随机梯度下降&#x…

基于大数据的音乐推荐系统的设计与实现

基于大数据的音乐推荐系统是为了给听众推荐符合内心喜好的个性化系统。系统提供的功能有,音乐管理:管理员可以添加删除音乐,音乐查找:用户可以在系统中自行查找想要听的歌曲,音乐推荐:系统在收集了用户的行…

context-aware recommendation

智能手机的普及让大家随时随地都可接入互联网,而这样的随时随地的应用场景,也让传统推荐技术需要充分考虑,利用这些信息提升推荐的准确性,同时从另外一方面考虑, 这种符合LBS的推荐, 因为有了这些信息后&am…

accept函数_使用函数式接口

像上几章提到的,函数式接口定义且只定义了一个抽象方法。函数式接口很有用,因为抽象方法的签名可以描述Lambda表达式的签名。函数式接口的抽象方法的签名成为函数描述符。所以为了应用不同的Lambda表达式,你需要一套能够描述常见函数描述符的…

accept函数(TCP)

accept函数&#xff08;TCP&#xff09; #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);功能&#xff1a;阻塞等待客户端的连接请求 sockfd&#xff1a;文件描述符&#…

Context context = getApplicationContext()

使用getApplicationContext 取得的是当前app所使用的application&#xff0c;这在AndroidManifest中唯一指定。意味着&#xff0c;在当前app的任意位置使用这个函数得到的是同一个Context 1、Context概念 其实一直想写一篇关于Context的文章&#xff0c;但是又怕技术不如而误人…

AutoCompleteTextView

自动完成的提供建议的文本 使用方法 //arrays.xml <?xml version"1.0" encoding"utf-8"?> <resources><array name"city_name"><item>Chengdu</item><item>Beijing</item><item>Tianjin<…

http状态码、accept、Content-Type

一、http状态码 &#xff08;1&#xff09;http状态码 1XX&#xff1a;信息&#xff0c;服务器收到请求&#xff0c;需要请求者继续执行操作 2XX&#xff1a;成功&#xff0c;操作被成功接收并处理 3XX&#xff1a;重定向&#xff0c;需要进一步的操作以完成请求 4XX&#xf…

Gated-Attention Readers for Text Comprehension

Gated-Attention Readers for Text Comprehension 文本理解中的门控attention阅读器 code Abstract 本文研究的是完形填空问题式MRC&#xff0c;作者提出的门控注意力阅读器集中了多跳结构和一种新的注意力计算机制&#xff08;基于query嵌入和RNN文档阅读器中间状态之间的…

Html中Input的accept属性

Accept属性规定通过在文件上传提交的服务接受的文件类型 但是accept属性只能适用在Html input类型为文件类型&#xff0c;也就是说其他类型的input accept属性就不适用 我写的这个过滤文件属性是针对于后缀名为.xls的文件&#xff0c;所有的文件只要不是.xls后缀就不显示出来…

ApplicationContext

如果说BeanFactory是Spring的心脏&#xff0c;那么Application就是完整的身躯。ApplicationContext就是由BeanFactory派生出来的。 1、ApplicationContext ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径…

ActionContext

1、ActionContext翻译成中文就是Action的上下文&#xff08;为什么说是上下文&#xff0c;是应为他的生命周期长&#xff0c;和我们的项目的生命周期是相同的&#xff0c;我们很多公共的东西都放在里面&#xff0c;方便存取 &#xff09;&#xff0c;ActionContext是struts2的上…

readonly option is set (add ! to override)错误的解决

在mac电脑或linux系统中经常操作修改某个文件后保存退出出现readonly option is set (add ! to override)。如图&#xff1a; 正常情况下按 A进入编辑模式修改文件后按ESC退出编辑模式&#xff0c;:wq命令保存退出&#xff0c;但经常会遇到以上显示&#xff0c;文件权限只读或者…

ByteBuffer的allocate和allocateDirect

在Java中当我们要对数据进行更底层的操作时&#xff0c;通常是操作数据的字节&#xff08;byte&#xff09;形式&#xff0c;这时常常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式&#xff1a; Java代码 public static ByteBuffer allocate(int capacity…

直接内存 直接内存的释放和回收

直接内存 特点 不属于Java虚拟机管理&#xff0c;属于系统内存&#xff1b;属于操作系统&#xff0c;常见于NIO操作时&#xff0c;比如ByteBuffer【】用于数据缓冲区分配回收成本较高&#xff0c;但读写性能高&#xff1b;不受JVM内存回收管理 文件读写过程 java不具备磁盘…

解决The‘Access-Control-Allow-Origin‘ header contains multiple values‘*, ....‘, but only one is allowed

报错内容&#xff1a; Access to XMLHttpRequest at ‘http://www.z…n.com/api/login’ from origin ‘http://z…n.com’ has been blocked by CORS policy: The ‘Access-Control-Allow-Origin’ header contains multiple values ‘*, http://z…n.com’, but only one is …

C++中std::allocator的使用

标准库中包含一个名为allocator的类&#xff0c;允许我们将分配和初始化分离。使用allocator通常会提供更好的性能和更灵活的内存管理能力。 new有一些灵活性上的局限&#xff0c;其中一方面表现在它将内存分配和对象构造组合在了一起。类似的&#xff0c;delete将对象析构和内…