[DA45] 使用python对歌手歌曲做词云展示

 

关不上的窗歌词

一. 词云介绍

词云也叫文字云, 它帮助我们统计文本中高频出现的词, 过滤掉某些常用词后将文本中的重要关键词进行可视化, 方便分析者更好更快地了解文本的重点, 同时还具有一定的美观度.

Python 提供了词云工具 wordcloud , 通过 from wordcloud import WordCloud 导入 WordCloud 类, 它的主要构造方法如下:

 wc = WordCloud(     background_color='white',# 设置背景颜色     mask=backgroud_Image, # 设置背景图片     font_path='./SimHei.ttf', # 设置字体,针对中文的情况需要设置中文字体,否则显示乱码     max_words=100, # 设置最大的字数     stopwords=stopwords, # 设置停用词 	max_font_size=150, # 设置字体最大值 	width=2000, # 设置画布的宽度 	height=1200, # 设置画布的高度     random_state=30, # 设置多少种随机状态,即多少种颜色 ) 

创建好 WordCloud 类之后, 就可以使用 wordcloud = generate(text) 方法生成词云, 传入的参数 text 代表你要分析的文本. 最后使用 wordcloud.tofile(“***.jpg”) 函数, 将得到的词云图像直接保存为图片格式文件.

二. 歌词获取

歌词来源于网易云音乐, 本例首先抓取徐佳莹的歌词信息, 首先进入歌手界面https://music.163.com/#/artist?id=9940

分析url, 可得网易云音乐的歌手界面url为 ‘https://music.163.com/#/artist?id=’+ 歌手ID, 徐佳莹的歌手ID为9940. 

页面中包含了50首热门歌曲, 观察网页代码中, 可以获取每首歌曲的名称和songid, 获取songid 后, 通过网易云的歌词API, 可以获取到相应songid的歌词信息 http://music.163.com/api/song/lyric?os=pc&id=306664&lv=-1&kv=-1&tv=-1.

部分网页源代码

通过拼接url 拿到id=306664(身骑白马)的歌词

从上图可以看到, 歌词信息中还包含了时间信息, 因此在拿到歌词后需要使用 re.sub 函数, 通过正则表达式匹配将 [] 中数字信息去掉. 

在此构造了两个函数get_songs() 和 get_song_lyric(), 分别用于获取50首热门歌曲信息与每首歌的歌词信息, 代码如下:

 # 得到指定歌手页面 热门前 50 的歌曲 ID,歌曲名 def get_songs(artist_id):     page_url = 'https://music.163.com/artist?id=' + artist_id     # 获取网页 HTML     res = requests.request('GET', page_url, headers=headers)     # 用 XPath 解析 前 50 首热门歌曲     html = etree.HTML(res.text)     href_xpath = "//*[@id='hotsong-list']//a/@href"     name_xpath = "//*[@id='hotsong-list']//a/text()"     hrefs = html.xpath(href_xpath)     names = html.xpath(name_xpath)     # 设置热门歌曲的 ID,歌曲名称     song_ids = []     song_names = []     for href, name in zip(hrefs, names):         song_ids.APPend(href[9:])         song_names.append(name)         print(href[9:], '  ', name)     return song_ids, song_names   # 得到某一首歌的歌词 def get_song_lyric(headers, lyric_url):     res = requests.request('GET', lyric_url, headers=headers)     if 'lrc' in res.json():         lyric = res.json()['lrc']['lyric']         new_lyric = re.sub(r'[d:.[]]', '', lyric)         return new_lyric     else:         return ''

构建的抓取请求头如下:

 # 构建请求头 headers = {     'referer': 'http://music.163.com',     'Host': 'music.163.com',     'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',     'User-Agent': 'Chrome/10' }

 三. 生成词云

定义 all_word = ”, 通过for 循环把所有获得的歌词加在all_word 字符串中, 得到所有的歌词.

因为得到的 all_word 字符串中包含的是完整的歌词语句, 首先需要清除一些对结果无用的高频词汇, 如:’作词’, ‘音乐’, 再通过中文分词工具包 jiaba 对整个字符串进行分词处理, 最后构造 WordCloud 类, 生成词云图片.

之前生成的图片包含相同的词汇, 查阅之后发现是词云统计了搭配词造成, 在构造 WordCloud 时加入参数 collocations=False 后可避免此情况.

去除停用词与生成词云的函数代码如下(最大50词):

 # 去掉停用词 def remove_stop_words(f, stop_words):     for stop_word in stop_words:         f = f.replace(stop_word, '')     return f   # 生成词云 def create_word_cloud(f, artist_id, stop_words):     print('根据词频,开始生成词云!')     f = remove_stop_words(f, stop_words)     cut_text = " ".join(jieba.cut(f, cut_all=False, HMM=True))     wc = WordCloud(         collocations=False,  # 不统计搭配词(词组)         font_path="./SimHei.ttf",         max_words=50,         width=2000,         height=1200,         random_state=10,     )     print(cut_text)     wordcloud = wc.generate(cut_text)     # 写词云图片     wordcloud.to_file(artist_id + ".jpg")

构建停用词表如下:

 # 构建停用词表 stop_words = ['作词', '作曲', '编曲', 'Arranger', '录音', '混音', '人声', 'Vocal', '弦乐', 'Keyboard', '键盘', '编辑',               '助理', 'Assistants', 'Mixing', 'Editing', 'Recording', '音乐', '制作', 'producer', '发行', 'produced',               'and', 'distributed', '总监']

因为歌词中大概率包含歌手本人名字, 于是通过  stop_words = stop_words + [‘徐佳莹’]  把歌手名加入了停用词表.

最后生成的词云图片如下:

徐佳莹

在代码中替换了字体样式, 测试了林俊杰(id:3684)与赵雷(id:6731)的词云信息, 结果如下:

林俊杰

赵雷

通过替换代码中的歌手ID, 停用词与 WordCloud 参数, 还可以发现更多的有趣信息.

完整代码见: https://github.com/Vincentchu9527/wordcloud_01

相关阅读

2019车载歌曲打包下载 开车必备100首歌曲 车载音乐百

推荐下载,获取路径: 点击这里,直接下载 我是一个喜欢工作喜欢安静的人,只要做一件工作我都会用心用力做好。有时我想开着汽车到郊

免费下载歌曲的网站,收费歌曲也可以下载

转载自:其他人的博客简介:现在的歌都是需要VIP,但作为平民窟的一员,怎么会花钱冲VIP呢?以下几个网站可以帮助我们免费下载音乐!1.疯狂音

2019抖音歌曲排行榜前十名

很快2019年都快过去一半了,那么在2019年又有哪些动人心弦的烧脑神曲呢?今天就来为大家列出自认为2019抖音最火的10大神曲。 1.你的

英文歌曲:What I Have Done(变形金刚第一部主题曲)

In this farewell 在这里告别 there’s no blood 没有血 there’s no alibi 没有借口 Cause I’ve drawn regret from the tr

斗鱼冯提莫直播歌曲涉嫌侵权 原创作者微博声讨

A5创业网(公众号:iadmin5)9月17日消息,近年来国内版权意识逐步增强,各大音乐平台都下架了没有版权的音乐。近日歌曲《我要你》的原创

发表评论