Q:为什么要做这个分析?A:纯娱乐。一方面因为兴趣正好在自学网页文字信息爬取,另一方面我爱大老师(*^▽^*)
用到的包:
importrequestsimportpandasaspdimportreimportmatplotlib.pyplotaspltfromwordcloudimportWordCloud,ImageColorGeneratorimportjieba
从魔镜网获取歌词
这是我第一次用Python爬取网页信息,参考了网上很多歌词爬取的教程,总结下来发现最多的是爬取网易云和QQ音乐的歌词。可惜如果歌曲数量大的话这些爬取需要设置代理,操作比较复杂,对新手不太友好。为了省事儿,我直接从魔镜歌词网(http://mojim.com)来获取歌词数据了,对于分析大老师歌词的目的来说足够用了。
首先,通过歌手页面获取歌手的歌曲目录和链接。
defgetSong *** ySinger(url):access singers pagewithrequests.Session()assession:response=session.get(url)singer_text=response.textGet a map of url to songshtm_name_pairs=re.findall(r(.*)\n,str(singer_text))htm2name={i:[a[0],a[1].split("<")[0],]fori,ainenumerate(htm_name_pairs)}returnhtm2name
接着通过歌曲链接进入歌曲页面,获取具体歌词部分。
defgetContentbySong(url):get the content of a spcific song pagewithrequests.Session()assession:response=session.get(url)text=response.textfilter the content to get lyric partcontent=re.findall(r" \n(.*)\n",str(text),re.DOTALL)[0]content_unescaped=re.split(|\n,html.unescape(content).replace(u"更多更详尽歌词 在 ※ Mojim.com\u3000魔镜歌词网",""))returncontent_unescaped
然后找到了大张伟和花儿乐队的歌手页面:
url_dzw=https://mojim.com/cnh107586-A2.htm大张伟url_flowers=https://mojim.com/cnh100271-A2.htm花儿乐队
信息爬取下来经过了简单的清洗和处理。我只保留了由他自己作词或参与作词的部分歌曲,筛选掉了其他一些他演唱但没有作词的歌。但因为数据清洗很粗略,可能有同一首歌不同标题的多个版本出现多次的现象,这会对后续的内容带来一定误差。以后有时间再改进这一部分。
清洗后剩下了145首歌,处理好的信息存入数据框:
歌词分析与词云绘制
接下来的歌词分析主要用到了结巴中文分词和Python的wordcloud包。
对每一句歌词用结巴进行了自动分词,然后对每个中英文词汇的出现次数进行了统计,以得到词频。
wordCount=dict()foridxinrange(len(df_nodup)):lyric=df.loc[idx,lyric].split("\n")forlinlyric:Get English words in the lineenglish=re.findall("[a-z,A-Z,0-9]+",l)context=re.sub("[a-z,A-Z,0-9,!,!,.,-,一,?,~,\u3000,(,)]+","",l)context = re.sub("[ ]+","",context)Get Chinese words in the line using Jiebaseg_list=jieba.cut(context,cut_all=False,HMM=False)chinese=[wforwinseg_listifw!=]words=english+chinesePut words into the dictionaryforwinwords:ifwinwordCount:wordCount[w]+=1else:wordCount[w]=1
在这些歌里,一共分出了4033个不同的中/英文词汇,词汇总数达到31,526。也就是说平均每个词出现了约7.8次。
这一步结束,就已经能回答标题里的问题了。
那么,大老师在这将近150首歌里,究竟用了多少个啦/哦/呀/呦/哒/啊/吧/哈/哩呢?答案是:
啦:487哦:290呀:214呦:193哒:182啊:178吧:171哈:157哩:118
o(*≧▽≦)ツ o(*≧▽≦)ツ o(*≧▽≦)ツ
接下来找了他新专(20是件更美好的事)作背景色,找了个好看的字体,绘制了歌词的词云。
back_color = plt.imread("dzw_bg.jpg")
mask_color = ImageColorGenerator(back_color)
wordcloud = WordCloud(background_color="white", max_words=1000,
mask=back_color, max_font_size=256, random_state=5)
wordcloud.generate_from_frequencies(frequencies=wordFreq)
wordcloud.recolor(color_func=mask_color)
plot wordcloud
plt.figure(figsize=(10,10))
plt.imshow(wordcloud, interpolation=bilinear)
plt.axis("off")
plt.show()
pass
我没有删除掉如我、的、了等常用词,所以它们在词云中非常显眼。
前1000个常用词的词云长这样:
一眼看过去,满屏大老师扑面而来!
如果画出所有词:
大老师更多了呢!