基于jiebaR包的陈奕迅歌词文本挖掘
Posted 一条想当数据科学家的咸鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于jiebaR包的陈奕迅歌词文本挖掘相关的知识,希望对你有一定的参考价值。
看了鲁哥做的周杰伦歌词文本挖掘,便觉得有意思想自己也尝试一下。本来想着薛之谦最近这么火,挖一下他的歌词吧,但后来觉得还是挖Eason的比较适当,毕竟洗澡都是听他的歌嘛。
事不宜迟,我们进入正文吧。
数据获取
本案例通过某狗音乐软件下载了97首陈奕迅唱过的歌曲,由于Eason同一首歌曲的粤语版和国语版往往歌词都是截然不同的,因此我们这里会将其视为两首歌曲。接着,我们从缓存文件中提取出97份krc格式的歌词文件,并将其转码成直接打开就能看懂的lrc格式的歌词文件。用txt记事本打开其中一首名叫《岁月如歌》的歌词文件,歌词内容与格式如下图所示。
数据读入
通过list.files(·)函数得到指定路径目录下所有歌词文本的名称,通过字符串连接将路径与名称连接起来,最后通过循环的方式把目录下所有lcr格式歌词文本的内容都读取进同一个数据框中。其中编码格式为“gbk”,若为“UTF-8”则会显示乱码。
> file.Path = "C:\Users\lenovo\Desktop\陈奕迅歌词"
> file.names = list.files(file.Path)
> dir = paste(file.Path,"\",file.names,sep="")
> dataset = read.table(dir[1],sep=" ",encoding="gbk",stringsAsFactors = FALSE)
> for(i in 2:length(dir)){
dataset2 = read.table(dir[i],sep=" ",encoding="gbk",stringsAsFactors = FALSE)
dataset = rbind(dataset,dataset2)
}
数据清洗
我们循环读取得到的是一个4519行,1列(字符型向量)的数据框,我们把第一列作为字符向量提取出来,并命名为Eason.lyric。我们查看该向量的前十个元素。
> dim(dataset)
[1] 4519 1
> Eason.lyric = dataset[,1]
> head(Eason.lyric,10)
[1] "[ar:陈奕迅]" "[ti:1874]"
[3] "[00:24.50]仍然没有遇到" "[00:29.33]那位跟我绝配的恋人"
[5] "[00:33.60]你根本也未有出现" "[00:37.04]还是已然逝去"
[7] "[00:41.34]怀疑在某一个国度里" "[00:44.64]的某一年"
[9] "[00:46.44]还未带我到世上那天" "[00:50.58]存在过一位等我爱的某人"
可以看到这份原始数据中,有着许多与歌词无关的数据,比如时刻、歌手、标题等。因此,我们借助正则表达式将诸如“[XXXXX]”的字符全都删除,只留下我们想要的歌词。值得注意的是,一首歌曲中一些歌词可能会重复唱好几遍,从而会导致某些词出现频率过高。比如单凭一首《圣诞结》,便成功地将“Christmas”、“lonely”、“merry”三个单词送上热词榜榜首了。对其,我们使用unique(·)函数,多次重复的歌词句子只保留一次。同样输出清洗后向量的前十个元素进行观察。
> Eason.lyric = gsub("\[.*\]","",Eason.lyric,fixed=FALSE)
> Eason.lyric = Eason.lyric[nchar(Eason.lyric)>0]
> Eason.lyric = unique(Eason.lyric)
> head(Eason.lyric,10)
[1] "仍然没有遇到" "那位跟我绝配的恋人" "你根本也未有出现"
[4] "还是已然逝去" "怀疑在某一个国度里" "的某一年"
[7] "还未带我到世上那天" "存在过一位等我爱的某人" "夜夜为我失眠"
[10] "从来未相识已不在这个人"
jiebaR包中文分词
我们先是尝试使用jiebaR包对《1874》的部分歌词进行中文分词。可以看到,分词结果良好,但是显然出现了许多诸如“你”、“也”、“的”这些无太大意义的介词、冠词、语气词等。
> library(jiebaR)
> mixseg = worker()
> part.1874.lyric = head(Eason.lyric,9)
> Eason.1874.word = segment(part.1874.lyric,mixseg)
> Eason.1874.word
[1] "仍然" "没有" "遇到" "那位" "跟" "我" "绝配" "的" "恋人" "你" "根本"
[12] "也" "未有" "出现" "还是" "已然" "逝去" "怀疑" "在" "某" "一个" "国度"
[23] "里" "的" "某" "一年" "还" "未" "带" "我" "到" "世上" "那天"
[34] "存在" "过" "一位" "等" "我" "爱" "的" "某人" "夜夜" "为" "我"
[45] "失眠"
接着,我们对所有歌曲歌词文本进行中文分词,排序并输出前十位最频繁出现的字词。
> Eason.word = segment(Eason.lyric,mixseg)
> head(sort(table(Eason.word),decreasing = TRUE),10)
Eason.word
我 的 你 在 了
605 593 526 156 151
是 也 都 不 有
124 111 97 94 84
如我们所料,前十位(其实前几十位都是)最频繁出现的字词都是没有意义的冠词、介词、语气词,这显然不是我们想要的结果。因此我们筛选留下字符串长度大于等于2的词,事实上这样子依然还有许多诸如“不是”、“没有”、“有没有”的词存在,我们可以通过常见词词典筛选将这些词筛选掉。这里小编懒得动脑子,便手动筛选了一遍。筛选后剩余7262个字词,我们从中筛选出100个最频繁的字词,
> Eason.word = Eason.word[nchar(Eason.word)>1]
> length(Eason.word)
[1] 7262
> word.Freq = sort(table(Eason.word),decreasing = TRUE)[1:100]
> word.Freq
Eason.word
世界 知道 自己 一生 爱情
24 24 23 20 19
幸福 需要 拥抱 永远 如果
19 19 19 18 17
什么 为何 怎么 发现 生命
17 17 16 15 14
时间 相信 一秒 一天 作曲
14 14 14 14 14
孤单 孤独 快乐 明白 失去
13 13 13 13 13
所有 我会 最后 不过 从前
13 13 13 12 12
改变 感觉 忘掉 眼泪 当天
12 12 12 12 11
得到 分手 记得 留在 生活
11 11 11 11 11
未来 一切 感想 原来 风雨
11 11 11 11 10
过去 离开 理想 留下 朋友
10 10 10 10 10
如何 身边 时候 说话 喜欢
10 10 10 10 10
心中 终于 回头 寂寞 接受
10 10 9 9 9
今天 看见 明天 一世 拥有
9 9 9 9 9
自由 作词 存在 懂得 甘心
9 9 8 8 8
感情 故事 开始 美丽 天空
8 8 8 8 8
完美 温柔 想起 心底 眼睛
8 8 8 8 8
彼此 沉默 从来 当初 感动
7 7 7 7 7
罕有 怀念 回忆 可惜 玫瑰
7 7 7 7 7
梦想 模样 内疚 努力 习惯
7 7 7 7 7
夜空 原谅 祝福 christmas 别人
7 7 7 6 6
词云制作
得到了前一百最频繁出现的歌词表,我们再借助wordcloud2(·)函数做一个陈奕迅歌词的词云。本来想做成陈奕迅帅照或Eason字母样的,奈何其对图片要求蛮高(小编对图像处理掌握不好),且制作这种词云很慢很卡(小编表示很懵比),因此便制作成简单的五角星状词云了。
> library(wordcloud2)
> wordcloud2(word.Freq,size=0.5,shape="pentagon")
可以看到,和其他的歌手不同,虽然爱情也是出现得蛮频繁的一个词汇,我们Eason的歌曲更多表达的是对“世界”、“一生”、“生命”、“幸福”、“时间”的思考。而且可以看到,其歌曲中,“如何”、“什么”、“怎么”、“为何”都出现得比较频繁,这是因为Eason许多歌词使用的都是用疑问句或反问句。比如《陀飞轮》中的“为何用到尽了,至知哪样紧要”,《红玫瑰》中“身处劣势如何不攻心计,流露敬畏试探爱的法规”。与其他歌手相比,Eason的歌,即使是情歌,也很少使用杂乱繁多的很华丽的比喻,而更多是在用最直白的词汇表达最深刻的情感。其用得最多的物喻也就只有玫瑰了。不像老周,唱首歌必然带各种地名、各种天气、各种季节、各种蝴蝶纸飞机……
其实在词云中看不到“有恃无恐”,我是很惶惑的。Eason不是很喜欢唱有恃无恐吗?《红玫瑰》中,“得不到的永远在骚动,被偏爱的都有恃无恐”;《谢谢侬》中,“我的头痛不再痛,能够生存就有恃无恐”。这个词怎么会不频繁呢?抱着惶惑和郁闷的心情,小编从分词中筛选出中文四字词语,观察其出现频率。
> Eason.word4 = Eason.word[nchar(Eason.word)==4]
> Eason.word4 = gsub("[a-z|A-Z]","",Eason.word4,fixed = FALSE)
> Eason.word4 = Eason.word4[nchar(Eason.word4)>0]
> word4.Freq = sort(table(Eason.word4),decreasing = TRUE)
> head(word4.Freq,10)
Eason.word4
地老天荒 很久很久 一生一世 一无所有
4 3 3 3
灯火阑珊 好久不见 漫长岁月 人来人往
2 2 2 2
若无其事 有恃无恐
2 2
可以看到,有恃无恐只出现了两次……好吧,就是这两处了。其他出现的四字词语印象并不这么深刻,像“地老天荒”,也没觉得出现那么多次啊。除了《K歌之王(粤语)》中“比渴望地老天荒更简单,未算罕有”,还有吗?
最后把Eason四字词语的词云也制作出来,也是经常听Eason歌的你,觉得还有哪些四字词语很陌生呢?
> wordcloud2(word4.Freq,size=0.3,shape="star")
小结
这次对陈奕迅歌词做文本挖掘绝对是一次很有趣的尝试,从数据收集到清洗到分词作云,都给我带来了不少乐趣。之前对数据结构的复习是有裨益的,它恰好帮我很快解决了过程中的一些问题。其次在这次文本挖掘中也发现自己对字符串处理,尤其是正则表达式那块犹不太熟练,打算后续会复习一下,并写一篇字符串处理的笔记。
jiebaR和wordcloud2包也只是粗糙地使用了一下,具体地参数也没有详细地跟大家介绍,后续可能会针对这两个包专门写一期推送来。对文本挖掘有兴趣的小伙伴也可以自己先去学一波啦。
扫码和我签订契约,成为魔法咸鱼吧!
扫码仆と契约して、魔法咸鱼になってよ!
以上是关于基于jiebaR包的陈奕迅歌词文本挖掘的主要内容,如果未能解决你的问题,请参考以下文章