前言
今天這篇文章是我曾經(jīng)做過的一個(gè)數(shù)據(jù)挖掘的項(xiàng)目,主要內(nèi)容是運(yùn)用python爬取QQ音樂用戶歌單并進(jìn)行數(shù)據(jù)的可視化以及歌曲推薦,本項(xiàng)目完整的包含了數(shù)據(jù)的爬取、數(shù)據(jù)的分析以及對(duì)爬取結(jié)果的可視化過程。文章內(nèi)容很多,我本人大多時(shí)候亦難以耐住性子閱讀長(zhǎng)篇技術(shù)類博文。但是由于涵蓋的內(nèi)容較多,我雖已盡可能的用簡(jiǎn)明梗概的語(yǔ)言來描述這整個(gè)過程,篇幅也還是較長(zhǎng),歡迎相互交流一下。
摘要
現(xiàn)如今商品推薦算法已經(jīng)應(yīng)用到了生活中的方方面面,淘寶購(gòu)物、瀏覽新聞、歌曲推薦等功能其核心內(nèi)容都是推薦算法。此篇文章就是將內(nèi)容推薦算法及其簡(jiǎn)單的優(yōu)化之后的算法應(yīng)用到QQ音樂上的一個(gè)具體的實(shí)例,即根據(jù)用戶喜歡的歌曲來推薦新的用戶可能喜歡的歌曲。
關(guān)于數(shù)據(jù)的獲取,本文通過QQ音樂的官網(wǎng)運(yùn)用網(wǎng)絡(luò)爬蟲(相關(guān)代碼見末尾給出的代碼鏈接)獲取到了歌曲《晴天》下的前2500條發(fā)表評(píng)論的用戶的個(gè)人信息以及他們喜歡的歌曲里面的前150首歌曲信息((若喜歡的歌曲不足150則爬取全部的歌曲信息)。由于存在同一名用戶多次評(píng)論以及部分用戶空間上鎖無法訪問的原因,最終得到的歌單可訪問的用戶數(shù)目為1629。對(duì)此1629名用戶的歌單數(shù)目進(jìn)行分析,歌單歌曲數(shù)目大于等于150首的僅有16首,數(shù)目大于120首的用戶數(shù)目為473,數(shù)目大于100的數(shù)目為531。由于歌單歌曲數(shù)目大于150及大于120的用戶數(shù)目過少,最終決定對(duì)歌單數(shù)目大于100的531個(gè)用戶進(jìn)行分析。
首先,本文通過比較這531名用戶歌單,得到其平均重合數(shù)為8.14,即任意兩個(gè)用戶之間有大約8首歌是重復(fù)的。對(duì)于歌單數(shù)目介于100-150首之間的用戶來說,隨機(jī)兩用戶重復(fù)度介于6%-8%之間,由此看來用內(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)算法通過比較歌曲重合度的方法為用戶進(jìn)行了歌曲的推薦。此方法相比傳統(tǒng)的關(guān)聯(lián)規(guī)則的好處是一定可以得到一個(gè)輸出。
隨后,本文仿照向量的相似性算法來進(jìn)行歌曲推薦算法的設(shè)計(jì)。在將用戶的歌單信息映射成為代表用戶的歌曲喜好的特征向量時(shí),由于直接使用歌單內(nèi)歌曲信息難以確定映射規(guī)則同時(shí)數(shù)據(jù)維度過高(至少大于等于100),因此我對(duì)此算法做出了相應(yīng)的修改,即統(tǒng)計(jì)用戶歌單里的所有歌曲的種類及各種類的歌曲數(shù)目,將其作為此用戶的特征向量。此算法相比原來算法,一方面將向量的長(zhǎng)度降低到了5位,另一方面數(shù)目即可直接構(gòu)成向量,不必考慮映射規(guī)則。運(yùn)用以上兩種算法都一定能得到較為準(zhǔn)確的輸出結(jié)果,但是兩種算法都只會(huì)求出契合度最高的用戶的歌單。因?yàn)樵谂廊r(shí)每個(gè)用戶歌單里的歌曲數(shù)目介于100到150之間,去除重復(fù)的歌曲之后,能輸出的推薦的歌曲數(shù)目介于100到130之間。為了提高輸出的推薦歌曲數(shù)目,本文采用了k-means聚類算法,將以上的特征向量進(jìn)行聚類并將與待推薦用戶在同一類的用戶的歌曲信息作為輸出。運(yùn)用此方法平均可得到700到1000首歌曲推薦結(jié)果。
最后,由于以上所有的算法為用戶推薦歌曲的基礎(chǔ)都是假設(shè)用戶已經(jīng)喜歡了一定量的歌曲然后通過其喜歡的內(nèi)容來推薦新的歌曲。但是需要考慮的是每天都有大量的新用戶出現(xiàn),因此此部分用戶的歌曲推薦也是需要考慮的一個(gè)重要部分。本文通過統(tǒng)計(jì)531名用戶的歌單里歌曲的頻數(shù)來確定熱門歌曲,即頻數(shù)越大,越熱門,對(duì)新用戶的推薦算法即將熱門歌曲對(duì)新用戶進(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)榇治鲇脩舻膇d是從歌曲評(píng)論信息中獲得的,所以從越熱門的歌曲下獲取用戶信息那么分析的結(jié)果就越客觀(如果歌曲為小眾歌曲的話最后獲取到的待分析用戶的特征就會(huì)具有明顯的偏向性,不能代表大多數(shù)的用戶)。又因?yàn)樵谀壳埃W(wǎng)最熱門的歌曲為周杰倫的《晴天》(參考文獻(xiàn):全網(wǎng)最熱門歌曲),所以我最終決定爬取的用戶為歌曲《晴天》下的評(píng)論用戶。
其次,由于評(píng)論人數(shù)太多,故這里只選擇爬取前2500名評(píng)論用戶作為分析目標(biāo),并且每個(gè)用戶歌單中的歌曲數(shù)目只爬取前150首(不足150首的則全部爬?。?。
1.2、數(shù)據(jù)的正式爬取
經(jīng)過分析網(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)容如下所示


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

此時(shí),我們用得到的uin進(jìn)行拼接,便可訪問所有用戶的主頁(yè)。在得到用戶主頁(yè)的url之后,我們找到了其獲取喜歡的歌的js地址,如圖4所示

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

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


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

最后,下面給出本次的歌單爬取結(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ù)處理。在用爬蟲爬取數(shù)據(jù)時(shí),我一共爬取了100頁(yè)的評(píng)論,因此理論上得到的可訪問歌單的用戶數(shù)目為2500。但是由于某些特殊的情況,例如同一個(gè)用戶在此歌曲下多次評(píng)論、部分用戶的空間加鎖等,實(shí)際得到的歌單信息不為空的用戶數(shù)目為1629。
對(duì)于此1629名歌單里歌曲數(shù)目不為0的用戶,本文先做了以下用戶歌單歌曲數(shù)目預(yù)分析,如圖9所示。

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

用Python按上述思路實(shí)現(xiàn)可得其平均重合度為8.14,即任意兩個(gè)用戶之間有大約8首歌是重復(fù)的。對(duì)于歌單數(shù)目介于100-150首之間的用戶來說,隨機(jī)兩用戶重復(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組用戶數(shù)據(jù),一個(gè)最基本的推薦算法就是根據(jù)關(guān)聯(lián)規(guī)則來進(jìn)行歌曲的推薦。簡(jiǎn)單來說就是將這531名用戶的歌單進(jìn)行兩兩對(duì)比,假設(shè)一個(gè)用戶的歌單內(nèi)歌曲數(shù)目為 M ,另一個(gè)用戶的歌單內(nèi)歌曲數(shù)目為 N ,當(dāng)他們重合的歌曲數(shù)目占歌單總歌曲數(shù)目的比例大于某個(gè)給定的閾值 T 時(shí),他們的相關(guān)性 a 置為1,即認(rèn)為這兩組用戶具有相關(guān)性;反之, a 置為0,即認(rèn)為不相關(guān)。公式如下:

進(jìn)而在為用戶推薦歌曲時(shí),只需將與此用戶具有相關(guān)度的用戶的歌曲推薦給他即可。
但是這種算法在閾值 T 的選取上沒有一個(gè)準(zhǔn)確的約定,對(duì)于這個(gè)實(shí)例來說,根據(jù)前面求得的的平均重合度 ( λ=8.14 ) ,我們指定的閾值應(yīng)該為8%,但是經(jīng)過分析8%這個(gè)重合度大約只有1/3的組數(shù)能達(dá)到,所以按照此類方法有可能得不到任何的輸出結(jié)果。倘若為了得到輸出而調(diào)低閾值,就可能得到龐大的歌曲推薦結(jié)果,導(dǎo)致結(jié)果不再具有實(shí)際的意義。因此,再對(duì)以上的算法進(jìn)行改進(jìn),改進(jìn)后算法為:將這531名用戶的歌單進(jìn)行兩兩對(duì)比,僅將與待推薦用戶歌單重合度最高的用戶的歌單中的歌曲作為輸出結(jié)果。
2.2.2算法實(shí)現(xiàn)
因?yàn)樵谇懊鎸⑴廊〉臄?shù)據(jù)結(jié)果寫入到文件中時(shí),我對(duì)數(shù)據(jù)進(jìn)行了簡(jiǎn)單的處理,將其寫為了嵌套字典的格式,類似如下結(jié)果(以下僅為字典中的一個(gè)鍵值對(duì))
{'范佩西':{'夕陽(yáng)醉了': '1', '回望': '1', 'The Hit Nation': '1', '暗號(hào)': '1', '紙短情長(zhǎng)': '2', '其實(shí)都沒有': '1', '回到過去': '1', 'Polaris': '1', '等你下課(with 楊瑞代)': '1', '唇語(yǔ)': '1', '空空如也': '1', 'Call Of The Ambulance': '1', "DJ's International": '2', 'Summertime Sadness': '2', '佛系少女': '1', '甜到爆表': '1', '不僅僅是喜歡': '1', '慢慢喜歡你': '1', '放過自己': '1', '再見只是陌生人': '1', '愛你沒差': '1', '好可惜': '1', '我落淚情緒零碎': '1', '冰雨': '1', '知足': '2', '手寫的從前': '2', '龍卷風(fēng)': '2', '夜曲': '2', '遇見': '2', '周杰倫歌曲串燒': '2', '安靜': '2', '讓我取暖': '1', '天空': '3', '那年夏天寧?kù)o的海': '1', '一首簡(jiǎn)單的歌': '1', '專屬情歌': '1', '如果的事': '1', '一場(chǎng)游戲一場(chǎng)夢(mèng)': '1', '遺失的美好': '1', '曖昧': '1', '那些花兒': '3', '他一定很愛你': '1', '約定': '1', '黃昏': '1', '比我幸福': '1', '斷點(diǎn)': '1', '一生有你': '1', '情非得已': '1', '一個(gè)人的北京': '1', '你,好不好?': '1', '哭砂': '1', '排行榜': '1', '心疼·筆記本': '1', '背叛': '1', '尋水的魚': '1', '虎口脫險(xiǎn)': '1', '想你就寫信': '1', '發(fā)如雪': '1', '那片海': '1', '娃娃臉': '1', '下一站天后': '1', '給我一個(gè)理由忘記': '1', '董小姐': '2', '老男孩': '1', '愛很美': '1', '不再聯(lián)系': '1', '愛夏': '1', '怎樣': '1', '斑馬,斑馬': '2', '我的歌聲里': '1', '最初的夢(mèng)想': '1', '第一次': '1', '我們的愛': '1', '大城小愛': '1', '愿得一人心': '1', '青花': '1', '平凡之路': '1', '拯救': '1', '寂寞沙洲冷': '1', '青春紀(jì)念冊(cè)': '1', '你快回來': '1', '不想讓你哭': '1', '只要你過得比我好': '1', '就是愛你': '1', '無情的雨無情的你': '1', '我終于失去了你': '1', '藍(lán)色土耳其': '1', '我難過': '1', '男人好難': '1', '風(fēng)吹麥浪': '2', '向往': '1', '當(dāng)愛已成往事': '1', '讓我歡喜讓我憂': '1', '花心': '1', '練習(xí)': '1', '風(fēng)往北吹': '1', '兩個(gè)人的煙火': '3', '到不了': '1', '白色戀人': '1', '我們的紀(jì)念': '1', 'Only Love': '3', '達(dá)爾文': '1', '心肝寶貝': '1','BINGBIAN病變': '1', 'PLANET': '1', '孤單北半球': '1', '相見不如懷念': '1', '距離': '1', '說好的童話': '1', '下個(gè),路口,見': '1', '下個(gè)路口見': '1', '一笑而過': '1', '紅玫瑰': '1', '不將就': '1', '我的地盤': '3', '美人魚': '1', '歲月神偷': '1', '請(qǐng)跟我聯(lián)絡(luò)': '1', '倒帶': '1', '一笑而過 + 你的背包': '1', '一口氣全念對(duì)': '1', '我要夏天': '1', '派偉俊': '3', '羅曼蒂克的愛情': '1', '斷了的弦': '1', '不要對(duì)他說': '1', '??': '1', '習(xí)慣一個(gè)人': '1', '一人一城': '1', '春風(fēng)十里': '1', '滂沱大雨里': '3', '你還要我怎樣': '1', '那個(gè)男人': '1', '北極星的眼淚': '1', '第三者的第三者': '1', 'Liekkas': '2', '心墻': '1', '下雨天': '1', '眼淚知道': '1'}}
外層字典的鍵為用戶昵稱,值為歌單信息。同時(shí),歌單信息也為一個(gè)字典,這個(gè)字典的鍵為歌曲名稱,值為歌曲種類。至于在此寫入歌曲種類的原因則是為了接下來的優(yōu)化算法的實(shí)現(xiàn)。首先,將文件按行讀取并將讀取結(jié)果寫入到一個(gè)字典中(此時(shí)字典中的每一項(xiàng)都為一個(gè)字典,格式同上),再將歌單長(zhǎng)度大于等于100的用戶昵稱寫入到一個(gè)列表。于是,通過遍歷此列表中的每一個(gè)元素就能得到用戶的昵稱,前面構(gòu)建的字典通過此昵稱就能得到用戶的歌曲信息,最后,只需將取出的歌曲運(yùn)用set進(jìn)行比較即可。輸出結(jié)果格式如下圖

2.3、基于向量相似度的優(yōu)化算法
2.3.1、算法思路
向量相似度算法在此不再贅述。具體內(nèi)容可通過此鏈接(向量的相似性)自行了解。在此,仿照向量相似度的計(jì)算,以歌曲名稱作為向量的各個(gè)分量信息,將這 531 名用戶的歌單進(jìn)行兩兩對(duì)比,假設(shè)第f用戶的歌單內(nèi)歌曲構(gòu)成的向量為 ,第s用戶的歌單內(nèi)歌曲構(gòu)成的向量為
,相似度為
,公式如下:

將這531名用戶的歌單進(jìn)行兩兩對(duì)比,僅將與待推薦用戶歌單相似度最高的用戶的歌單中的歌曲作為輸出結(jié)果即可。但是算法目前涉及到三個(gè)問題:
1、這里作為分析對(duì)象的 531 名用戶的歌單長(zhǎng)度只是保證了大于等于100,即只保證了向量的長(zhǎng)度大于100,并不能保證向量的長(zhǎng)度相同,因此無法做向量的點(diǎn)乘運(yùn)算。
2、歌曲名稱作為向量基本元素需要先將歌曲名稱映射為具體的數(shù)據(jù),此映射規(guī)則難以制定。
3、哪怕映射出了一個(gè)向量,此向量的長(zhǎng)度也大于100,計(jì)算要求過高,應(yīng)進(jìn)行數(shù)據(jù)的降維。
因此做以下處理,統(tǒng)計(jì)用戶歌單里的所有歌曲的種類及各種類的歌曲數(shù)目,將其作為此用戶的特征向量。在簡(jiǎn)單的分析之后,發(fā)現(xiàn)大部分用戶的歌單里的歌曲種類分別為1(pop),2(folk),3(R&B),5(Alternative)(此處的1,2,3,5代表的就是實(shí)際的歌曲風(fēng)格(括號(hào)內(nèi)為流派),在js里的獲取到的歌曲種類就是此種數(shù)字形式),考慮到可能還存在用戶喜歡了一些冷門的歌曲,種類不屬于以上四種,因此將不屬于此四類歌曲風(fēng)格的歌曲類型統(tǒng)一記為4,至此,這個(gè)由歌曲種類所構(gòu)成的長(zhǎng)度為5的向量就是用戶的特征向量。將這531名用戶的歌單進(jìn)行兩兩對(duì)比,僅將與待推薦用戶歌單相似度最高的用戶的歌單中的歌曲作為輸出結(jié)果即可。因此對(duì)已經(jīng)爬取到的用戶數(shù)據(jù)進(jìn)行整理,統(tǒng)計(jì)每個(gè)用戶歌單中五類各區(qū)各自的數(shù)目如下圖所示

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

