手把手|教你打造一個曲風分類機器人
大數據文摘作品,轉載要求見文末
作者 | 張皓添@稀牛學院數據科學實訓營
Music是永不落伍的話題。
每個人一定都有自己心儀又不單一的音樂風格:rap、古典、流行,那麼如何管理自己的歌單呢?難道真的要自己手動一個一個去給歌曲設置類別嗎(耗時耗力,真的好累!)?
不如挽起袖子擼一波代碼,讓AI去替我們完成這些費力不討好的任務。
人工智慧似乎總是與眾多或複雜或簡單的演算法及或深或淺相的數學知識相掛鉤,但是好在勤勞的工程師們已經為我們鋪好了通天大路,sklearn,tensorflow,caffe等一系列的機器學習框架已經相當的成熟並投入使用。我們也將使用這些開源的框架來完成一次AI流程。
目標:實現歌曲風格的分類,輸入一段歌詞,給出所屬的分類標籤。
工具:Python、Scrapy、Selenium、PhantomJS、Sklearn、WordCloud、Matplotlib 、jieba。
那麼我們給出機器學習的流程圖:
一套完整的機器學習模型構架加預測的都是基於這個流程圖的。那麼我們就根據步驟一步一步來處理我們的問題。
附上教程供各位參考,時常30分鐘,無法及時看到視頻的讀者可以直接下拉看文字版步驟。
1.數據提取
我們的目標是對歌曲進行風格的識別,那麼最最重要的一問題就是 數據從何而來? 沒有數據就沒有模型的地基。考慮了幾個主流的音樂播放器的平台(網易、QQ、Kugou),選擇了歌單分類比較清晰的網易雲音樂歌單。使用爬蟲去對歌單信息進行摘取。
可以看到風格分類還是蠻多的,那麼我們現在要做到的就是在每個分類目錄,拿到屬於該風格的歌單,再從歌單中獲得歌單中所包含的所有歌曲。現在就到了爬蟲展現神威的時刻了,我們通過 scrapy 這個框架來實現,那麼我們要怎麼做恩?
① 首先先把需要的包都import進來。
import library
② 對爬蟲添加請求頭,其中的User-Agent使用faker去模擬。設置起始url。
headers
start_urls
③ 現在呢,我們需要的就是獲得到底有哪些 分類標籤
啊(Tag:流行、爵士...)通過xpath拿到標籤的列表,這裡我們為了節省爬取的時間只選擇了3個標籤。分別為 [ 古風,英倫,鄉村 ]
解析標籤
④ 我們瀏覽實際網頁的時候發現
網易其實對歌單進行了分頁操作,也就是說我們在爬取每個分類的時候還要知道在這個分類中的歌單共有多少頁,所以接下來要去解析 每一類對應有多少頁的歌單 (為了縮小爬取量只用了每個風格5頁歌單,每一頁包含35個歌單)
解析頁數
⑤ 拿到每一頁的歌單之後
我們就需要去遍歷這一頁的每一個歌單,並且拿到 歌單相應信息。我們需要的信息有 【歌單風格,歌單名字,歌單收藏量】分別為 【style,name,counts】
遍歷一頁中的每一個歌單
獲得歌單信息及包含的歌曲列表,並攜帶這些信息繼續去解析歌曲列表中包含的歌曲
⑥ 最複雜的一步來了
我們現在需要找到每首歌曲中所包含的信息,我們所需要的有【歌曲名字,歌曲歌手,歌詞】其中前兩個都好辦,只有最後一個歌詞,是沒有辦法直接獲取到的,因為歌詞是動態載入出來的,為了解決這個問題,我們引入[ selenium + phantomJS ] 來模擬瀏覽器行為,之所以選擇phantom是因為他是無界面的瀏覽器無需渲染,速度更快一些。
首先在初始化的部分,將PhantomJS的設置初始化。添加headers和timeout。
然後在解析每個music的時候,使用PhantomJS來載入歌詞界面,並獲得到歌詞。(由於獲得歌詞中包含<br>等這樣的Html元素標籤,所以通過正則手段去掉)最終將獲得到的全部信息通過Pipeline輸出到文件。
這樣我們數據提取的過程就結束了,我們得到了一個.csv格式的文件輸出,其中每一行就是一首歌及該歌曲的相應信息。部分截圖如下:
.csv輸出文件部分截圖n
最後我們就可以用這些數據去進行一些可視化繪圖,比如不同風格中最受歡迎的歌手,以及每個風格中的Top10歌曲,不同風格中歌單的平均長。
可視化部分
2.數據清洗與特徵選擇
因為提取到數據還是相對完善,並沒有出現複雜的數據清洗需求。因此只是簡單的對數據做了一次去掉Nan空值的操作。因為我們做風格分類,所以我們考慮使用每一首歌曲的歌詞作為特徵,因此我們將爬取到的信息中的歌詞和風格單提出來,其中歌詞作為特徵,風格作為標籤。基於此構建一個牛逼的分類器,實現我們的風格分類。
通過一些複雜的正則和替換操作,拿到最終的訓練數據,格式如下:
訓練數據
接下來呢,我們搞個有意思的東西【詞雲】 我們使用WordCloud 和 jieba 來實現這個小功能。效果圖如下:
古風類
英倫類
是不是還足夠炫酷的樣子!小插曲而已,那麼接下來干點正事。我們要去構建模型了
Let us Go!!!
3.模型構建
因為分類問題嘛,我們現在只選取其中的2類進行分類,分別為【古風、英倫】。
首先因為數量不一致,會導致分類器的偏向問題,於是我們首先要對2類樣本做一個剪裁。讓英倫類樣本數量大致與古風類樣本相同。
樣本數據載入並剪裁到數量一致
然後吶,我們需要去掉一些對我們分類起不到作用甚至是有干擾的單詞,也就是停用詞。
停用詞:在信息檢索中,為節省存儲空間和提高搜索效率,在處理自然語言數據(或文本)之前或之後會自動過濾掉某些字或詞,這些字或詞即被稱為Stop Words(停用詞)。這些停用詞都是人工輸入、非自動化生成的,生成後的停用詞會形成一個停用詞表。
我們接下來有好多種方法可以用來做這個分類
- 第一種思路是使用詞頻進行分類,可以通過構建每句話的詞頻向量完成我們的任務。類似可見新聞文本分類,垃圾郵件等。貝葉斯對這類問題處理的已經很不錯了。
- 第二種就是使用了Word2Vec,這個工具可以根據詞義構建詞義向量。即語義上相近的兩個單詞那麼他們之間的向量距離也更為相近,反之亦然。
舉個例子:
香蕉,蘋果 對應的詞義向量的歐氏距離更為相近,而 香蕉 , 輪胎 對應的詞義向量的歐氏距離要更遠。
我們這裡選取了第二種方案,使用word2vec對jieba拆分的單詞做詞義向量構建,然後將每一首歌的歌詞中所包含的單詞的詞義向量相加並取均值,以這個最終結果向量作為該歌曲歌詞的含義向量。並重新構建訓練數據和測試數據。n
最終,我們使用SVM分類器實現最後的模型分類
在經過SVM擬合後的結果如下:
最終訓練結果
模型證實我們的分類效能有84%左右。我們仍然可以通過調參的方式去改進模型,提高準確率,這裡不再提及。接下來我們可是要迫不及待的去檢驗一下成果了!
4.預測
哇!這一步真的是去感覺自己的勞動果實味道如何。預測是個享受的過程,中間不必贅述,咱直接跳到最後看看我們都能預測出來什麼?
預測結果
就這樣我們親手實現了一波機器學習流程。回看一下我們所做的,其實數據科學離我們很近,AI離我們也沒有那麼遙遠!加油!
推薦閱讀:
※民法通則和大寶劍的故事
※遙感小衛星扎堆發射,預示空間數據流化時代即將到來
※金融需要 hadoop、spark 等這些大數據分析工具嗎?使用場景是怎樣的?
※爬蟲數據分析【旅遊篇】
※一個數據平台省了20個IT人力——敦奴數據平台建設案例分享
TAG:大数据 |