更新于2017年5月5日,调整了情感分析接口,重新计算了前十榜单,并且提供了本次项目涉及歌曲的情感查询,大家可以自己输入歌名查到它属于正面情绪还是负面情绪——
前言
我分析了王力宏、周杰伦、林俊杰和潘玮柏的32万字歌词,就是为了找到最伤感的一首歌。
本项目受到一文的启发以及下面的这幅图,一张让我更加确定了“已经年纪不小了”这个残酷事实的图。
说实话,这上面的歌手我大概只认识一半,听过的歌更是少的可怜,大概只有《青春修炼手册》,《演员》还有张杰翻唱的《街角的祝福》。
关于华语男歌手的认识应该是停在初中了吧。那时火的是周杰伦,王力宏,林俊杰和潘玮柏——
我们班几个男生因为经常唱他们的歌有了诸如“宗杰伦”,“温俊杰”,“鱼力宏”的外号;
我们全寝室在社会实践表演会上合唱了一首《枫》,由于有我这种跑调天王的存在,我们没有拿到最佳歌曲节目奖;
有一个学期在操场捡了一个用电池的mp3,只有512MB。我们在电脑课上把歌拷进去,然后每晚轮流听,听了好久;
由于他们的歌都烂熟于心,所以有几个同学就养成了一个不良爱好——改编歌词,往往会改得很恶俗,《菊花残》这种还算普通,印象中最恶俗的歌就是——《腋毛海》。
。
。
。
好了,虽然类似的回忆还有很多,但就此打住吧,毕竟这篇文章的主要目的,是从数据分析的角度对王力宏,周杰伦,林俊杰和潘玮柏的歌词进行分析。主要研究几个有趣的问题,比如:
1. 他们最正面情绪的十首歌是哪些?
2. 他们最负面情绪的十首歌是哪些?
3. 总的来说,哪个人的歌词最伤感?
4. 总的来说,哪个人的歌词最欢快!
5. 他们最喜欢季节是什么?
6. 他们最常用“你”,“我”还是“她”?
7. 谁最会说“爱”字?
当然,因为歌词和歌手存在着一定程度的割裂,有些作词并不是歌手本身,但本次研究不考虑这些问题。换个角度想,这些歌是被歌手不断演唱而知名,所以里面肯定蕴含了歌手本身的情感和认知,不然也不会唱火,你说是吧?(突然自己感觉自己说的很有道理,嗯)
数据来源
本次数据来源于百度音乐。我用第三方工具pyspider写了一个爬虫自动抓取了1000多条数据。说实话,从百度音乐抓下来的歌词数据格式不是特别好看,乱糟糟,比如歌词开头两三行介绍歌手、作曲、作词的顺序不太一样。这让我想起了以前用酷狗听歌的时候,歌词都是云端匹配,良莠不齐。很多歌词前面都会带着一个QQ号,大概是制作这个歌词的人,有的甚至会写一两段话,诸如“XXX,你要知道我一直很爱你”之类的话,有点莫名其妙。但是,因为一些版权和爬虫抓取难易程度的原因,百度音乐是目前的最佳选择,所以只好用它。最终,我获得的数据包含了以下字段:
专辑名album,歌手singer, 歌词lyrics 和歌名title
歌词部分共有32万个字符。由于有些歌曲存在着歌词缺失,不得不做处理。在数据清洗之后的有效歌曲数如下:
接着就开始今天的重头戏——情感分析。
情感分析
在情感分析中,我用到了这个工具,直接可以在python调用对字符串进行情感分析,免费用户只能一天五百次的调用次数,不过已经够用了(我注册了三四个号)。
它是这么介绍他的情感分析功能的:基于上百万条社交网络平衡语料和数十万条新闻平衡语料的机器学习模型,结合自主开发的半监督学习技术,正负面情感分析准确度达到80%~85% ,
在BosonNLP工具中,情感分析的结果由两部分构成,正面情绪分和负面情绪分,两者加起来等于1。
心理学上把焦虑、紧张、愤怒、沮丧、悲伤、痛苦等情绪统称为负面情绪。而正面情绪是指人的一种积极的情绪,开心、乐观、自信、欣赏、放松等等。所以之前我用消极和积极有点不妥(虽然negative和positive翻译过来是这样),毕竟汉语博大精深。例如,我发现一些rap歌曲被分到了负面情绪,但它并不是消极的,只是包含了紧张激动的情绪,这点受到了@伍宇伦的启发。
在整体情感分析前,我挑了一些歌对即将用到的工具进行了测试。在下面表格sentiment一栏中,左侧的数字代表着积极情绪分,右侧的数字代表着消极情绪分。
首先测试的是周杰伦的《安静》,结果测出来是绝对的负面,似乎还不错:
再来一首《阳光宅男》,结果是绝对的正面,符合预期:
最后来测一首潘玮柏的《我对天空说》,这首歌真的悲伤啦,看来这个工具也能正确的识别:
在测试完这三个后我就放心的开始整体探索(其实我还测了很多),毕竟人家都把这个工具出来卖了,准确性肯定很高。
受到@的接口,把通用接口换成了微博接口,重新跑了一次情感分数,已经更新如下。后面的榜单也做了更新,个人感觉稍微又合理些。但是微博语料和歌词还是差很多,最好的条件应该是自己有个针对歌词的训练样本,这样准确率会提高很多。
最后得到了一个整体的结果,我发现四位歌手中,积极情绪分数最高的是林俊杰,其次是潘玮柏,王力宏第三,周杰伦最低。因为互加为1,消极情绪的分数的排名就刚好相反。
周杰伦的歌之所以积极情绪最低,消极情绪最高可能是有两个原因造成的:1)他的歌很多本身歌词就比较悲伤 2)周杰伦的歌总体数量比其他三位要多,而他们大部分的歌都是属于情歌,而情歌呢有大部分都很悲伤,所以就会拉低这积极情绪的评分。
接下来看一下每位歌手最正面情绪和最负面情绪的十大金曲吧!
王力宏
王力宏十大“负面情绪”歌曲:
王力宏十大“正面情绪”歌曲:
周杰伦
周杰伦十大“负面情绪”歌曲:
周杰伦十大“正面情绪”歌曲:
林俊杰
林俊杰十大“负面情绪”歌曲:
林俊杰十大“正面情绪”歌曲:
潘玮柏
潘玮柏十大“负面情绪”歌曲:
潘玮柏十大“正面情绪”歌曲:
基于以上榜单,我终于找到了最伤感的歌——《倒带》,消极指数高达0.99726。(虽然周杰伦只是唱过倒带)
大家说某某一歌曲怎么没有入选十大榜单,那是因为给的分数稍微低了点。但是大家提到的歌曲我都回头看了下,基本分类正确,即大家认为它应该是负面情绪的,算出来的负面情绪就是大于0.5。只不过在小数点之后的数值差异受到训练样本和算法的影响,有差距。所以前十的榜单只是一个参考作用。毕竟情感分析的首要目的是分类正确(正面or负面),而不是在分类后的排序中的准确。
歌曲查询地址:,用了金数据的一个功能,大家点进去之后输入你想查的歌名就会得到相应的回馈,如图所示:
趣味探索
在结束了主要部分情感分析内容后,我对歌词的用词和意象也做了一些探索。我把每首歌的歌词进行拆分,排除掉了停用词,对剩下的词做了一个频率统计。
你我还是她?
我首先对“你”,“我”,“他/她”三个词进行分析。大部分的歌以第一人称和第二人称为主。其中王力宏的歌词中第一人称出现比率较高,潘玮柏的歌词中第二人称出现的比较多。相对而言,第三人称在周杰伦的歌词中出现的比率比较高。
我们可以推断出什么呢?王力宏是个自我意识比较强,善于表达自己的人;潘玮柏擅长与别人沟通,会站在对方角度考虑;周杰伦则像是站在旁观者的角度描述别人,有一种距离感(以上这是我的瞎扯)
“爱”你有多深?
在流行歌曲中,情歌的比重占了绝大部分,所以“爱”一字出现的频率比较高,我也对此做了一个统计。结果显示,在王力宏的所有歌曲里,“爱”出现的频率略高于其他三位男歌手,周杰伦的反而最低。这也可能和他的“旁观者”角度也有关系。王力宏因为对“我”字用的比较频繁,所以就经常表达自己的爱意,这么一想也就解释的通了。
四个人最喜欢的季节?
通过词频分析,周杰伦的歌词中有关秋天的意象出现的最多,王力宏则比较喜欢冬天和春天,林俊杰对夏天的热爱比较浓烈,潘玮柏的歌词中表现出的倾向性不大。
林俊杰和潘玮柏歌词中对季节描述相对较少
总结与展望
本次项目主要从数据分析的角度对四位华语男歌手的歌词进行了探索,分析了歌词的情感,找出了消极和积极的前十排行,也对几个字词进行了趣味性的探索。
这是我第一次接触中文文本分析这块内容,自然有很大的不足。一开始我是想自己写情感分析模块,但是因为如果自己写的话会涉及到情感词典,否定词,程度词权重等诸多问题,我在尝试后得到的结果不尽如人意,又意外找到了一个快捷的工具,所以就放弃了自建情感分析。希望以后有机会可以自己再尝试,应用机器学习的方式做出自己的文本分析模型。
感谢大家的留言,基本每条都看啦,并且根据大家的意见重新修改了一下内容。再次感谢大家对本文不足之处的指正。另外代码都放在了我的上,有需要自取(不过这次notebook写的有点乱)。作为一个小白,希望和大家多多交流,相互学习!
来源:小白的数据分析师养成之路
链接:https://zhuanlan.zhihu.com/p/26664812
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。