必威体育Betway必威体育官网
当前位置:首页 > IT技术

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

时间:2019-07-27 23:40:00来源:IT技术作者:seo实验室小编阅读:78次「手机版」
 

关不上的窗歌词

一. 词云介绍

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

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日消息,近年来国内版权意识逐步增强,各大音乐平台都下架了没有版权的音乐。近日歌曲《我要你》的原创

分享到:

栏目导航

推荐阅读

热门阅读