首页 > 编程知识 正文

网易云音乐用户体验,推荐系统实践

时间:2023-05-04 16:53:33 阅读:61338 作者:2179

网络易云音乐的核心功能是其推荐算法,据观察,日推主要采用itemCF方法。 网络上的易云音乐根据每天得到的音乐列表,优先推荐与该歌曲相似的歌曲。 由于目前网络云音乐侧重于社会功能,本文尝试构建了基于用户的推荐系统。

3358www.Sina.com/本文的思路是根据用户摘要:听歌排行榜计算相似度,推荐用户3358www.Sina.com/听歌次数不少于2次的歌曲。 用jaccard距离和矢量余弦计算相似度。 本文目录为数据集获取、数据预处理、数据分析、算法实现和结果输出

一、数据集获取

分析网络音乐排行榜页面时,由于最近一周的数据和所有时间的数据都是动态加载的,因此很难使用requests beautifulsoup获得完整的数据。

然后分析网页源代码,单击network,选择XHR,然后重新加载网页。 在最后一个文件中找到所需的数据。 下图的preview是json文件,点击headers后显示。 因为浏览器使用post方法请求json数据,所以爬虫也使用post方法

上传代码

importjsonfromurllibimportrequest,parse headers={ ' user-agent ' : ' Mozilla/5.0 (windows nt 10.0; WOW64 ) appleWebKit/537.36(khtml, like gecko (chrome/67.0.3396.99 safari/537.36 ) # 从网络- xhr-headers-from data到data和URL data={ ' params ' : ' BMC UCP9w4 r9xumwjhedb1pbdnzcvlrzmbv3qw lzu0rynbycivydqr gr eerqppoazkgfnmr 596 mquw/tmfuqroj1opl ycf2vssuwgwbzym4/MDS 70 ocqijkjgsjl 1xi xz h6 ylf 36 nqr2bhwe 25 renz9ozox2mfwmbbl6V5 MQ tu K9 wgyzshzpj8v0rmykuum=' ' encseckey ' : ' 31 ab 03 c 77 f 70469 ffok f 70469 a5 e8e 89 c 2950193 D6 ccff4AC 086 e 089 ff 6712 B9 Fe 90773 a 042 b 735 CB 18c0e 87 a 217 ba F8 ffc 40 b 59 de 1624527 ea 1899227 be0e 435 b 927346090 ABAC 133 a e47 e 9614508197 f 67 fa 141429 BCE 875 b3' } #此URL是从web源搜索的,与requestURL对应的URL='https://music.163.com/weapi/ve API CRF _ token=74 f92 d 802 fc 66da de9d 176 e 77480 AC ' data=parse.urlencode (data ).encode ) utf-8 ' ) request1=requeest st1 ) html=response.read ).decode('utf-8 ' ) results=jsults在此获取的result包含alldata和weekdata,根据result的结果可以获得曲名此处的score分数将从“次数/最大次数”转换为百分比

二.数据预处理

曲名预处理包括曲名的大括号、方括号的内容的去除、曲名中的英文数字以外的数字的去除、曲名中的空格的去除、从大写到小写的转换等

歌曲作者的预处理包括删除所有非字母数字数字、删除空格和将大小写转换为小写

此步骤的作用是设置字符串格式并加快算法速度

三.数据分析

常见的相似性测量方法包括感人的小懒汉距离、皮尔森关联度、jaccard距离、余弦相似度。 本文利用jaccard距离测量用户喜欢的歌曲的相似性,利用余弦相似度测量用户喜欢的歌曲的相似性。 如果根据用户在所有时间的歌曲排名来评估用户相似性,则歌曲列表中的任何歌曲都是用户喜欢的歌曲,系数score表示用户喜欢的程度。 假设用户a喜欢的歌曲的集合为a,用户b喜欢的歌曲的集合为b,则jaccard的距离AB表示两个用户同时喜欢的歌曲

因为用户喜欢同一个歌手也被认为是相似的,所以这里的交集必须同时包含两个用户喜欢的歌手。

在用户a和b同时喜欢的歌曲中,假设对a的集合的得分为c,用户a和b同时喜欢的歌曲中,对b的集合的得分为d,则相似性如下。

本文在最终处理数据时,使用jaccard和cossimi的乘积来表示其相似度,重复计算用户a与其他用户的相似性,选择值最大的用户,选择所有时间

最近一周听歌次数大于一次的歌曲。

四、算法实现

import jsonimport reimport numpy as np# 打开爬取到的数据集with open('NeteaseMusicData.json', 'r') as f: data = json.load(f)users = data['username']pattern1 = '(.*)' # 匹配圆括号中的内容pattern2 = '[.*]' # 匹配中括号中的内容pattern3 = 'W' # 匹配非字符内容patterns = [pattern1, pattern2, pattern3]# 清理数据,去除空格,符号,并将大写转为小写def remove(string, pat): obj = re.compile(pat) delstring = obj.findall(string) if delstring: for dels in delstring: string = string.replace(dels, '') return string.lower()# 处理title列表,得到def handletitle(user): title = [each[0] for each in data[user]['alldata']] titled = [] for each in title: for pattern in patterns: each = remove(each, pattern) titled.append(each) return titled# 处理singer列表数据,去除列表中的非字母数字符号,并将大写转换为小写def handlesinger(user): singers = [each[1] for each in data[user]['alldata']] singered = [] for singer in singers: singer = remove(singer, pattern3) singer = singer.replace(' ', '').lower() singered.append(singer) return singered# 计算两个列表的重复元素def repeatlist(list1, list2): relist = list() for each in list1: if each in list2: relist.append(each) return relist# 计算jaccard相似度def jaccardsimi(user1, user2): titled1 = handletitle(user1) titled2 = handletitle(user2) singered1 = handlesinger(user1) singered2 = handlesinger(user2) count1 = len(titled1) count2 = len(titled2) repeattitle = repeatlist(titled1, titled2) repeatsinger = repeatlist(singered1, singered2) if not repeattitle: return 0 for each in repeattitle: index = titled1.index(each) dual = 0 if singered1[index] in repeatsinger: dual += 1 num = len(repeattitle) + len(repeatsinger) - dual deno = count1 + count2 - num jacsimi = (num / deno) * 100 return jacsimi# 计算重复歌曲列表的余弦相似度def cossimi(user1, user2): titled1 = handletitle(user1) titled2 = handletitle(user2) repeattitle = repeatlist(titled1, titled2) if not repeattitle: return 0 def score(titlelist, user): scores = list() for each in repeattitle: index = titlelist.index(each) scores.append(data[user]['alldata'][index][2]) return scores score1 = score(titled1, user1) score2 = score(titled2, user2) matrix1 = np.array(score1) matrix2 = np.array(score2) num = np.inner(matrix1, matrix2) deno = np.sqrt(matrix1.dot(matrix1)) * np.sqrt(matrix2.dot(matrix2)) cosimi = (num / deno) * 100 return cosimidef main(username): if username not in users: print('该用户不存在') return maxsimi = 0 for eve in users: if username != eve: jacsimi = jaccardsimi(username, eve) cosimi = cossimi(username, eve) print('%s与%s的jaccard相似度是:%f%%' % (username, eve, jacsimi)) print('%s与%s的余弦相似度是:%f%%' % (username, eve, cosimi)) if maxsimi < jacsimi * cosimi: maxsimi = jacsimi * cosimi maxuser = eve weekdata = data[maxuser]['weekdata'] def minscore(weekdatalist): mins = 100 for each in weekdatalist: if mins > each[2]: mins = each[2] return mins minsco = minscore(weekdata) recommendlist = [each for each in weekdata if each[2] > minsco] print('%s和%s的相似度最高,推荐的歌单列表为:' % (username, maxuser)) print(recommendlist)if __name__ == '__main__': main('yuzhong_沐阳')

五、结果输出

yuzhong_沐阳与ggdgz方良的jaccard相似度是:6.382979%yuzhong_沐阳与ggdgz方良的余弦相似度是:90.803806%yuzhong_沐阳与HarkerLee的jaccard相似度是:6.382979%yuzhong_沐阳与HarkerLee的余弦相似度是:90.968774%yuzhong_沐阳与hyhsky0825的jaccard相似度是:6.382979%yuzhong_沐阳与hyhsky0825的余弦相似度是:94.077937%yuzhong_沐阳与hi-M3U_玻色子的泛的jaccard相似度是:0.000000%yuzhong_沐阳与hi-M3U_玻色子的泛的余弦相似度是:0.000000%yuzhong_沐阳和hyhsky0825的相似度最高,推荐的歌单列表为:[['바람에 쓰는 편지', 'July', 100], ['Free Loop', 'Daniel Powter', 100], ['那个人', '文静的小甜瓜(wydjmg-effie)', 100], ['热勇', '坚定的大象', 100], ['Need You Now', 'Lady Antebellum', 100], ['借我一生', '水木年华', 100], ['孙大剩', '白亮', 100], ['褪变无路', '夏天播放', 100], ['被驯服的象', '蔡健雅', 100], ['丁香花', '唐磊', 100]]

 

不足之处:

2018/08/30

1.该算法没有进行评测。《推荐系统实践》提出三种评测方法:离线实验,用户实验,在线调查

评测指标有:用户满意度、预测准确率、覆盖率、多样性、新颖性(流行度),惊喜度

2.该算法只推荐了一位用户的歌单,歌曲覆盖率不是很高,可考虑K个用户,计算K个用户的歌单权重,排序后推荐给用户

3.改进jaccard距离算法:惩罚了共同兴趣列表中热门物品对相似度的影响

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。