若不是周杰伦的新单曲-说好不哭,也许不会再想摸代码。说好不哭,陈词陈调,如果不是MV,真听不下去,完全没有一点中国风。喜欢Jay,就是因为他的词风,曲风,东风破,天青色,明明就...,现在这些标榜Jay中国风的歌词即将成为过去。

有点失望,失望之余,想一探究竟。用程序来分析下,周杰伦的歌是怎么一步步到今天这地步的。最简单方法是上网下载所有的歌词,再找一个词云网站。

不过,身为工科男,还是自己来吧,虽然十多年没有摸过代码了。说干就干,顺便学习下Python,网络爬虫,人工智能NLP,统计分析等模块。<无知者无畏,以为逆天的AI无所不能>。

没做过多的设计,按照抓歌->分词->统计分析的思路。

《Python编程从入门到实践》主要看了前面几章数据结构,就开干了。所有都现学现卖,一切从抓取网页开始。在编码过程中,需要什么功能,就直接搜索,效率高!

然鹅,写代码容易,测试通过难呀!编码五分钟,调测两小时!毕竟从来没有认真写过代码。对数据结构的理解不透,数据结构之间的转换不熟,字符串/文本/CSV/Jason文件操作就够喝一壶的。更不用说正则表达式,Xpath,Ajax内容抓取,TF-IDF统计,百度情感分析,Excel统计功能等内容,一点都不香!!!

调程序太花时间,时间有限。白天在公司搬砖,只能利用晚上和节假日时间。要血命!常常发生已经调通的代码,又不通了。刚测试完的代码,换成函数又不通。

不过,程序写到现在,Python是真好用。在学过的语言中,Python是用户体验最好的,是人类的语言,语法简单、亲和、大条、清新,库包丰富,跟C/C++体验完全不一样,没那么多条条框框,逻辑性没那么强!看来朋友圈广告说零基础学Python是真的,少儿编程学Python的确未偿不可!

经过三周,近50小时,终于把Jay第一张专辑到2016年的专辑的所有歌词整理好了。核心代码不超过50行,大部分代码都是处理文件的存取,数据结构的转换和格式化。最后的TF-IDF计算是用Excel函数做的,比编码快。关于编码过程中踩过的坑、关键算法和源码后续再说。先看看目前的分析结果。

1,Jay是勤奋型全才歌手

本次搜集Jay的158首歌,Jay作曲的有157首,作词的有34首,作曲+作词+编曲的有10首。你知道的,Jay还给其他人写歌。

2,方文山是Jay的御用作者

在158首歌中,方文山作词的有88首。当然,说好不哭也是方文山作词的,Jay的中国风越来越弱,方文山首当其冲呀。

3,Jay的专辑中,打酱油的作词者有点多

除了Jay,方文山是主力词作者外,黄俊郎算一位。徐若瑄在2000年-2003年写了几首。其他就是打酱油的了,哈哈。所以做Jay的歌曲分析时,可以把这上面这些歌曲剔除掉,减少噪音。

词作者单一,Jay和方文山作词的歌占了近80%。反映曲风,词风相对稳定,在相对稳定的情况下。写出《说好不哭》就不难理解了,江郎才尽。当然,这还没完,继续分析。

科普:

TF-IDF(Term Frequency–Inverse Document Frequency)是一种统计方法,用来评估单词在文件里的重要程度,单词次数出现越多越重要,用词频表示,计算公式:TF=Count(w,d)/Size(d),Count(w,d)表示单词在文章中出现的次数,Size(d)表示该文章总单词数。如果单纯比较次数,肯定不准确,比如“介词、连词、感叹词和人称等等”,每篇文章都会大量使用。为了降低这些词汇的干扰,需要计算单词在所有文档中出现的次数,即逆向文件频率(IDF:Inverse Document Frequency),计算公式:IDF(w)=lg(N/docs(w,D))其中,N是文档总数;docs(w, D)是单词所出现过的文件数量。

IDF是一个全局因子,其考虑的不是文档本身的特征,而是特征单词之间的相对重要性。特征词出现在其中的文档数目越多,IDF值越低,这个词区分不同文档的能力就越差。IDF值越大,说明单词在所有文档中出现的次数少,单词特征明显,比如双截棍。TF和IDF相乘即得到单词的的TF-IDF值。为了提高效率,在分词阶段就会先过滤那些无意义词汇,俗称停用词。

但是,TF-IDF的定义就决定了其先天性不足,缺陷明显,请往下结合分析结果来看。

4,周杰伦印象

在所有歌曲中,根据最高频词汇统计,周杰伦印象如下:

按每首歌的歌词的TF-IDF分值最高统计,周杰伦印象如下:

没错,双截棍是周杰伦所有标签中最大的一个。此外,爷爷,外婆,妈妈等这类亲情属性的词语较多,表示Jay的歌亲情远多于爱情。不过,出现父亲的歌曲较少。

如果哼哼哈兮是周杰伦的个性,那么霍霍活活就是方文山的标签了,哈哈。

5,专辑的TF-IDF走向

根据专辑中每首歌的歌词的TF-IDF分值,累加得到专辑的TF-IDF值。专辑的TF-IDF值是否需要加权统计暂不研究。结果如下:

结果说明,Jay刚出道时,个性突出。他主要的代表歌曲都是在刚出道这几年写的。然后个性逐年下降。虽然后续专辑中也有代表歌曲,但相对于整张专辑来说,份量不足,导致专辑的TF-IDF值不高。2013年突然拔高,跟电影有关,因为这些歌曲都是电影插曲。而以往歌曲中相同主题较少,所以专辑得分较高。但专辑《天台电影原声带》并没有广为流传的歌曲。

6,专辑关键词,根据TF-IDF抽取的关键词的词云

7,TF-IDF得分最高的歌

是的,没错,得分最高的歌并不是双截棍。这跟算法有关,继续看...

8,TF-IDF得分最低的十首歌

是的,没错,《前世情人》Jay写给女儿的那首歌,得分也蛮低的。继续看....

8,TF-IDF失灵了

当看到《青花瓷》的得分比《Mine Mine》还低时,整个人就不好了。

只要审美正常的,都会觉得青花瓷的歌词比MineMine更美。青花瓷得分低的原因在于全篇歌词都太美,对整首歌进行分词,过滤掉停用词(无意义词)之后,词汇总量高达88,MineMine词汇量是55。以Mine中的词汇“罚单”和青花瓷的“勾勒”为例来说明两者的TF-IDF得分差异。这两个词在歌中和所有专辑中都只出现一次,总的歌曲数量是158,根据计算公式:

罚单的TF-IDF=1/55*lg(158/1)=0.040

勾勒的TF-IDF=1/88*lg(158/1)=0.026

虽然两个词在文档和所有专辑中只出现一次,但分词后,因为青花瓷的词数量较多,所以青花瓷的歌词的TF-IDF值就更低。

这是TF-IDF的不足,忽略了词义本身,导致这么美的青花瓷得分很低。再举个例子,一个用GRE/托福词汇写的文章,得分尽然比用三四级单词写的文章得分更低。在湖边看到一群鸟,有人感叹“落霞与孤鹜齐飞,秋水共长天一色”。有人感叹“卧槽!好美!卧槽!还有鸟!”,如果两个人得分一样,你受得了吗?

上网查了资料,目前并没有直接的解决方案。这说明人工智能-自然语言处理仍在初级阶段,语料库仍不丰富。虽然在分词领域有很多专业词库,语料库,停用词等。但基础语料库仍不完备,不足以直接判断一首歌单纯从作词方面的好坏。

情感分析应用场景有限,情感分析主要判断文本是正向,负向还是中性。比如高兴是正向,悲伤是负向。但是负向的,也有很多好歌。但对于情感分系统来说,都一样是零分,此外,无法给出更多的评价。

下图是百度的情感分析的测试结果,是不是很.糙.很.初.级。这些词汇,高兴的sentiment为2,表示正向情绪,其他词汇,不管意境如何均为1分,表示中性情绪。这是认真的吗?号称比你更懂中文的百度尚且如此。

所以,TF-IDF只能做初步的分析筛选,进一步的分析需要更高级的算法。网上有专家在某些场景提到过TF-IDF的不足和提出修正方案。个人认为这是TF-IDF 1.2-1.5版本,现在是需要2.0版本。

接下来会继续研究,对TF-IDF进行修正,目标就是让青花瓷的得分能超过像MineMine这样的歌曲。最直接的方法就是将计算公式改成:TF-IDF=lg(Size(d)/Count(w,d)) * lg(N/docs(w,D))

但是这只能解决这个问题,不能解决这类问题。比如又来一首烂歌,分词词汇量达到100,那得分依然比青花瓷高。计划增加一个评价系数。通过情感分析和外界对歌曲的评价综合给歌曲打分。比如抓取网易云音乐和QQ音乐的评价,结合情感分析对所有评价进行打分,得到歌曲的评价系数。

更佳的方案是深度学习,让程序学习优美的歌曲,然后给歌打分。不过,这有点难。但是,只要有一根网线,还有什么是难的呢?

自然语言处理发展几十年了了,基础语料仍不完善。逆天的AI,基础设施建设还很薄弱呀。

TBD

Python手撕周杰伦158首歌之后,结果很尴尬,TF-IDF有缺陷,以为AI是王者相关推荐

  1. python手撕分水岭算法

    python手撕分水岭算法 1 分水岭算法实现 主要思路就是: 利用一个优先队列与有序队列(有序队列其实可以不用).优先队列是按像素的灰度值排列的,灰度值低的先被淹. 通过统计像素的附近的点的标记种类 ...

  2. 083-我最爱的周杰伦几首歌

    周杰伦的每一首歌我都听过 前9张专辑的歌基本上是每首歌都听了无数次 但是最爱之中还有最最爱 其实有非常多首难以抉择 但是我又加上了一些标准 第一.要绝对的周杰伦风格 第二.要方文山作词 <双截棍 ...

  3. 周杰伦178首歌被网易云侵权 单曲仅获赔4500元

    近日,中国高法旗下中国裁判文书网公布了杭州网易云音乐科技有限公司.杭州乐读科技有限公司侵权周杰伦一案判决书.就网易云音乐于2018年3月31日版权到期后打包售卖周杰伦专辑的行为进行终审裁决,就网易云音 ...

  4. 3天,我用Python手撕了一个深度学习框架!

    人工智能如何学习?要看哪些书? 经常听到有粉丝问到这类的问题,其实,要想学习人工智能,你需要先搞懂什么是人工智能. 01  人工智能概念的提出 人工智能(Artificial Intelligence ...

  5. python设置桌面歌词,我在想办法让python简单地发布一首歌的歌词

    我是python编程的初学者,在我的一个作业中,我将使用python编写一个代码来表达这些歌词. 这位老人,他扮演了一个 他在我的拇指上耍小把戏 小摆设PaddyHack,给你的狗一根骨头 这个老人滚 ...

  6. python六角星绘制_一小时销量破百万,Python告诉你周杰伦的《Mojito》到底有多火!...

    [导语]:今天我们来聊聊周杰伦的新歌<Mojito>,Python技术部分请看第三部分,Show me data,用数据说话 6月12日0:00,周杰伦的最新单曲<Mojito> ...

  7. 一小时销量破百万,Python告诉你周杰伦的《Mojito》到底有多火!

    ▼ 更多精彩推荐,请关注我们 ▼ 作者:Mika 数据:真达   后期:泽龙 [导语]:今天我们来聊聊周杰伦的新歌<Mojito>,Python技术部分请看第三部分.公众号后台,回复关键字 ...

  8. 影响我此生的几首歌(转载)

    迄今影响我此生的几首歌:       1.<如果云知道>--许茹芸:此曲只是天上有,落得凡尘斑驳泪.唯恐夜来孤闻听,梦鸣魂牵年少魅.据说这首歌唤醒过重度昏迷几近成为植物人的一名病人,我想这 ...

  9. 闲来无聊 听几首歌 休息的时候

    落幕-心微 (无意在百度中搜到的,很有味道) 卸妆女子-涂紫凝 (很赞) 欠你的幸福-陈诗慧 (强烈推荐-一首很冷门的歌,却很耐听很伤感哦) Disguise伪装-Lene marlin 琳恩玛莲 ( ...

  10. java唱哪首歌好听_《我是歌手》最好听的十首歌盘点:你心中天籁之音是哪首?...

    <我是歌手>这档节目涌现了很多好的作品,让那些有实力的歌手再一次出现在大众的眼前,呈现出他们好的作品,这个节目含金量很高.下面我们就来盘点一下<我是歌手>中最好听的十首歌. T ...

最新文章

  1. UA MATH563 概率论的数学基础 中心极限定理16 Kolmogorov 3-series定理
  2. 浅谈工作流引擎的几个关键因素
  3. 历史最牛 多页切换TabHost,给大家参考。
  4. session与cookie的简单使用
  5. linux之一些比较新但是常用的命令(expr ag tree cloc stat tmux axel)
  6. Spring框架学习笔记06:Spring JdbcTemplate入门
  7. WPF编程学习 —— 样式
  8. 《深入浅出设计模式》小结
  9. u盘加密truecrypt_Mac OS X上的TrueCrypt驱动器加密入门
  10. 阿里巴巴分布式调度引擎tbschedule实战三tbschedule的调度原理
  11. 推荐10款效率可以翻倍的IDEA插件,撸码利器
  12. java 家谱管理系统_家谱管理系统
  13. firefox控制台打开方法
  14. c++ int 的范围
  15. 理论篇如何学习硬件设计
  16. 基于云开发的智慧校园小程序的设计与实现
  17. 让图片和文字居中对齐的方法
  18. 多路海康网络摄像头数据实时回调(采用软解码方式)
  19. Java面向对象基础腚级理解
  20. gimbal lock 视频解释

热门文章

  1. SQOOP学习笔记-报错怎么办?打就完了!
  2. 大数据分析师岗位是青春饭
  3. 1分钟搞定 OneNote自己账号扩容到15G永久免费空间
  4. s3c2440汇编语言,S3C2440-裸机篇-03 | GPIO的使用(点亮LED、按键检测)
  5. Javascript的事件冒泡
  6. Pytorch创建多任务学习模型
  7. Linux中shell的cat,linux shell cat 命令
  8. GSM、PLMN区、msc区、位置区、基站区、小区、TAC、CI 名词解析
  9. 软件工程考研笔记整理(三小时速成)(1)
  10. 一场对爱情的反思《少有人走的路:心智成熟的旅程》