风格分类


  先来一张图,这是今年谷歌IO大会上的一张图片,(Tensorflow + Everyone)谷歌抛出这个普及人工智能的想法,希望每个人都可以加入。的的确确,人工智能正在这个世界掀起了热潮。AI仿佛一夜之间进入了各个领域。

  作为技术宅的我们,自然也不应落后,很多人可能都会被模式识别机器学习深度学习 这些看似高深的术语所唬住。所谓人工智能一定是会与众多或复杂或简单的算法及或深或浅相的数学知识相挂钩的,但是好在勤劳的工程师们已经为我们铺好了通天大路,sklearn,tensorflow,caffe等一系列的机器学习框架已经相当的成熟并投入使用。那么我们也将使用这些开源的框架来完成一次AI流程。

  Music是世界永不落伍的话题,每个人都有自己心仪的歌曲。可能有的人喜欢Rap,有的人喜欢古典,有的人喜欢流行乐…… 但更多的人听歌都不单一,喜爱的歌曲种类五花八门,那么如何管理自己的歌单成了一个问题,难道真的要自己手动一个一个去给歌曲设置类别嘛(耗时耗力,真的好累!)那么我们就来挽起袖子撸一波代码,让AI去替我们完成这些费力不讨好的任务。


目标:实现歌曲风格的分类,输入一段歌词,给出所属的分类标签

工具:Python、Scrapy、Selenium、PhantomJS、Sklearn、WordCloud、Matplotlib 、jieba


那么我们给出机器学习的流程图

一套完整的机器学习模型构架加预测的都是基于这个流程图的。那么我们就根据步骤一步一步来处理我们的问题。(这里为了简化一些琐碎的步骤,就去掉了特征筛选这个流程


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来加载歌词界面,并获得到歌词。(由于获得歌词中包含等这样的Html元素标签,所以通过正则手段去掉)最终将获得到的全部信息通过Pipeline输出到文件

这样我们数据提取的过程就结束了,我们得到了一个.csv格式的文件输出,其中每一行就是一首歌及该歌曲的相应信息。部分截图如下:

.csv输出文件部分截图

最后我们就可以用这些数据去进行一些可视化绘图,比如不同风格中最受欢迎的歌手,以及每个风格中的Top10歌曲,不同风格中歌单的平均长

可视化部分

2.数据清理及特征选择

  因为提取到数据还是相对完善,并没有出现复杂的数据清洗需求。因此只是简单的对数据做了一次去掉Nan空值的操作。因为我们做风格分类,所以我们考虑使用每一首歌曲的歌词作为特征,因此我们将爬取到的信息中的歌词和风格单提出来,其中歌词作为特征,风格作为标签。基于此构建一个牛逼的分类器,实现我们的风格分类。                                              通过一些复杂的正则和替换操作,拿到最终的训练数据,格式如下:

训练数据

接下来呢,我们搞个有意思的东西【词云】 我们使用WordCloud jieba 来实现这个小功能。效果图如下:

古风类
英伦类

是不是还足够炫酷的样子!小插曲而已,那么接下来干点正事。我们要去构建模型了              Let us Go!!!


3.模型构建

  因为分类问题嘛,我们现在只选取其中的2类进行分类,分别为【古风、英伦】。首先因为数量不一致,会导致分类器的偏向问题,于是我们首先要对2类样本做一个剪裁。让英伦类样本数量大致与古风类样本相同。

样本数据加载并剪裁到数量一致


然后呐,我们需要去掉一些对我们分类起不到作用甚至是有干扰的单词,也就是停用词

停用词:在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉某些字或词,这些字或词即被称为Stop Words(停用词)。这些停用词都是人工输入、非自动化生成的,生成后的停用词会形成一个停用词表。

我们接下来有好多种方法可以用来做这个分类

  第一种思路是使用词频进行分类,可以通过构建每句话的词频向量完成我们的任务。类似可见新闻文本分类,垃圾邮件等。贝叶斯对这类问题处理的已经很不错了。

②  第二种就是使用了Word2Vec,这个工具可以根据词义构建词义向量。即语义上相近的两个单词那么他们之间的向量距离也更为相近,反之亦然。举个例子:

香蕉苹果 对应的词义向量的欧氏距离更为相近,而 香蕉 , 轮胎 对应的词义向量的欧氏距离要更远。

我们这里选取了第二种方案,使用word2vec对jieba拆分的单词做词义向量构建,然后将每一首歌的歌词中所包含的单词的词义向量相加并取均值,以这个最终结果向量作为该歌曲歌词的含义向量。并重新构建训练数据和测试数据。

svm拟合

最终,我们使用SVM分类器实现最后的模型分类

在经过SVM拟合后的结果如下:


最终训练结果

模型证实我们的分类效能有84%左右。我们仍然可以通过调参的方式去改进模型,提高准确率,这里不再提及。接下来我们可是要迫不及待的去检验一下成果了!


4.预测

哇!这一步真的是去感觉自己的劳动果实味道如何。预测是个享受的过程,中间不必赘述,咱直接跳到最后看看我们都能预测出来什么?

预测结果

                                                       


我还是有底线的!!!

就这样我们亲手实现了一波机器学习流程。回看一下我们所做的,其实数据科学离我们很近,AI离我们也没有那么遥远!加油^0^~



Author: geek 

E-mail  :  zhang@haotian.info                   

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容