风格分类

作者: GeEKOh | 来源:发表于2017-06-30 20:10 被阅读0次

      先来一张图,这是今年谷歌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                   

    相关文章

      网友评论

        本文标题:风格分类

        本文链接:https://www.haomeiwen.com/subject/buqicxtx.html