用python給女朋友做一個歌曲詞雲圖


今天咋們來看看網易雲趙雷的歌曲歌詞,並做一個詞雲圖。這篇文章可以學習到什么是詞雲,爬蟲的基本流程,簡單的可視化操作

@

一 什么是詞雲

可視化有很多種,好的數據可視化,可以使得數據分析的結果更加通俗易通。"詞雲"屬於可視化的一種,它會根據關鍵詞的出現頻率生成一幅圖,這樣可以讓我們一眼就知道其主要要點。比如下面
在這里插入圖片描述

二 制作詞雲的步驟

1 第一步收集需要可視化的內容。

內容可以是文章內容,當然也可以是爬蟲的內容。這里我們先使用NAB球星科比的材料作為內容。

2 安裝詞雲庫

wordcloud,安裝方法如下(前提是電腦已經有了python環境和一些基礎庫喲,建議可以裝個Anaconda,這樣就少了很多依賴包的麻煩喲)

  • pip install wordcloud
  • pip install jieba--------中文庫,因為我想展示中文內容
  • pip install PIL----------圖像處理庫
  • pip install matplotlib-----圖像展示庫

3 介紹下jieba中文庫和下面會用到的wordcloud常用參數

(1) jieba簡介

  • jieba中文庫
    它是python中文分詞組件,具有三種分詞模式
    • 精確模式,試圖將句子最精確的切開,比較適合文本分析
    • 全模式,把句子中所有可以成詞的都掃描出來,速度很快,但是不能解決歧義
    • 搜索引擎模式,在精確模式的基礎上對長詞進行再次切分,適合用於搜索引擎分詞
  • 支持繁體分詞
  • 支持自定義詞典
  • MIT授權協議

(2) jieba API

jieba.cut 接受三個參數
需要分詞的字符串,可以是中文
- cut_all bollean類型的參數,用來控制是否采用全模式
- HMM參數用來控制是否采用HMM模型(隱馬模型--后續進行相關學習)

jieba.cut_for_search 接受兩個參數
需要分詞的字符串,可以為中文
HMM參數用來控制是否采用HMM模型
它與jieba.cut 的最大區別就在於分詞更加細膩,且會將全部的可能性輸出,因此沒有cut_all 參數

4 科比詞雲圖制作測試代碼1

#-*- coding:utf-8 -*
f='科比的職業生涯隨湖人隊5奪NBA總冠軍(2000年-2002年、2009年-2010年);\
榮膺1次常規賽MVP(2007-08賽季),2次總決賽MVP(2009年-2010年),\
4次全明星賽MVP(2002年、2007年、2009年與2011年),\
與鮑勃·佩蒂特並列NBA歷史第一;共18次入選NBA全明星陣容,15次入選NBA最佳陣容,12次入選NBA最佳防守陣容'

from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba
from PIL import Image as image
import numpy as np

#生成詞雲
def create_word_cloud(f):
    print('根據詞頻計算詞雲')
    text = " ".join(jieba.cut(f,cut_all=False, HMM=True))

    wc = WordCloud(
        font_path="./SimHei.ttf",#設置字體 針對中文的情況需要設置中文字體,否則會亂碼
        max_words=100,# 設置最大的字數
        width=2000,#設置畫布的寬度
        height=1200,#設置畫布的高度
    )
    wordcloud=wc.generate(text)
    #寫詞雲圖片
    wordcloud.to_file("wordcloud.jpg")
    #顯示詞雲文件
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()
create_word_cloud(f)
```python

結果顯示:
在這里插入圖片描述

三 案例 網易雲歌手房東的貓詞雲圖

1 整體流程圖

在這里插入圖片描述

2 爬取+詞雲制作

(1) 我們先查看網易雲的歌詞API接口需要什么常用接口。發現需要一個ID。所以第一步訪問url進入歌手界面,尋找規律得出歌手ID。

  • 進入歌手頁面 歌手頁面
    在這里插入圖片描述

  • 點擊趙雷歌曲頁面 趙雷歌曲頁面。這里可以多點擊幾個歌手,就會發現不同的歌手頁面不同的地方在URL后面的ID不同
    在這里插入圖片描述

  • 點擊歌手名字,進入歌手頁面,選中熱門50首中div的id屬性
    在這里插入圖片描述

  • 因為我們需要每首歌的歌詞,所以需要尋找歌曲的歌詞連接,通常為a標簽,所以我們往下看,用xpath解析出所有的a標簽
    在這里插入圖片描述

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, '  ', name)
	return song_ids, song_names

(2) 現在拼接我們的爬取歌詞的url。http://music.163.com/api/song/lyric?os=pc&id=' + song_id + '&lv=-1&kv=-1&tv=-1'

# 獲取每首歌歌詞
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=' + song_id + '&lv=-1&kv=-1&tv=-1'
	lyric = get_song_lyric(headers, lyric_url)
	all_word = all_word + ' ' + lyric
	print(song_name)

(3) 去掉部分停用詞比如作詞,編曲等詞語

# 去掉停用詞
def remove_stop_words(f):
	stop_words = ['作詞', '作曲', '編曲',  '人聲', 'Vocal', '弦樂', 'Keyboard', '鍵盤', '編輯', '助理', 'Assistants', 'Mixing', 'Editing', 'Recording', '音樂', '制作', 'Producer', '發行', 'produced', 'and', 'distributed']
	for stop_word in stop_words:
		f = f.replace(stop_word, '')
	return f

(4)整體代碼

import requests
import re
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba
import PIL.Image as image

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_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 remove_stop_words(f):
	stop_words = ['作詞', '作曲', '編曲',  '人聲', 'Vocal', '弦樂', 'Keyboard', '鍵盤', '編輯', '助理', 'Assistants', 'Mixing', 'Editing', 'Recording', '音樂', '制作', 'Producer', '發行', 'produced', 'and', 'distributed']
	for stop_word in stop_words:
		f = f.replace(stop_word, '')
	return f
# 生成詞雲
def create_word_cloud(f):
	print('根據詞頻,開始生成詞雲!')
	f = remove_stop_words(f)
	cut_text = " ".join(jieba.cut(f,cut_all=False, HMM=True))
	import numpy as np
	mask=np.array(image.open(r"C:\Users\lj\Desktop\1.jpg"))
	wc = WordCloud(
		mask=mask,
		font_path="./SimHei.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()

# 得到指定歌手頁面 熱門前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, '  ', name)
	return song_ids, song_names
# 設置歌手ID,趙雷為6731
artist_id = '6731'
[song_ids, song_names] = get_songs(artist_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=' + song_id + '&lv=-1&kv=-1&tv=-1'
	lyric = get_song_lyric(headers, lyric_url)
	all_word = all_word + ' ' + lyric
	print(song_name)
#根據詞頻 生成詞雲
if __name__ == '__main__':
	create_word_cloud(all_word)

結果
在這里插入圖片描述
4 總結

今天總結下整體的內容。其中涉及到的知識點有可視化,詞雲圖制作以及中文的jieba庫。

不知道你們看完有一點點收獲嗎?如果有收獲希望你

  1. 點贊 給予我更多鼓勵同時讓更多人學習
  2. 關注我公眾號[我是程序員小賤]獲取更多的干貨。相信我不會讓你們失望!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM