5万余首圣诞歌词数据包+Kaggle数据科学家的脑洞=?(附数据包+代码)-阿里云开发者社区

开发者社区> 大数据文摘> 正文

5万余首圣诞歌词数据包+Kaggle数据科学家的脑洞=?(附数据包+代码)

简介:

昨天在python给你的圣诞帽上意犹未尽的动手党(点击查看相关文章),今天的话题依然和圣诞节有关。

前几天,文摘菌发现了一个Kaggle上的圣诞歌曲数据礼包。这里有你能想到所有的圣诞歌曲,总计超过5万首。而Kaggle上的数据科学家用各种方式要把它们玩儿坏了,一起看看有哪些有趣的结论!

又是圣诞节,有没有被大街小巷的圣诞歌曲洗耳朵?有没有想过这些圣诞歌曲到底有什么魔力?他们的歌词又有什么共同点?

我们把所有跟圣诞有关的歌曲都打包起来,总计超过5万首歌曲。在这篇文章里,文摘菌将首先用朴素贝叶斯对这些歌曲文本进行全面分析,来快速识别出,到底什么样的歌曲才能被成为真正意义上的圣诞歌曲。

之后,我们还可以一起看看,kaggle上的数据科学家用这个数据包分析出了的这些有趣的结论:

与圣诞关系最密切的歌词TOP20;
圣诞歌产量最高的歌手TOP20;
圣诞歌词中,什么样的双音节词最受欢迎?

436f064994e9dfd9bc672b37ed9fd7edb9aac2a1

这个数据集取自55000多段歌词,同时涵盖了超过55000首歌曲。你能想到的全都有,包括Jinglebell :)如下:这是一个有55000多行和4列的数据框:

  • 艺术家
  • 歌曲
  • 链接
  • 文本

4fb5907066fba5fc9c36acaedcce006778bf8638

我们的目标是对歌曲文本进行全面分析,帮助我们快速识别出圣诞歌曲。为此,我们首先在数据框中添加一个额外的列,给每首歌曲一个“圣诞”或“非圣诞”的标签,也就是歌词中包含“Christmas”,“Xmas”或“X-mas”的歌曲将被标记为“圣诞”,不包含的则标成“非圣诞”。

d488277289e5e00479ba32546f03bde47f81da8d

这还只是标签的初始化,我们之后会将朴素贝叶斯应用于一组训练集以识别其他圣诞歌曲。但现在,我们将通过一些直观的描述性方法来探索数据集。看看会得到一些什么有趣的结果。

e0b8f13c74dd3778e1cea1d4a6a867ada8cf6742

探索初始的圣诞歌曲

清理 & 标记化

首先我们从数据清理和标记化开始~随后,圣诞歌曲将被选中并被保存为一个变量

6d4daf1cfff04042ae2c7ec3943668d95ac35de9

相关性分析

现在我们可以从不同的角度由相关性来分析原始的圣诞歌曲。接下来,我们运用networkD3 html widget将相关性可视化:具有相同总连接数的节点将被赋予相同的颜色,而边的颜色意味着由两个节点共享的公共邻居的数量。而且,一个节点的大小表明它的中心性,中心性由中间性(即通过它的最短路径的数量)定义。在两个节点之间的距离是1的最小最大变换减去相关度,这是有意义的,因为直观来说,相关性越高,两个节点应该越近。而且,距离越短,边缘越宽。

请注意,相关性永远要基于歌词才行

单词之间的相关性

出现超过100次的单词与至少另一个相关度大于0.55的单词相关。

62f8ffa13bbc82b630a1b19d25faf44f0dc1e48b

歌曲之间的相关性

一首歌曲与其他至少3首相关的歌曲之间的相关性大于0.75-通过这个方法,我们可以检测到类似或被略微修改的歌曲。

39391d52dc99e651ae1dfa9ec9a8497ab87e6bf3

特定的词之间的相关性

6375d63c22abf5f9704a5a8fd133ec4b8f28bf9e

艺术家之间的相关性

83a4cfe825e6c12da50213fa2f3ce44227976bcc

词云

原始圣诞歌曲的词云

851f9c7a48217fa47af2683c7780e6dc864b8002

朴素贝叶斯


朴素贝叶斯是一种流行的监督机器学习算法,它能处理具有大量特征的分类问题。它是基于一个类,这个类的特征是被假定独立分布的,所以从这种意义上说,它是“朴素”的。在我们的例子中,我们想知道,给定一组特征之后,即文档中单词的tf-idf,一首歌曲是否应该被朴素贝叶斯分类为圣诞歌曲。

af03c72409736027508b17f871b3b70370651452

构造最大似然估计的难点是先验分布的选择,即类的概率分布。通常假定它是按类频率均匀分布或估计的。在我们的例子中,我们使用了先验分布的多项式分布和均匀分布,这意味着我们在没有进一步信息的情况下对歌曲的分类是没有偏见。

