数据分析实战 45 讲
陈旸
清华大学计算机博士
123928 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
第二模块:数据分析算法篇 (20讲)
第四模块:数据分析工作篇 (2讲)
数据分析实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

38丨数据可视化实战:如何给毛不易的歌曲做词云展示?

生成词云
获取歌词
获取歌手页面热门歌曲ID
词云分析阶段
准备阶段
使用Matplotlib显示
生成词云
创建WordCloud类
了解词云
XPath工具
Python爬虫
词云分析工具
使用Matplotlib进行显示
词云生成方法
Python提供的词云工具
思考题
下载字体和代码
词云工具WordCloud的应用
数据准备的重要性
代码示例
项目流程
词云制作代码示例
词云制作步骤
词云制作流程
词云工具WordCloud
总结
给毛不易的歌词制作词云
制作词云
词云可视化
数据可视化实战

该思维导图由 AI 生成,仅供参考

今天我们做一个数据可视化的项目。
我们经常需要对分析的数据提取常用词,做词云展示。比如一些互联网公司会抓取用户的画像,或者每日讨论话题的关键词,形成词云并进行展示。再或者,假如你喜欢某个歌手,想了解这个歌手创作的歌曲中经常用到哪些词语,词云就是个很好的工具。最后,只需要将词云生成一张图片就可以直观地看到结果。
那么在今天的实战项目里,有 3 个目标需要掌握:
掌握词云分析工具,并进行可视化呈现;
掌握 Python 爬虫,对网页的数据进行爬取;
掌握 XPath 工具,分析提取想要的元素 。

如何制作词云

