python爬取QQ音樂(lè)用戶(hù)歌單并進(jìn)行數(shù)據(jù)的可視化

前言

今天這篇文章是我曾經(jīng)做過(guò)的一個(gè)數(shù)據(jù)挖掘的項(xiàng)目郊酒,主要內(nèi)容是運(yùn)用python爬取QQ音樂(lè)用戶(hù)歌單并進(jìn)行數(shù)據(jù)的可視化以及歌曲推薦,本項(xiàng)目完整的包含了數(shù)據(jù)的爬取键袱、數(shù)據(jù)的分析以及對(duì)爬取結(jié)果的可視化過(guò)程燎窘。文章內(nèi)容很多,我本人大多時(shí)候亦難以耐住性子閱讀長(zhǎng)篇技術(shù)類(lèi)博文蹄咖。但是由于涵蓋的內(nèi)容較多褐健,我雖已盡可能的用簡(jiǎn)明梗概的語(yǔ)言來(lái)描述這整個(gè)過(guò)程,篇幅也還是較長(zhǎng),歡迎相互交流一下蚜迅。

摘要

現(xiàn)如今商品推薦算法已經(jīng)應(yīng)用到了生活中的方方面面舵匾,淘寶購(gòu)物、瀏覽新聞谁不、歌曲推薦等功能其核心內(nèi)容都是推薦算法坐梯。此篇文章就是將內(nèi)容推薦算法及其簡(jiǎn)單的優(yōu)化之后的算法應(yīng)用到QQ音樂(lè)上的一個(gè)具體的實(shí)例,即根據(jù)用戶(hù)喜歡的歌曲來(lái)推薦新的用戶(hù)可能喜歡的歌曲刹帕。

關(guān)于數(shù)據(jù)的獲取吵血,本文通過(guò)QQ音樂(lè)的官網(wǎng)運(yùn)用網(wǎng)絡(luò)爬蟲(chóng)(相關(guān)代碼見(jiàn)末尾給出的代碼鏈接)獲取到了歌曲《晴天》下的前2500條發(fā)表評(píng)論的用戶(hù)的個(gè)人信息以及他們喜歡的歌曲里面的前150首歌曲信息((若喜歡的歌曲不足150則爬取全部的歌曲信息)。由于存在同一名用戶(hù)多次評(píng)論以及部分用戶(hù)空間上鎖無(wú)法訪(fǎng)問(wèn)的原因偷溺,最終得到的歌單可訪(fǎng)問(wèn)的用戶(hù)數(shù)目為1629蹋辅。對(duì)此1629名用戶(hù)的歌單數(shù)目進(jìn)行分析,歌單歌曲數(shù)目大于等于150首的僅有16首挫掏,數(shù)目大于120首的用戶(hù)數(shù)目為473侦另,數(shù)目大于100的數(shù)目為531。由于歌單歌曲數(shù)目大于150及大于120的用戶(hù)數(shù)目過(guò)少尉共,最終決定對(duì)歌單數(shù)目大于100的531個(gè)用戶(hù)進(jìn)行分析褒傅。

首先,本文通過(guò)比較這531名用戶(hù)歌單爸邢,得到其平均重合數(shù)為8.14,即任意兩個(gè)用戶(hù)之間有大約8首歌是重復(fù)的拿愧。對(duì)于歌單數(shù)目介于100-150首之間的用戶(hù)來(lái)說(shuō)杠河,隨機(jī)兩用戶(hù)重復(fù)度介于6%-8%之間,由此看來(lái)用內(nèi)容推薦算法進(jìn)行歌曲的推薦是合理的浇辜。隨后券敌,本文應(yīng)用python實(shí)現(xiàn)的內(nèi)容推薦法對(duì)這部分進(jìn)行了實(shí)現(xiàn)。

其次柳洋,本文應(yīng)用了基于關(guān)聯(lián)規(guī)則的改進(jìn)算法通過(guò)比較歌曲重合度的方法為用戶(hù)進(jìn)行了歌曲的推薦待诅。此方法相比傳統(tǒng)的關(guān)聯(lián)規(guī)則的好處是一定可以得到一個(gè)輸出。

隨后熊镣,本文仿照向量的相似性算法來(lái)進(jìn)行歌曲推薦算法的設(shè)計(jì)卑雁。在將用戶(hù)的歌單信息映射成為代表用戶(hù)的歌曲喜好的特征向量時(shí),由于直接使用歌單內(nèi)歌曲信息難以確定映射規(guī)則同時(shí)數(shù)據(jù)維度過(guò)高(至少大于等于100),因此我對(duì)此算法做出了相應(yīng)的修改绪囱,即統(tǒng)計(jì)用戶(hù)歌單里的所有歌曲的種類(lèi)及各種類(lèi)的歌曲數(shù)目测蹲,將其作為此用戶(hù)的特征向量。此算法相比原來(lái)算法鬼吵,一方面將向量的長(zhǎng)度降低到了5位扣甲,另一方面數(shù)目即可直接構(gòu)成向量,不必考慮映射規(guī)則齿椅。運(yùn)用以上兩種算法都一定能得到較為準(zhǔn)確的輸出結(jié)果琉挖,但是兩種算法都只會(huì)求出契合度最高的用戶(hù)的歌單启泣。因?yàn)樵谂廊r(shí)每個(gè)用戶(hù)歌單里的歌曲數(shù)目介于100到150之間,去除重復(fù)的歌曲之后示辈,能輸出的推薦的歌曲數(shù)目介于100到130之間寥茫。為了提高輸出的推薦歌曲數(shù)目,本文采用了k-means聚類(lèi)算法顽耳,將以上的特征向量進(jìn)行聚類(lèi)并將與待推薦用戶(hù)在同一類(lèi)的用戶(hù)的歌曲信息作為輸出坠敷。運(yùn)用此方法平均可得到700到1000首歌曲推薦結(jié)果。

最后射富,由于以上所有的算法為用戶(hù)推薦歌曲的基礎(chǔ)都是假設(shè)用戶(hù)已經(jīng)喜歡了一定量的歌曲然后通過(guò)其喜歡的內(nèi)容來(lái)推薦新的歌曲膝迎。但是需要考慮的是每天都有大量的新用戶(hù)出現(xiàn),因此此部分用戶(hù)的歌曲推薦也是需要考慮的一個(gè)重要部分胰耗。本文通過(guò)統(tǒng)計(jì)531名用戶(hù)的歌單里歌曲的頻數(shù)來(lái)確定熱門(mén)歌曲限次,即頻數(shù)越大,越熱門(mén)柴灯,對(duì)新用戶(hù)的推薦算法即將熱門(mén)歌曲對(duì)新用戶(hù)進(jìn)行推送卖漫。同時(shí),本文也將統(tǒng)計(jì)結(jié)果生成了詞云圖進(jìn)行可視化并對(duì)結(jié)果進(jìn)行了簡(jiǎn)單地分析赠群。

一羊始、用python對(duì)數(shù)據(jù)進(jìn)行爬取

1.1、爬取數(shù)據(jù)之前的準(zhǔn)備

首先查描,因?yàn)榇治鲇脩?hù)的id是從歌曲評(píng)論信息中獲得的突委,所以從越熱門(mén)的歌曲下獲取用戶(hù)信息那么分析的結(jié)果就越客觀(guān)(如果歌曲為小眾歌曲的話(huà)最后獲取到的待分析用戶(hù)的特征就會(huì)具有明顯的偏向性,不能代表大多數(shù)的用戶(hù))冬三。又因?yàn)樵谀壳霸扔停W(wǎng)最熱門(mén)的歌曲為周杰倫的《晴天》(參考文獻(xiàn):全網(wǎng)最熱門(mén)歌曲),所以我最終決定爬取的用戶(hù)為歌曲《晴天》下的評(píng)論用戶(hù)勾笆。
其次敌蚜,由于評(píng)論人數(shù)太多,故這里只選擇爬取前2500名評(píng)論用戶(hù)作為分析目標(biāo)窝爪,并且每個(gè)用戶(hù)歌單中的歌曲數(shù)目只爬取前150首(不足150首的則全部爬瘸诔怠)。

1.2蒲每、數(shù)據(jù)的正式爬取

經(jīng)過(guò)分析網(wǎng)站發(fā)現(xiàn)其數(shù)據(jù)由js動(dòng)態(tài)加載帅韧。因此,為了獲取到所需要的信息啃勉,根據(jù)其相關(guān)請(qǐng)求的headers總結(jié)出各個(gè)keys的意義再拼成url發(fā)起請(qǐng)求即可忽舟。
首先,進(jìn)入到歌曲《晴天》的頁(yè)面,找到其加載評(píng)論信息的js地址以及返回內(nèi)容如下所示


圖1叮阅、獲取用戶(hù)評(píng)論信息的鏈接

圖2刁品、獲取用戶(hù)評(píng)論信息的內(nèi)容

圖一的js就是獲取用戶(hù)在晴天這首歌曲下的所有用戶(hù)的評(píng)論信息,由圖二返回的結(jié)果我們可以看到其返回了一個(gè)commentlist,里面包含了所有評(píng)論人的個(gè)人信息浩姥,例如昵稱(chēng)挑随,個(gè)性簽名等。不過(guò)這里面最重要的字段信息當(dāng)屬u(mài)in字段勒叠,經(jīng)過(guò)我的分析發(fā)現(xiàn)它實(shí)際上就是評(píng)論用戶(hù)的QQ號(hào)碼兜挨,而且通過(guò)此uin我們可以拼出url進(jìn)入到其個(gè)人主頁(yè)(如圖三,注意看其頂部url紅色圈中的部分眯分,就是一個(gè)QQ號(hào)拌汇。同理,將此QQ號(hào)替換成你的就會(huì)顯示你的歌單信息)進(jìn)而獲取到其喜歡的歌單信息弊决。
圖3噪舀、用戶(hù)主頁(yè)

此時(shí),我們用得到的uin進(jìn)行拼接飘诗,便可訪(fǎng)問(wèn)所有用戶(hù)的主頁(yè)与倡。在得到用戶(hù)主頁(yè)的url之后,我們找到了其獲取喜歡的歌的js地址昆稿,如圖4所示
圖4纺座、用戶(hù)喜歡的歌單的鏈接

進(jìn)而可以得到用戶(hù)喜歡的歌曲信息,如圖5所示
圖5溉潭、用戶(hù)喜歡的歌曲信息

此時(shí)我發(fā)現(xiàn)净响,想要拿到用戶(hù)喜歡的歌單信息,需要的url字段(也就是圖4中的url)里面有一個(gè)disstid字段還沒(méi)有獲得岛抄。根據(jù)其字面意思猜想其為歌單的編號(hào)(事實(shí)證明確實(shí)是歌單編號(hào))别惦,隨后我在加載用戶(hù)homepage頁(yè)面的js里找到了此js地址狈茉,其返回結(jié)果里的mymusic里名為“我喜歡”的title對(duì)應(yīng)的id就為所要得到的disstid,js地址內(nèi)容及返回結(jié)果如下圖6夫椭、圖7所示。
圖6氯庆、用戶(hù)喜歡的歌單的disstid的js地址

圖7蹭秋、用戶(hù)喜歡的歌單的disstid的js返回結(jié)果

通過(guò)此js地址便可拿到用戶(hù)的喜歡的歌單的 disstid 從而可以訪(fǎng)問(wèn)其歌單信息,進(jìn)而爬取歌單堤撵。至此仁讨,爬蟲(chóng)的設(shè)計(jì)完成,此部分Python代碼實(shí)現(xiàn)部分見(jiàn)下方鏈接实昨。
最終洞豁,本文通過(guò)QQ音樂(lè)的官網(wǎng)運(yùn)用網(wǎng)絡(luò)爬蟲(chóng)(相關(guān)代碼見(jiàn)附錄)獲取到了歌曲《晴天》下的前2500條發(fā)表評(píng)論的用戶(hù)的個(gè)人信息以及他們喜歡的歌曲里面的前150首歌曲信息((若喜歡的歌曲不足150則爬取全部的歌曲信息)。
下方即為用戶(hù)歌單的爬取結(jié)果(為方便后面數(shù)據(jù)的分析此時(shí)已經(jīng)整理為了json格式,每首歌曲前面的阿拉伯?dāng)?shù)字代表歌曲的流派)
圖8丈挟、歌單的爬取結(jié)果

最后刁卜,下面給出本次的歌單爬取結(jié)果以及爬取部分的全部代碼(由于代碼比較常規(guī),所以注釋較少曙咽,不懂之處可在評(píng)論里提出)蛔趴。
完整爬取結(jié)果
數(shù)據(jù)爬取部分代碼

二、對(duì)爬取數(shù)據(jù)進(jìn)行以及進(jìn)行歌曲的推薦

2.1例朱、數(shù)據(jù)的預(yù)處理

在獲取到數(shù)據(jù)之后孝情,對(duì)數(shù)據(jù)首先進(jìn)行預(yù)處理。在用爬蟲(chóng)爬取數(shù)據(jù)時(shí)洒嗤,我一共爬取了100頁(yè)的評(píng)論箫荡,因此理論上得到的可訪(fǎng)問(wèn)歌單的用戶(hù)數(shù)目為2500。但是由于某些特殊的情況烁竭,例如同一個(gè)用戶(hù)在此歌曲下多次評(píng)論菲茬、部分用戶(hù)的空間加鎖等,實(shí)際得到的歌單信息不為空的用戶(hù)數(shù)目為1629派撕。

對(duì)于此1629名歌單里歌曲數(shù)目不為0的用戶(hù)婉弹,本文先做了以下用戶(hù)歌單歌曲數(shù)目預(yù)分析,如圖9所示终吼。


圖9镀赌、用戶(hù)歌單歌曲數(shù)目預(yù)處理

首先,在爬取歌單內(nèi)歌曲時(shí)际跪,我設(shè)定的最大值就是 150 商佛,但是由于 1629 個(gè)用戶(hù)中,僅有16人歌單數(shù)目達(dá)到了150首姆打,因此良姆,需要適當(dāng)?shù)慕档透鑶卫锔枨鷶?shù)目的閾值來(lái)使得更多的用戶(hù)可作為分析樣本。但是歌曲數(shù)目越多必然分析的結(jié)果越具有客觀(guān)性幔戏,因此玛追,兩相權(quán)衡,針對(duì)此結(jié)果闲延,最終確定將歌單里歌曲數(shù)目大于等于 100 的 531 名用戶(hù)作為分析樣本痊剖。
其次,對(duì)于上文選取的531名用戶(hù)垒玲,在進(jìn)行常規(guī)的內(nèi)容推薦算法(基于內(nèi)容的重合度進(jìn)行推薦陆馁,此處的內(nèi)容重合度也就是歌單內(nèi)歌曲的重合數(shù))之前,先對(duì)歌曲能否應(yīng)用此算法進(jìn)行了簡(jiǎn)單的探究合愈。于是將這531名用戶(hù)歌單里的歌曲兩兩相比較叮贩,每?jī)蓚€(gè)用戶(hù)重復(fù)的歌曲數(shù)目為i击狮,成對(duì)比較的組數(shù)為k定義平均重合度為λ,由此得到下式


用Python按上述思路實(shí)現(xiàn)可得其平均重合度為8.14益老,即任意兩個(gè)用戶(hù)之間有大約8首歌是重復(fù)的帘不。對(duì)于歌單數(shù)目介于100-150首之間的用戶(hù)來(lái)說(shuō),隨機(jī)兩用戶(hù)重復(fù)度介于6%-8%之間杨箭,占比接近百分之十寞焙。另外,本文又統(tǒng)計(jì)了在所有的組數(shù)中互婿,重合數(shù)大于平均重合度的組的占比捣郊。我們得到在 140715 組中,有 50373 組的重合數(shù)目大于了平均重合度慈参,占比 35.8% 呛牲。綜合以上兩點(diǎn),我們可以認(rèn)為常規(guī)的內(nèi)容推薦算法是可以運(yùn)用到此歌曲推薦算法中的驮配。

2.2娘扩、根據(jù)關(guān)聯(lián)規(guī)則進(jìn)行歌曲推薦的算法及實(shí)現(xiàn)

2.2.1算法思路

基于上述獲取到的531組用戶(hù)數(shù)據(jù),一個(gè)最基本的推薦算法就是根據(jù)關(guān)聯(lián)規(guī)則來(lái)進(jìn)行歌曲的推薦壮锻。簡(jiǎn)單來(lái)說(shuō)就是將這531名用戶(hù)的歌單進(jìn)行兩兩對(duì)比琐旁,假設(shè)一個(gè)用戶(hù)的歌單內(nèi)歌曲數(shù)目為 M ,另一個(gè)用戶(hù)的歌單內(nèi)歌曲數(shù)目為 N ,當(dāng)他們重合的歌曲數(shù)目i占歌單總歌曲數(shù)目的比例大于某個(gè)給定的閾值 T 時(shí),他們的相關(guān)性 a 置為1猜绣,即認(rèn)為這兩組用戶(hù)具有相關(guān)性;反之灰殴, a 置為0,即認(rèn)為不相關(guān)掰邢。公式如下:


進(jìn)而在為用戶(hù)推薦歌曲時(shí)牺陶,只需將與此用戶(hù)具有相關(guān)度的用戶(hù)的歌曲推薦給他即可。
但是這種算法在閾值 T 的選取上沒(méi)有一個(gè)準(zhǔn)確的約定辣之,對(duì)于這個(gè)實(shí)例來(lái)說(shuō)掰伸,根據(jù)前面求得的的平均重合度 ( λ=8.14 ) ,我們指定的閾值應(yīng)該為8%,但是經(jīng)過(guò)分析8%這個(gè)重合度大約只有1/3的組數(shù)能達(dá)到,所以按照此類(lèi)方法有可能得不到任何的輸出結(jié)果怀估。倘若為了得到輸出而調(diào)低閾值狮鸭,就可能得到龐大的歌曲推薦結(jié)果,導(dǎo)致結(jié)果不再具有實(shí)際的意義奏夫。因此怕篷,再對(duì)以上的算法進(jìn)行改進(jìn)历筝,改進(jìn)后算法為:將這531名用戶(hù)的歌單進(jìn)行兩兩對(duì)比酗昼,僅將與待推薦用戶(hù)歌單重合度最高的用戶(hù)的歌單中的歌曲作為輸出結(jié)果。

2.2.2算法實(shí)現(xiàn)

因?yàn)樵谇懊鎸⑴廊〉臄?shù)據(jù)結(jié)果寫(xiě)入到文件中時(shí)梳猪,我對(duì)數(shù)據(jù)進(jìn)行了簡(jiǎn)單的處理麻削,將其寫(xiě)為了嵌套字典的格式蒸痹,類(lèi)似如下結(jié)果(以下僅為字典中的一個(gè)鍵值對(duì))

{'范佩西':{'夕陽(yáng)醉了': '1', '回望': '1', 'The Hit Nation': '1', '暗號(hào)': '1', '紙短情長(zhǎng)': '2', '其實(shí)都沒(méi)有': '1', '回到過(guò)去': '1', 'Polaris': '1', '等你下課(with 楊瑞代)': '1', '唇語(yǔ)': '1', '空空如也': '1', 'Call Of The Ambulance': '1', "DJ's International": '2', 'Summertime Sadness': '2', '佛系少女': '1', '甜到爆表': '1', '不僅僅是喜歡': '1', '慢慢喜歡你': '1', '放過(guò)自己': '1', '再見(jiàn)只是陌生人': '1', '愛(ài)你沒(méi)差': '1', '好可惜': '1', '我落淚情緒零碎': '1', '冰雨': '1', '知足': '2', '手寫(xiě)的從前': '2', '龍卷風(fēng)': '2', '夜曲': '2', '遇見(jiàn)': '2', '周杰倫歌曲串燒': '2', '安靜': '2', '讓我取暖': '1', '天空': '3', '那年夏天寧?kù)o的海': '1', '一首簡(jiǎn)單的歌': '1', '專(zhuān)屬情歌': '1', '如果的事': '1', '一場(chǎng)游戲一場(chǎng)夢(mèng)': '1', '遺失的美好': '1', '曖昧': '1', '那些花兒': '3', '他一定很愛(ài)你': '1', '約定': '1', '黃昏': '1', '比我幸福': '1', '斷點(diǎn)': '1', '一生有你': '1', '情非得已': '1', '一個(gè)人的北京': '1', '你,好不好呛哟?': '1', '哭砂': '1', '排行榜': '1', '心疼·筆記本': '1', '背叛': '1', '尋水的魚(yú)': '1', '虎口脫險(xiǎn)': '1', '想你就寫(xiě)信': '1', '發(fā)如雪': '1', '那片海': '1', '娃娃臉': '1', '下一站天后': '1', '給我一個(gè)理由忘記': '1', '董小姐': '2', '老男孩': '1', '愛(ài)很美': '1', '不再聯(lián)系': '1', '愛(ài)夏': '1', '怎樣': '1', '斑馬叠荠,斑馬': '2', '我的歌聲里': '1', '最初的夢(mèng)想': '1', '第一次': '1', '我們的愛(ài)': '1', '大城小愛(ài)': '1', '愿得一人心': '1', '青花': '1', '平凡之路': '1', '拯救': '1', '寂寞沙洲冷': '1', '青春紀(jì)念冊(cè)': '1', '你快回來(lái)': '1', '不想讓你哭': '1', '只要你過(guò)得比我好': '1', '就是愛(ài)你': '1', '無(wú)情的雨無(wú)情的你': '1', '我終于失去了你': '1', '藍(lán)色土耳其': '1', '我難過(guò)': '1', '男人好難': '1', '風(fēng)吹麥浪': '2', '向往': '1', '當(dāng)愛(ài)已成往事': '1', '讓我歡喜讓我憂(yōu)': '1', '花心': '1', '練習(xí)': '1', '風(fēng)往北吹': '1', '兩個(gè)人的煙火': '3', '到不了': '1', '白色戀人': '1', '我們的紀(jì)念': '1', 'Only Love': '3', '達(dá)爾文': '1', '心肝寶貝': '1','BINGBIAN病變': '1', 'PLANET': '1', '孤單北半球': '1', '相見(jiàn)不如懷念': '1', '距離': '1', '說(shuō)好的童話(huà)': '1', '下個(gè),路口扫责,見(jiàn)': '1', '下個(gè)路口見(jiàn)': '1', '一笑而過(guò)': '1', '紅玫瑰': '1', '不將就': '1', '我的地盤(pán)': '3', '美人魚(yú)': '1', '歲月神偷': '1', '請(qǐng)跟我聯(lián)絡(luò)': '1', '倒帶': '1', '一笑而過(guò) + 你的背包': '1', '一口氣全念對(duì)': '1', '我要夏天': '1', '派偉俊': '3', '羅曼蒂克的愛(ài)情': '1', '斷了的弦': '1', '不要對(duì)他說(shuō)': '1', '??': '1', '習(xí)慣一個(gè)人': '1', '一人一城': '1', '春風(fēng)十里': '1', '滂沱大雨里': '3', '你還要我怎樣': '1', '那個(gè)男人': '1', '北極星的眼淚': '1', '第三者的第三者': '1', 'Liekkas': '2', '心墻': '1', '下雨天': '1', '眼淚知道': '1'}}

外層字典的鍵為用戶(hù)昵稱(chēng)榛鼎,值為歌單信息。同時(shí)鳖孤,歌單信息也為一個(gè)字典者娱,這個(gè)字典的鍵為歌曲名稱(chēng),值為歌曲種類(lèi)苏揣。至于在此寫(xiě)入歌曲種類(lèi)的原因則是為了接下來(lái)的優(yōu)化算法的實(shí)現(xiàn)黄鳍。首先,將文件按行讀取并將讀取結(jié)果寫(xiě)入到一個(gè)字典中(此時(shí)字典中的每一項(xiàng)都為一個(gè)字典平匈,格式同上)框沟,再將歌單長(zhǎng)度大于等于100的用戶(hù)昵稱(chēng)寫(xiě)入到一個(gè)列表。于是增炭,通過(guò)遍歷此列表中的每一個(gè)元素就能得到用戶(hù)的昵稱(chēng)忍燥,前面構(gòu)建的字典通過(guò)此昵稱(chēng)就能得到用戶(hù)的歌曲信息,最后隙姿,只需將取出的歌曲運(yùn)用set進(jìn)行比較即可灾前。輸出結(jié)果格式如下圖

圖10、根據(jù)內(nèi)容進(jìn)行歌曲推薦的算法及實(shí)現(xiàn)的結(jié)果

2.3孟辑、基于向量相似度的優(yōu)化算法

2.3.1哎甲、算法思路

向量相似度算法在此不再贅述。具體內(nèi)容可通過(guò)此鏈接(向量的相似性)自行了解饲嗽。在此炭玫,仿照向量相似度的計(jì)算,以歌曲名稱(chēng)作為向量的各個(gè)分量信息貌虾,將這 531 名用戶(hù)的歌單進(jìn)行兩兩對(duì)比吞加,假設(shè)第f用戶(hù)的歌單內(nèi)歌曲構(gòu)成的向量為 {{\beta _f}} ,第s用戶(hù)的歌單內(nèi)歌曲構(gòu)成的向量為{{\beta _s}},相似度為\kappa,公式如下:


將這531名用戶(hù)的歌單進(jìn)行兩兩對(duì)比尽狠,僅將與待推薦用戶(hù)歌單相似度最高的用戶(hù)的歌單中的歌曲作為輸出結(jié)果即可衔憨。但是算法目前涉及到三個(gè)問(wèn)題:

1、這里作為分析對(duì)象的 531 名用戶(hù)的歌單長(zhǎng)度只是保證了大于等于100袄膏,即只保證了向量的長(zhǎng)度大于100践图,并不能保證向量的長(zhǎng)度相同,因此無(wú)法做向量的點(diǎn)乘運(yùn)算沉馆。
2码党、歌曲名稱(chēng)作為向量基本元素需要先將歌曲名稱(chēng)映射為具體的數(shù)據(jù)德崭,此映射規(guī)則難以制定。
3揖盘、哪怕映射出了一個(gè)向量眉厨,此向量的長(zhǎng)度也大于100,計(jì)算要求過(guò)高兽狭,應(yīng)進(jìn)行數(shù)據(jù)的降維憾股。