识别隐藏的圣诞歌曲

0762c3362eea6984a4f8c41c6b5d31a1b99d6eb8

我们识别出2965首隐藏的圣诞歌曲,在最初的500首圣诞歌曲中,有2首歌曲被朴素贝叶斯拒绝认定为圣诞歌曲。

探索隐藏的圣诞歌曲

c53a23b2e85e17890d9b82f5d73b864fb6e6bbf9

因此我们已经成功地识别出一些宗教圣诞歌曲,它们的标题通常不包含“Christmas”或“X-mas”单词。

潜在狄利克雷分布&t统计随机邻域嵌入

数据准备

只有包括隐藏在内的圣诞歌曲的前300项特征,将被用来计算Rtsne和LDA,否则存储空间会不足。

7e0a2cdce4309dcb7045fbf7125db765ac9e0909

LDA

LDA是潜在狄利克雷分布,2003年在Blei, Ng, Jordan的论文中被提出。这是一个生成语料库的概率模型,其中的文档被表示为关于潜在主题的随机混合物,一个单独的文档通常只有几个主题,被分配了不可忽视的概率。此外,每个主题的特点是单词的分布,通常只有一小部分词被大概率分配给某个主题。变分期望最大化算法或吉布斯抽样用于参数的统计推断。

LDA需要固定数量的主题,也就是说,在应用该算法之前,应该先知道主题的数目。然而,有可能通过不同的性能度量来确定主题的最佳数量,比如Nikita,用ldatuning包。

9afa9ba82a3a03240157a6e046759cac5baf37a9

因此,我们将选择8作为主题的最佳数量。

d2465b7c3c3755c17065a8a1a737a195c34f5083

我们可以使用tidytext包 来检查每个文档的主题分布,即对于每个文档,它属于从1到8某个主题的概率的总和等于1。

b60190c42077950d04c9d1d01fee361efa5dd4b4

同样,我们也可以获得每个主题词的概率分布,即每个主题产生不同的单词的概率总和等于1。

523d48de89205fd4574efebb21c97236481c18fb

每个主题的关键词是:

5e8adce41fd6bbd4059194b8eae42fd222e2439b

t-SNE


由van der Maaten和Hinton于2008年开发,t-SNE代表统计随机邻域嵌入,这是一种降维技术,用公式表示出捕获的原始数据点的局部聚类结构。它是非线性的和不确定性的。

下面的计算大约需要30分钟。

14618f258d0e178810d261f4e9586d7804e0be90

如果我们重复以上过程在不只一次迭代上呢?

到目前为止,我们只运行了一次迭代的朴素贝叶斯。然而,我们可以为多个迭代重复这个过程,即训练一个朴素贝叶斯分类器并重新标记所有的假阳性为隐藏圣诞/圣诞,所有的假阴性为隐藏非圣诞/非圣诞,一遍遍重复进行。

首先,我们再次准备数据以避免错误。

506f6dc7eba28e485a002b24d7614b04f1a4acc0

运行10次迭代。

c64ce7c40f7352cc7c40a46c318308ff280ed684

然后,精度和f1得分开始时单调增长,然后收敛到大约0.95的值,这意味着没有遗留很多待检测的“隐藏圣诞歌曲”和“隐藏非圣诞歌曲”。然而,在这个过程中,我们始终相信朴素贝叶斯分类器是100%准确的,这实际上几乎是不可能的。因此,在每一次迭代中,有一些歌曲被朴素贝叶斯错误地分类为“圣诞节”,在训练集的下一个迭代中用于训练朴素贝叶斯分类器。有了这个不断累积的错误,我们可能会担心,随着迭代次数的增加,结果实际上会更糟。

00e94758b920493033f32e5e90bfb87613b4d276

最后,我们大约有一半的歌曲被归类为“圣诞节”,而另一半为“不是圣诞节”,这似乎是非常不可信的。这倒是引出了一个问题:是否存在一个最佳的迭代次数?我们不能简单地手动控制这57650首歌是否被正确分类。所以这仍然是一个有待回答的开放式问题!

还有哪些有趣的结论

之后,我们用这些数据,还分析出了以下这些有趣的结论,基于篇幅的原因,我们直接贴出kaggle上的一些有趣结论,不再在微信推文中po出实现代码,想亲手尝试的同学,请拉到文末查看kaggle上的代码和数据传送门~


原文发布时间为:2017-12-25

本文作者:文摘菌

本文来自云栖社区合作伙伴“大数据文摘”,了解相关信息可以关注“大数据文摘”微信公众号

版权声明:如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:developerteam@list.alibaba-inc.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
大数据文摘
使用钉钉扫一扫加入圈子
+ 订阅

官方博客
官网链接