一、 生成歌词词云教程
步骤一:获取歌词数据
首先,我们需要爬取所有歌曲的歌词,并将它们合并成一个字符串。
步骤二:提取中文歌词
接下来,我们需要从合并后的字符串中提取中文歌词,并将它们合并成一个新的字符串。
步骤三:生成词云
最后,我们可以使用Python中的词云库,如wordcloud,生成歌词词云图。
text = re.findall('[\u4e00-\u9fa5]+', lyric, re.S) # 提取中文
text = " ".join(text)
然后,我们可以使用Python中的中文分词库jieba对提取出的中文歌词进行分词,并将长度大于等于2的词保存下来。
word = jieba.cut(text, cut_all=True) # 分词
new_word = []
for i in word:
if len(i) >= 2:
new_word.append(i) # 只添加长度大于2的词
final_text = " ".join(new_word)
接下来,我们可以选择一张美观的图片作为词云的背景,并使用Python中的词云库,如wordcloud,对保存下来的词进行词频统计和可视化,生成一张美丽的歌词词云图!
mask = np.array(Image.open("2.jpg"))
word_cloud = WordCloud(background_color="white", width=800, height=600, max_words=100, max_font_size=80, contour_width=1, contour_color='lightblue', font_path="C:/Windows/Fonts/simfang.ttf", mask=mask).generate(final_text)
# plt.imshow(word_cloud, interpolation="bilinear")
# plt.axis("off")
# plt.show()
word_cloud.to_file(self.keyword+'词云.png')
os.startfile(self.keyword+'词云.png')
在使用Python中的词云库wordcloud生成歌词词云图时,我们可以通过设置参数来调整词云的样式。例如,可以设置contour_width=1和contour_color='lightblue'来添加背景图片的轮廓线条,font_path参数用于指定字体。
生成词云后,我们可以使用show()方法来展示词云图,也可以将其保存到本地并打开。最终生成的歌词词云图如下所示:
二、热门歌手歌曲量饼图
首先,我们需要获取热门歌手列表以及每个热门歌手的歌曲数量。
接下来,我们可以将每个歌手的歌曲数量除以所有这十个歌手的总歌曲数量,从而得到每个歌手歌曲量的占比。
explode = [0.1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
接下来就可以生成饼图了
plt.figure(figsize=(6, 9)) # 设置图形大小宽高
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码问题
plt.axes(aspect=1) # 设置图形是圆的
plt.pie(x=proportion, labels=name, explode=explode, autopct='%3.1f %%',
shadow=True, labeldistance=1.2, startangle=0, pctdistance=0.8)
plt.title("热门歌手歌曲量占比")
# plt.show()
plt.savefig("热门歌手歌曲量占比饼图.jpg")
os.startfile("热门歌手歌曲量占比饼图.jpg")
在下面的代码中,我们使用了三个列表:x、labels和explode。其中,x是歌曲量占比的列表,labels是对应的标签(在此图中则为歌手的姓名),explode则是上文提到的突出显示。这三个列表中的各个值是一一对应的。
此外,我们还使用了autopct参数来设置占比数值的显示方式。在本例中,我们将其设置为"3.1f",表示占宽为3位(如果大于会原样输出),精度为1的浮点数。
最后,您可以选择直接使用show()方法展示图表,或者将其保存到本地再打开。
三、歌曲热度占比条形图
在之前,我们使用爬虫获取了top500歌曲的信息(如下所示)。现在,我们希望对这些歌曲的热度进行分析,并生成柱状图。
效果图如下:
最初,我们想要生成歌手拥有热门歌曲数量的柱形图。然而,我们发现从爬取热门歌曲的网站中获取的歌曲列表中,并没有对应的歌手信息。因此,我们需要从其他网站获取每首歌曲对应的歌手信息,这一过程十分繁琐。因此,我们最终没有采用这种方法。如果您感兴趣,可以自己尝试实现。
为了获得每个热度范围内的歌曲数量,我们需要使用一个名为"data"的列表。该列表中的元素对应于不同热度范围内的歌曲数量。
我们可以通过遍历歌曲热度列表,每次将对应热度范围的"data"列表加1,最终得到每个热度范围内的歌曲数量。
x = ('0-10', '10-20', '20-30', '30-40', '40-50', '>50')
data = [0, 0, 0, 0, 0, 0]
接下来就是创建柱状图,首先解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
随后即可通过plt.bar创建,其中第一个参数为横坐标数据,第二个参数为纵坐标数据,第三个参数为为柱状图填充颜色,第四个参数为透明度
title,xlabel,ylabel显然就是该柱状图的标题,横坐标和纵坐标的名称
plt.bar(x, data, color='steelblue', alpha=0.8)
plt.title("pop500歌曲热度")
plt.xlabel("歌曲热度范围")
plt.ylabel("歌曲数量")
plt.show()
本文上面所有的Python资料都有详细的配套教程以及源码,都已经打包好正在上传到资源库。