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

若不是周杰伦的新单曲-说好不哭,也许不会再想摸代码。说好不哭,陈词陈调,如果不是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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值