首先我们需要了解什么是词云。词云也叫文字云,它帮助我们统计文本中高频出现的词,过滤掉某些常用词(比如“作曲”“作词”),将文本中的重要关键词进行可视化,方便分析者更好更快地了解文本的重点,同时还具有一定的美观度。
Python 提供了词云工具 WordCloud,使用 pip install 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 类之后,就可以使用 wordcloud=generate(text) 方法生成词云,传入的参数 text 代表你要分析的文本,最后使用 wordcloud.tofile(“a.jpg”) 函数,将得到的词云图像直接保存为图片格式文件。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何利用数据可视化工具对毛不易的歌词进行词云展示的实战项目。通过Python的WordCloud工具和Matplotlib进行词云的生成和展示,读者可以学习到词云的基本原理和制作方法,掌握Python爬虫和XPath工具的使用,以及如何利用WordCloud对歌词进行分析和可视化。文章详细讲解了获取网易云音乐的歌词数据,并提供了相关代码和运行结果,帮助读者快速掌握词云制作的技术流程。通过本文,读者可以获得对数据分析、数据可视化和文本处理的实用技术内容。文章还提到了词云工具WordCloud的使用方法和注意事项,以及对歌单进行词云展示的思考题,为读者提供了进一步探索的方向。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据分析实战 45 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(27)

  • 最新
  • 精选
  • third
    from wordcloud import WordCloud import matplotlib.pyplot as plt import requests 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' } def getsong(headers): url = 'http://music.163.com/api/playlist/detail?id=753776811' res = requests.request('GET', url, headers=headers) page = res.json() tracks=page['result']['tracks'] list = [] for i in range(len(tracks)): Name = tracks[i]["name"] list.append(Name) return list def create_WordCloud(list): print("根源词频计算词云") wc = WordCloud( font_path="simhei.ttf", max_words=100, # 设置最大字数 width=2000, # 设置画布宽度 height=1200, # 设置画布高度 random_state=100 ) wordcloud = wc.generate(list) # 写词云图片 wordcloud.to_file("作业.jpg") # 显示词云文件 plt.imshow(wordcloud) # 不需要显示X/Y轴,用off将坐标轴关闭 plt.axis("off") plt.show() # 去掉停用词以及中英文混合的词 def remove_stop_words(f): stop_words = ['(伴奏)', '(Demo版)', '(必胜客新春版)'] mixed_words = ['Bonus Track:一荤一素', 'Bonus Track:给你给我'] for stop_word in stop_words: f = f.replace(stop_word, '') for mixed_word in mixed_words: f = f.replace(mixed_word, mixed_word[12:]) return f gerlists = getsong(headers) # 获取歌单是list类型直接转化为转换为str lists_str = " ".join(gerlists) lists = remove_stop_words(lists_str) create_WordCloud(lists)

    作者回复: Good Job

    2019-03-20
    2
    4
  • 王彬成
    (2)将歌单的歌曲对应的歌词作词云展示 import requests import jieba from wordcloud import WordCloud import matplotlib.pyplot as plt #得到指定歌单页面的 全部歌曲的歌曲ID,歌曲名 def get_songs(playlist_id): page_url='http://music.163.com/api/playlist/detail?id='+playlist_id #获取网页HTML res=requests.request('GET',page_url,headers=headers) # 输出歌单中歌曲数量 print(len(res.json()['result']['tracks'])) # 设置热门歌曲的ID,歌曲名称 song_ids=[] song_names=[] for i in range(len(res.json()['result']['tracks'])): names=res.json()['result']['tracks'][i]['name'] ids=res.json()['result']['tracks'][i]['id'] song_names.append(names) song_ids.append(ids) print(names,' ',ids) return song_names,song_ids # 得到某一首歌的歌词 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 '' print(res.json()) #生成词云 def create_word_cloud(f): print('根据词频 生成词云') f=remove_stop_words(f) cut_text=' '.join(jieba.cut(f,cut_all=False,HMM=True)) wc = WordCloud( font_path="./wc.ttf", max_words=100, width=2000, height=1200, ) print(cut_text) wordcloud = wc.generate(cut_text) # 写词云图片 wordcloud.to_file("wordcloud.jpg") # 显示词云文件 plt.imshow(wordcloud) plt.axis("off") plt.show() # 设置歌单ID,【毛不易 | 不善言辞的深情】为753776811 playlist_id='753776811' [song_names,song_ids]=get_songs(playlist_id) #所有歌词 all_word='' # 获取每首歌歌词 for (song_id, song_name) in zip(song_ids, song_names): # 歌词 API URL lyric_url = 'http://music.163.com/api/song/lyric?os=pc&id=' + str(song_id) + '&lv=-1&kv=-1&tv=-1' lyric = get_song_lyric(headers, lyric_url) all_word = all_word + ' ' + lyric print(song_name) #根据词频,生成词云 create_word_cloud(all_word)

    作者回复: Good Job

    2019-03-13
    3
  • 课后作业:语言Python3.6 import requests import matplotlib.pyplot as plt from wordcloud import WordCloud #创建请求头 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' } #获取歌单 def get_song_name(req_url): res = requests.request('GET',req_url,headers=headers) if 'tracks' in res.json()['result']: tracks = res.json()['result']['tracks'] names = [] for i in range(len(tracks)): name = tracks[i]['name'] names.append(name) return names else: return '' #过滤停用词 def remove_stop_words(text): stop_words = ['(伴奏)','Bonus Track:','(Demo版)'] for stop_word in stop_words: text = text.replace(stop_word,'') return text path = '/Users/apple/Desktop/GitHubProject/Read mark/数据分析/geekTime/data/' #获得词云 def create_wordcloud(text): #移除过滤词 text = remove_stop_words(text) wc = WordCloud( font_path = "/Library/Fonts/Arial Unicode.ttf", max_words = 100, width = 2000, height = 1200 ) wordcloud = wc.generate(text) wordcloud.to_file(path + 'wordcloud_homework.jpg') plt.imshow(wordcloud) plt.axis('off') plt.show() #处理歌单,形成词云 request_url = 'http://music.163.com/api/playlist/detail?id=753776811' content_list = get_song_name(request_url) content = " ".join(content_list) print('歌单信息---',content) create_wordcloud(content) -------------- 歌单信息--- 别再闹了 在无风时 那时的我们 从无到有 一江水 借 消愁 不染 盛夏 哎哟 无问 一荤一素 南一道街 芬芳一生 请记住我 项羽虞姬 给你给我 想你想你 意料之中 平凡的一天 像我这样的人 感觉自己是巨星 如果有一天我变得很有钱 借 (伴奏) 消愁 (伴奏) 盛夏 (伴奏) 哎哟 (伴奏) 想你想你 (伴奏) 南一道街 (伴奏) 给你给我 (伴奏) 芬芳一生 (伴奏) 一荤一素 (伴奏) 平凡的一天 (伴奏) 像我这样的人 (伴奏) 如果有一天我变得很有钱 (伴奏) 如果有一天我变得很有钱 (必胜客新春版) Bonus Track:一荤一素 (Demo版) Bonus Track:给你给我 (Demo版) --------------- 图片无法展示,希望极客实践的PM能提出改进方案,前端和后台实现一下(😂😂),祝专栏越做越好

    作者回复: 滢同学不错啊~ 经常做作业,Good Job

    2019-04-24
    2
  • 一语中的
    以http://music.163.com/api/playlist/detail?id=753776811中歌单为例做词云展示 #-*- coding:utf-8 -*- from wordcloud import WordCloud import matplotlib.pyplot as plt import requests def getSonglists(url, headers): #根据歌单API获取歌曲列表 #将页面信息转换为json格式便于通过字典取值 r = requests.get(url, headers=headers) page_json = r.json() tracks = page_json["result"]["tracks"] lists = [] for i in range(len(tracks)): listName = tracks[i]["name"] lists.append(listName) return lists #生成词云 def create_WordCloud(lists): print("根源词频计算词云") wc = WordCloud( font_path = "C:\Windows\Fonts\simhei.ttf", #设置中文字体 max_words = 100, #设置最大字数 width = 2000, #设置画布宽度 height = 1200, #设置画布高度 random_state = 100 ) wordcloud = wc.generate(lists) #写词云图片 wordcloud.to_file("wordcloud.jpg") #显示词云文件 plt.imshow(wordcloud) #不需要显示X/Y轴,用off将坐标轴关闭 plt.axis("off") plt.show() #去掉停用词以及中英文混合的词 def remove_stop_words(f): stop_words = ['(伴奏)', '(Demo版)', '(必胜客新春版)'] mixed_words = ['Bonus Track:一荤一素', 'Bonus Track:给你给我'] for stop_word in stop_words: f = f.replace(stop_word, '') for mixed_word in mixed_words: f = f.replace(mixed_word, mixed_word[12:]) return f if __name__ == "__main__": 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' } url = "http://music.163.com/api/playlist/detail?id=753776811" gerLists = getSonglists(url, headers) #获取歌单是list类型,转换为str,那么就不再需要用jieba分词 lists_str = " ".join(gerLists) lists = remove_stop_words(lists_str) create_WordCloud(lists)

    作者回复: Good Job

    2019-03-11
    2
  • Geeky_Ben
    老师,为什么我的结果显示 cannot open resource

    作者回复: wc = WordCloud( font_path="./wc.ttf", max_words=100, width=2000, height=1200, ) 其中font_path对应的字体路径,改成你电脑上的路径即可

    2020-08-06
    3
    1
  • Kyle
    # -*- coding:utf-8 -*- # 网易云音乐 通过歌手ID,生成该歌手的词云 import requests import os import re import sys from wordcloud import WordCloud import matplotlib.pyplot as plt from PIL import Image import numpy as np import jieba from lxml import etree 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' } # 获取到歌单的信息 def get_song_list(headers,song_list_url): res = requests.request("GET",song_list_url,headers=headers) if 'result' in res.json(): all_song_list = "" for song_list in res.json()['result']['tracks']: all_song_list = all_song_list + song_list['name'] print(all_song_list) return all_song_list else: return '' # 创建词云展示 def wordcloud(f): print("根据词频结果进行词云展示!") cut_text = " ".join(jieba.cut(f,cut_all=False,HMM=True)) wc = WordCloud( font_path="./wc.ttf", max_words=100, width=2000, height=1200, ) wordcloud = wc.generate(cut_text) wordcloud.to_file("song_list_wordcloud.jpg") # 词云展示 plt.imshow(wordcloud) plt.axis("off") plt.show() # 获取歌单 song_list_id = '753776811' song_list_url = 'http://music.163.com/api/playlist/detail?id=' + song_list_id all_song_list_new = get_song_list(headers,song_list_url) wordcloud(all_song_list_new)

    作者回复: Good Job

    2019-09-22
    1
  • 陈炫宏
    API是怎么找到的?

    作者回复: 网上搜索网易云API可以查到

    2021-03-11
  • 如果
    老师你好,请问下header里的Accept参数是怎么来的

    作者回复: 打开开发者工具——找到https://music.163.com/#/artist?id=12138269对应的DOC文件,在Requests Headers中可以找到accept对应的值。

    2020-06-11
  • GS
    https://github.com/leledada/jupyter/tree/master/wordcloud

    作者回复: 赞 认真做作业的GS同学

    2019-12-15
  • GS
    if 'lrc' in res.json(): try: lyric = res.json()['lrc']['lyric'] new_lyric = re.sub(r'[\d:.[\]]','',lyric) return new_lyric except: print('发生了异常-----------------------------------',lyric_url) return '' else: return ''

    作者回复: 有异常处理,很好

    2019-12-13
收起评论
显示
设置
留言
27
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部