因此做以下處理,統(tǒng)計(jì)用戶(hù)歌單里的所有歌曲的種類(lèi)及各種類(lèi)的歌曲數(shù)目箕慧,將其作為此用戶(hù)的特征向量荔燎。在簡(jiǎn)單的分析之后,發(fā)現(xiàn)大部分用戶(hù)的歌單里的歌曲種類(lèi)分別為1(pop),2(folk),3(R&B),5(Alternative)(此處的1,2,3,5代表的就是實(shí)際的歌曲風(fēng)格(括號(hào)內(nèi)為流派)销钝,在js里的獲取到的歌曲種類(lèi)就是此種數(shù)字形式)有咨,考慮到可能還存在用戶(hù)喜歡了一些冷門(mén)的歌曲,種類(lèi)不屬于以上四種蒸健,因此將不屬于此四類(lèi)歌曲風(fēng)格的歌曲類(lèi)型統(tǒng)一記為4座享,至此,這個(gè)由歌曲種類(lèi)所構(gòu)成的長(zhǎng)度為5的向量就是用戶(hù)的特征向量似忧。將這531名用戶(hù)的歌單進(jìn)行兩兩對(duì)比渣叛,僅將與待推薦用戶(hù)歌單相似度最高的用戶(hù)的歌單中的歌曲作為輸出結(jié)果即可。因此對(duì)已經(jīng)爬取到的用戶(hù)數(shù)據(jù)進(jìn)行整理盯捌,統(tǒng)計(jì)每個(gè)用戶(hù)歌單中五類(lèi)各區(qū)各自的數(shù)目如下圖所示


圖11淳衙、統(tǒng)計(jì)每個(gè)用戶(hù)歌單中五類(lèi)歌曲的數(shù)目

2.3.2、算法實(shí)現(xiàn)

數(shù)據(jù)的讀入以及預(yù)處理與根據(jù)內(nèi)容進(jìn)行歌曲推薦的算法部分相同,算法的主要部分是將歌曲信息轉(zhuǎn)換為歌曲種類(lèi)的特征向量然后帶入計(jì)算的過(guò)程饺著,具體代碼見(jiàn)附錄箫攀。輸出結(jié)果格式如下圖


圖12、基于向量相似度的優(yōu)化算法的結(jié)果

2.4幼衰、基于k-means聚類(lèi)分析的優(yōu)化算法

2.4.1靴跛、算法思路

k-means聚類(lèi)分析在此亦不再贅述。具體內(nèi)容可通過(guò)此鏈接(k-means聚類(lèi)分析)自行了解渡嚣。在此處梢睛,我并非將用戶(hù)的歌單信息直接聚類(lèi),原因還是因?yàn)閷⒏枨Q(chēng)作為向量基本元素需要先將歌曲名稱(chēng)映射為具體的數(shù)據(jù)识椰,此映射規(guī)則難以制定绝葡。而且,哪怕映射出了一個(gè)向量腹鹉,此向量的長(zhǎng)度也大于100藏畅,計(jì)算要求過(guò)高,應(yīng)進(jìn)行數(shù)據(jù)的降維种蘸。所以本文采用了在基于相似度中的優(yōu)化算法中得到的特征向來(lái)作為聚類(lèi)的標(biāo)準(zhǔn)墓赴。將此531名用戶(hù)的特征向量進(jìn)行聚類(lèi)分析,將與待推薦用戶(hù)處在同一類(lèi)中用戶(hù)的歌單中的歌曲作為推薦結(jié)果即可航瞭。

2.4.1诫硕、算法實(shí)現(xiàn)

數(shù)據(jù)的讀入以及預(yù)處理與根據(jù)內(nèi)容進(jìn)行歌曲推薦的算法部分相同,算法的主要部分是進(jìn)行聚類(lèi)分析。此處的聚類(lèi)分析并非我自己編寫(xiě)(感覺(jué)麻煩)刊侯,就調(diào)用了scipy里的庫(kù)來(lái)進(jìn)行章办。因此除去代碼編寫(xiě)的問(wèn)題后此部分的核心問(wèn)題就變成了應(yīng)該聚成多少個(gè)類(lèi)。首先我們?nèi)菀字辣醭梗值念?lèi)越多藕届,同類(lèi)之間的特征相似度就越高,分類(lèi)效果就越好(通過(guò)查看不同分類(lèi)的聚類(lèi)損失度我也驗(yàn)證了這個(gè)觀(guān)點(diǎn))亭饵,但是類(lèi)里面的點(diǎn)的數(shù)目就越少休偶。對(duì)于此實(shí)例,因?yàn)楣灿?31名用戶(hù)辜羊,每個(gè)用戶(hù)歌單里最少具有100首歌曲踏兜,倘若要求結(jié)果至少能為用戶(hù)推薦500首歌曲,那么就意味著一個(gè)類(lèi)大約有5個(gè)用戶(hù)即可八秃,因此此處將聚類(lèi)的類(lèi)數(shù)給設(shè)置為100碱妆。以下為推薦結(jié)果