2.4、基于k-means聚類分析的優(yōu)化算法
2.4.1、算法思路
k-means聚類分析在此亦不再贅述。具體內(nèi)容可通過此鏈接(k-means聚類分析)自行了解。在此處,我并非將用戶的歌單信息直接聚類,原因還是因?yàn)閷⒏枨Q作為向量基本元素需要先將歌曲名稱映射為具體的數(shù)據(jù),此映射規(guī)則難以制定。而且,哪怕映射出了一個(gè)向量,此向量的長(zhǎng)度也大于100,計(jì)算要求過高,應(yīng)進(jìn)行數(shù)據(jù)的降維。所以本文采用了在基于相似度中的優(yōu)化算法中得到的特征向來作為聚類的標(biāo)準(zhǔn)。將此531名用戶的特征向量進(jìn)行聚類分析,將與待推薦用戶處在同一類中用戶的歌單中的歌曲作為推薦結(jié)果即可。
2.4.1、算法實(shí)現(xiàn)
數(shù)據(jù)的讀入以及預(yù)處理與根據(jù)內(nèi)容進(jìn)行歌曲推薦的算法部分相同,算法的主要部分是進(jìn)行聚類分析。此處的聚類分析并非我自己編寫(感覺麻煩),就調(diào)用了scipy里的庫(kù)來進(jìn)行。因此除去代碼編寫的問題后此部分的核心問題就變成了應(yīng)該聚成多少個(gè)類。首先我們?nèi)菀字溃值念愒蕉?,同類之間的特征相似度就越高,分類效果就越好(通過查看不同分類的聚類損失度我也驗(yàn)證了這個(gè)觀點(diǎn)),但是類里面的點(diǎn)的數(shù)目就越少。對(duì)于此實(shí)例,因?yàn)楣灿?31名用戶,每個(gè)用戶歌單里最少具有100首歌曲,倘若要求結(jié)果至少能為用戶推薦500首歌曲,那么就意味著一個(gè)類大約有5個(gè)用戶即可,因此此處將聚類的類數(shù)給設(shè)置為100。以下為推薦結(jié)果

2.5、新用戶的歌曲推薦算法
2.5.1算法思路
以上所有的算法為用戶推薦歌曲的基礎(chǔ)都是假設(shè)用戶已經(jīng)喜歡了很多的歌曲然后通過其喜歡的內(nèi)容來推薦新的歌曲。但是如何為一個(gè)新用戶推薦歌曲呢?答案是顯而易見的,即為他推送熱門歌曲。因此,本文將此531名用戶的喜歡的歌曲進(jìn)行了頻數(shù)統(tǒng)計(jì)以得到熱門歌曲從而進(jìn)行推送。順便地,本文也將統(tǒng)計(jì)結(jié)果生成了詞云圖進(jìn)行可視化,字體越大,代表歌曲越熱門。
2.5.2算法實(shí)現(xiàn)
數(shù)據(jù)的讀入以及預(yù)處理與根據(jù)內(nèi)容進(jìn)行歌曲推薦的算法部分相同。整理數(shù)據(jù)之后,用最外層字典根據(jù)用戶列表里的元素來逐個(gè)獲取用戶的歌單信息放入列表中,再通過文件讀寫的方式將其轉(zhuǎn)為text格式用wordcloud處理即可。
最后,給出以上數(shù)據(jù)分析的代碼。
數(shù)據(jù)分析
三、數(shù)據(jù)的可視化
在上方對(duì)新用戶的歌曲推薦算法中我們對(duì)這531名用戶的歌單中的歌曲出現(xiàn)的頻數(shù)進(jìn)行了統(tǒng)計(jì),此處為統(tǒng)計(jì)結(jié)果。下圖即為熱門歌曲的可視化結(jié)果

我們可以明顯看出的是熱門的歌曲中周杰倫的歌曲的數(shù)目明顯是最多的,一方面是因?yàn)橹芙軅愒诋?dāng)今的華語(yǔ)樂壇確實(shí)是最熱門的歌手之一;另一方面可能是因?yàn)榇瞬糠钟脩舳际莵碓从谥芙軅惖摹肚缣臁吩u(píng)論區(qū),是周杰倫的粉絲的可能性較為大。