关不上的窗歌词
一. 词云介绍
词云也叫文字云, 它帮助我们统计文本中高频出现的词, 过滤掉某些常用词后将文本中的重要关键词进行可视化, 方便分析者更好更快地了解文本的重点, 同时还具有一定的美观度.
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.
从上图可以看到, 歌词信息中还包含了时间信息, 因此在拿到歌词后需要使用 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
相关阅读
推荐下载,获取路径: 点击这里,直接下载 我是一个喜欢工作喜欢安静的人,只要做一件工作我都会用心用力做好。有时我想开着汽车到郊
转载自:其他人的博客简介:现在的歌都是需要VIP,但作为平民窟的一员,怎么会花钱冲VIP呢?以下几个网站可以帮助我们免费下载音乐!1.疯狂音
很快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日消息,近年来国内版权意识逐步增强,各大音乐平台都下架了没有版权的音乐。近日歌曲《我要你》的原创