圖13、基于k-means聚類(lèi)分析的優(yōu)化算法的結(jié)果

2.5昔驱、新用戶(hù)的歌曲推薦算法

2.5.1算法思路

以上所有的算法為用戶(hù)推薦歌曲的基礎(chǔ)都是假設(shè)用戶(hù)已經(jīng)喜歡了很多的歌曲然后通過(guò)其喜歡的內(nèi)容來(lái)推薦新的歌曲疹尾。但是如何為一個(gè)新用戶(hù)推薦歌曲呢?答案是顯而易見(jiàn)的骤肛,即為他推送熱門(mén)歌曲纳本。因此,本文將此531名用戶(hù)的喜歡的歌曲進(jìn)行了頻數(shù)統(tǒng)計(jì)以得到熱門(mén)歌曲從而進(jìn)行推送腋颠。順便地饮醇,本文也將統(tǒng)計(jì)結(jié)果生成了詞云圖進(jìn)行可視化,字體越大秕豫,代表歌曲越熱門(mén)朴艰。

2.5.2算法實(shí)現(xiàn)

數(shù)據(jù)的讀入以及預(yù)處理與根據(jù)內(nèi)容進(jìn)行歌曲推薦的算法部分相同。整理數(shù)據(jù)之后混移,用最外層字典根據(jù)用戶(hù)列表里的元素來(lái)逐個(gè)獲取用戶(hù)的歌單信息放入列表中祠墅,再通過(guò)文件讀寫(xiě)的方式將其轉(zhuǎn)為text格式用wordcloud處理即可。

最后歌径,給出以上數(shù)據(jù)分析的代碼毁嗦。
數(shù)據(jù)分析

三、數(shù)據(jù)的可視化

在上方對(duì)新用戶(hù)的歌曲推薦算法中我們對(duì)這531名用戶(hù)的歌單中的歌曲出現(xiàn)的頻數(shù)進(jìn)行了統(tǒng)計(jì)回铛,此處為統(tǒng)計(jì)結(jié)果狗准。下圖即為熱門(mén)歌曲的可視化結(jié)果

圖14克锣、熱門(mén)歌曲可視化結(jié)果

我們可以明顯看出的是熱門(mén)的歌曲中周杰倫的歌曲的數(shù)目明顯是最多的,一方面是因?yàn)橹芙軅愒诋?dāng)今的華語(yǔ)樂(lè)壇確實(shí)是最熱門(mén)的歌手之一腔长;另一方面可能是因?yàn)榇瞬糠钟脩?hù)都是來(lái)源于周杰倫的《晴天》評(píng)論區(qū)袭祟,是周杰倫的粉絲的可能性較為大。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捞附,一起剝皮案震驚了整個(gè)濱河市巾乳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸟召,老刑警劉巖胆绊,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異欧募,居然都是意外死亡压状,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)跟继,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)何缓,“玉大人,你說(shuō)我怎么就攤上這事还栓÷道” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵剩盒,是天一觀(guān)的道長(zhǎng)谷婆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)辽聊,這世上最難降的妖魔是什么纪挎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮跟匆,結(jié)果婚禮上异袄,老公的妹妹穿的比我還像新娘。我一直安慰自己玛臂,他們只是感情好烤蜕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著迹冤,像睡著了一般讽营。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泡徙,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天橱鹏,我揣著相機(jī)與錄音,去河邊找鬼。 笑死莉兰,一個(gè)胖子當(dāng)著我的面吹牛挑围,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播糖荒,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼杉辙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了寂嘉?” 一聲冷哼從身側(cè)響起奏瞬,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤枫绅,失蹤者是張志新(化名)和其女友劉穎泉孩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體并淋,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寓搬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了县耽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片句喷。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖兔毙,靈堂內(nèi)的尸體忽然破棺而出唾琼,到底是詐尸還是另有隱情,我是刑警寧澤澎剥,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布锡溯,位于F島的核電站,受9級(jí)特大地震影響哑姚,放射性物質(zhì)發(fā)生泄漏祭饭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一叙量、第九天 我趴在偏房一處隱蔽的房頂上張望倡蝙。 院中可真熱鬧,春花似錦绞佩、人聲如沸寺鸥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)析既。三九已至,卻和暖如春谆奥,著一層夾襖步出監(jiān)牢的瞬間眼坏,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宰译,地道東北人檐蚜。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像沿侈,于是被迫代替她去往敵國(guó)和親闯第。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容