本案例中的歌詞數(shù)據(jù)來(lái)自中文歌詞數(shù)據(jù)庫(kù)。
前排提示:文末送可視化好書~
(資料圖片)
這個(gè)數(shù)據(jù)庫(kù)提供了華語(yǔ)歌手的歌曲及歌詞信息,數(shù)據(jù)以 JSON 格式存儲(chǔ)。
為了盡量完整地呈現(xiàn)從原始數(shù)據(jù)到可視化的過(guò)程,接下來(lái)我們會(huì)先簡(jiǎn)單講解數(shù)據(jù)的預(yù)處理過(guò)程,即如何將 JSON 數(shù)據(jù)轉(zhuǎn)化為Excel 格式,以及如何對(duì)周杰倫的歌曲進(jìn)行分詞。
若你希望跳過(guò)數(shù)據(jù)預(yù)處理的過(guò)程,也可以在《數(shù)據(jù)可視化設(shè)計(jì)指南:從數(shù)據(jù)到新知》一書的下載文件中,直接使用分好詞的 Excel 文件進(jìn)行可視化練習(xí)。
數(shù)據(jù)預(yù)處理指的是將原始數(shù)據(jù)處理成我們希望的格式,并提取出我們需要的信息。
在本案例中,我們需要先從數(shù)據(jù)庫(kù)中篩選出演唱者為周杰倫的歌曲,然后獲得這些歌曲的歌詞,并將它們存儲(chǔ)到純文本文檔(.txt 格式)中。以下提供兩種方法。
第一種方法,先把 JSON 文件轉(zhuǎn)換為 Excel 可以打開(kāi)的 .csv 文件或 .xlsx 文件格式。這可以借助一些在線的轉(zhuǎn)換工具完成(如 JSON to CSV Converter)。一般而言,只需將文件拖入這些工具,選擇好轉(zhuǎn)換格式類型,即可轉(zhuǎn)換完成。接著,我們便可以在 Excel 中打開(kāi)該數(shù)據(jù),然后單擊“數(shù)據(jù)→篩選”命令,選擇歌手為“周杰倫”的歌曲。之后,選中它們的歌詞,并將其粘貼到純文本文檔中。
第二種方法,通過(guò) Python 進(jìn)行數(shù)據(jù)預(yù)處理。代碼如下。
首先,需要引入 JSON 庫(kù)(未安裝者通過(guò) pip install json 安裝)。
import json
然后,讀取我們下載的 JSON 文件,存儲(chǔ)在名為 data 的變量中。
with open(‘ lyrics.json’ , ‘ r’ ) as f:
data = json.load(f)
接著,遍歷 data 中的每一項(xiàng),找出“歌手”=“周杰倫”的數(shù)據(jù)項(xiàng),存到data_zjl 中。
data_zjl = [item for item in data if item[‘ singer’ ]==’ 周杰倫’ ]
print(len(data_zjl))
建立一個(gè)空列表 zjl_lyrics,用于存儲(chǔ)歌詞。遍歷 data_zjl 中的每一首歌,將它們的歌詞存到 zjl_lyrics 中。
Zjl_lyrics = []
for song in data_zjl:
zjl_lyrics = zjl_lyrics + song[‘ lyric’ ]
最后將 zjl_lyrics 寫入一個(gè)新的 .txt 文件。
with open(“ zjl_lyrics.txt” , “ w” ) as outfifile:
outfifile.write(“ ” .join(zjl_lyrics))
通過(guò)這幾行代碼,我們就獲得了周杰倫所有歌曲的歌詞數(shù)據(jù)(見(jiàn)圖1)。以這個(gè) .txt 文件為基礎(chǔ),我們便可以進(jìn)行詞頻統(tǒng)計(jì)了。
圖1
以下附上一種在 Python 中分詞的方法。首先引入 jieba 庫(kù)(安裝 :pip install jieba)、pandas 庫(kù)(安裝 :pip install pandas)、用于頻次統(tǒng)計(jì)的 Counter 庫(kù),以及表單工具,代碼如下。
import jieba
import jieba.analyse
import pandas as pd
from collections import Counter
事先準(zhǔn)備好一個(gè)中文的停用詞表(.txt 文件,里面包含一些常見(jiàn)的、需要過(guò)濾的中文標(biāo)點(diǎn)和虛詞,可在網(wǎng)上下載),代碼如下。
with open(‘ chinese_stop_words.txt’ ) as f:
stopwords = [line.strip() for line in f.readlines()]
打開(kāi)歌詞文件,利用 jieba 庫(kù)進(jìn)行分詞。分詞之后,刪除停用詞、去除無(wú)用的符號(hào)等。用 Counter 庫(kù)對(duì)清洗干凈的詞語(yǔ)進(jìn)行頻次統(tǒng)計(jì)。然后將統(tǒng)計(jì)結(jié)果用 pandas庫(kù)轉(zhuǎn)換為數(shù)據(jù)表單,存儲(chǔ)為 Excel 文件,代碼如下。
fifile = open(“ zjl_lyrics.txt” ).read()
words = jieba.lcut(fifile, cut_all=False, use_paddle=True)
words = [w for w in words if w not in stopwords]
words = [w.strip() for w in words]
words = [w for w in words if w != ‘ ’ ]
words_fifilter = [w for w in words if len(w) > 1]
df = pd.DataFrame.from_dict(Counter(words_fifilter), orient=’ index’ ).
reset_index()
df = df.rename(columns={‘ index’ :’ words’ , 0:’ count’ })
df.to_excel(“ 周杰倫分詞結(jié)果 .xlsx” )
由此,我們便獲得了分詞后的單詞及詞頻(見(jiàn)表1)。使用這個(gè)文檔,我們就可以開(kāi)始制作可視化了。
表1
由于是文本類數(shù)據(jù),我們首先想到的可視化形式可能是文字云。如果你使用 Python,則可以直接基于剛才的分析結(jié)果,調(diào)用wordcloud庫(kù)繪制文字云,代碼如下。
from wordcloud import WordCloud
# 注 :這里需要引入一個(gè)中文字體,否則會(huì)亂碼
wc = WordCloud(font_path = ‘ Alibaba-PuHuiTi-Regular.ttf’ ,
background_color=” white” ,
max_words = 2000)
wc.generate(‘ ‘ .join(words_fifilter))
import matplotlib.pyplot as plt
plt.imshow(wc)
plt.fifigure(fifigsize=(12,10), dpi = 300)
plt.axis(“ off” )
plt.show()
繪制結(jié)果如圖2所示。
圖2
不過(guò),在代碼工具內(nèi)繪制文字云,進(jìn)行定制化設(shè)計(jì)相對(duì)比較復(fù)雜。因此,也可以借助一些在線工具幫助我們實(shí)現(xiàn)更好的可視化效果。
目前,許多中文的工具都可以專門用來(lái)制作文字云,如微詞云、易詞云、圖悅等(相關(guān)總結(jié)可參考知乎專欄的一篇文章《詞頻統(tǒng)計(jì)工具哪家強(qiáng),對(duì)比 8 款工具得出了結(jié)果》)。下面,我們以微詞云為例進(jìn)行演示。
進(jìn)入微詞云界面后,首先單擊“導(dǎo)入單詞”,進(jìn)行數(shù)據(jù)導(dǎo)入。選擇“從 Excel 中導(dǎo)入關(guān)鍵詞”,然后上傳我們剛才得到的包含單詞和詞頻的 Excel 文檔(需要注意的是,微詞云目前對(duì)上傳的 Excel 文件格式有一定要求,比如,列名必須叫“單詞”和“詞頻”才能識(shí)別,詳見(jiàn)其頁(yè)面指引),即可生成文字云(見(jiàn)圖3)。
圖3
可以看到,微詞云的頁(yè)面上還有另外兩種導(dǎo)入數(shù)據(jù)的選項(xiàng)。其中,“簡(jiǎn)單導(dǎo)入”支持用戶輸入用逗號(hào)隔開(kāi)的單詞?!胺衷~篩詞后導(dǎo)入”則支持用戶粘貼長(zhǎng)文本,然后由系統(tǒng)自動(dòng)進(jìn)行分詞和詞性判別。換句話說(shuō),如果你有一個(gè)文檔文件,也可以直接粘貼進(jìn)微詞云進(jìn)行分詞。
接下來(lái)我們用周杰倫的歌詞文檔來(lái)嘗試一下。選擇“分詞篩詞后導(dǎo)入”,然后將圖1 的 .txt 格式的文檔粘貼進(jìn)微詞云。之后,單擊“開(kāi)始分詞”,軟件就會(huì)自動(dòng)把詞語(yǔ)切割出來(lái),并按詞性歸類,結(jié)果如圖4所示。
圖4
可以看到,所有的詞語(yǔ)被按照動(dòng)詞、名詞、形容詞、人名等歸類。詞語(yǔ)后面的括號(hào)標(biāo)注了詞頻。同時(shí),微詞云還自動(dòng)幫我們把高頻的詞匯勾選出來(lái)。我們也可以根據(jù)個(gè)人需求,在這個(gè)界面中進(jìn)一步編輯,例如只顯示名詞、只顯示動(dòng)詞等,然后單擊“確定使用所選單詞”按鈕,即可生成詞云。
之后,我們可以在“配置”欄中編輯詞云的顯示方式。其中,“計(jì)算模式”指的是字體的大小是否嚴(yán)格與詞頻匹配,因此我們選擇“嚴(yán)格比例”。另外,我們還可以更改文字的顏色,以及文字云中單詞的數(shù)量等。在本案例中,我們把單詞數(shù)量調(diào)整到 200(見(jiàn)圖5)。調(diào)整完畢后,單擊右上角的“下載到本地”按鈕即可。
圖5
在左側(cè)編輯區(qū)的“形狀”中,可以替換詞云的蒙版。其中既有內(nèi)置的一些矢量形狀, 也可以上傳自己的圖片(見(jiàn)圖6,筆者上傳了一張周杰倫的素材圖片)。
圖6
當(dāng)然,雖然詞云在視覺(jué)上比較有趣,但在展示數(shù)據(jù)上卻不一定清晰。因此,我們也可以使用其他的圖表來(lái)進(jìn)行可視化。比如,可以用圓面積來(lái)展示最高頻的詞匯。
圖7 是使用 AI 工具繪制的。首先,我們?cè)凇皥D表工具”中選擇“餅圖”,按豎直方向?qū)?shù)據(jù)粘貼進(jìn)去,單擊“確定”按鈕,即可生成對(duì)應(yīng)面積的一系列圓形。
圖7
然后,選中所有圓形,取消分組,即可對(duì)它們進(jìn)行單獨(dú)編輯。之后,我們分別為它們加上文字,并調(diào)整顏色、背景等,即可得到一幅圓面積圖。
以上,我們講解了使用 Python 分詞和使用在線工具分詞的兩種方法。
需要提醒的是,不同的分詞途徑,分詞的結(jié)果可能不同(尤其是在語(yǔ)句比較復(fù)雜、生僻的情況下)。
因此,對(duì)分詞質(zhì)量比較看重的讀者有必要對(duì)比不同方法分詞的效果,選擇最優(yōu)的方案。
本文節(jié)選自《數(shù)據(jù)可視化設(shè)計(jì)指南:從數(shù)據(jù)到新知(全彩)》一書,歡迎閱讀本書了解更多精彩內(nèi)容。
限時(shí)五折優(yōu)惠,快快點(diǎn)擊搶購(gòu)吧!
最后的最后,這么好的書,給大家爭(zhēng)取了3本作為福利,本文三連(點(diǎn)贊、在看或者轉(zhuǎn)發(fā)任意都可)后,留言點(diǎn)贊排名前3各送1本,開(kāi)獎(jiǎng)時(shí)間截至4月12日22:00,祝大家好運(yùn)(為了給更多朋友機(jī)會(huì),4月已經(jīng)中過(guò)的同學(xué)暫時(shí)處于冷卻期)點(diǎn)擊閱讀原文,查看本書詳情!標(biāo)簽: