专栏名称: DataCharm
定期更新与科研学术有关的内容,比如论文插图绘制技巧、实用Python/R拓展包解读、作图软件(Veusz、Qrigin等)教程以及最前沿科研方法等。
目录
相关文章推荐
优秀网页设计  ·  AI工具:无需PS!小白也能秒出专业级贴纸的神器 ·  21 小时前  
庞门正道  ·  好评,如潮。 ·  昨天  
字体设计  ·  2025新一代设计展主视觉发布 ·  2 天前  
字体设计  ·  看他的网格系统设计 ·  2 天前  
ZaomeDesign  ·  Aedas新作 | ... ·  昨天  
51好读  ›  专栏  ›  DataCharm

周杰伦在唱什么?数据可视化告诉你!(新书推荐~~)

DataCharm  · 公众号  ·  · 2023-04-04 21:35

正文

本案例中的歌词数据来自中文歌词数据库。

这个数据库提供了华语歌手的歌曲及歌词信息,数据以 JSON 格式存储。

为了尽量完整地呈现从原始数据到可视化的过程,接下来我们会先 简单讲解数据的预处理过程,即如何将 JSON 数据转化为Excel 格式,以及如何对周杰伦的歌曲进行分词。

若你希望跳过数据预处理的过程,也可以在《数据可视化设计指南:从数据到新知》一书的下载文件中,直接使用分好词的 Excel 文件进行可视化练习。

数据预处理 指的是将原始数据处理成我们希望的格式,并提取出我们需要的信息。

在本案例中,我们需要先从数据库中筛选出演唱者为周杰伦的歌曲,然后获得这些歌曲的歌词,并将它们存储到纯文本文档(.txt 格式)中。以下提供两种方法。

第一种方法, 先把 JSON 文件转换为 Excel 可以打开的 .csv 文件或 .xlsx 文件格式。这可以借助一些在线的转换工具完成(如 JSON to CSV Converter)。一般而言,只需将文件拖入这些工具,选择好转换格式类型,即可转换完成。接着,我们便可以在 Excel 中打开该数据,然后单击“数据→筛选”命令,选择歌手为“周杰伦”的歌曲。之后,选中它们的歌词,并将其粘贴到纯文本文档中。

第二种方法, 通过 Python 进行数据预处理。代码如下。

首先,需要引入 JSON 库(未安装者通过 pip install json 安装)。

import json

然后,读取我们下载的 JSON 文件,存储在名为 data 的变量中。

with open(‘ lyrics.json’ , ‘ r’ ) as f:data = json.load(f)

接着,遍历 data 中的每一项,找出“歌手”=“周杰伦”的数据项,存到data_zjl 中。

data_zjl = [item for item in data if item[‘ singer’ ]==’ 周杰伦’ ]print(len(data_zjl))

建立一个空列表 zjl_lyrics,用于存储歌词。遍历 data_zjl 中的每一首歌,将它们的歌词存到 zjl_lyrics 中。

Zjl_lyrics = []for song in data_zjl:zjl_lyrics = zjl_lyrics + song[‘ lyric’ ]

最后将 zjl_lyrics 写入一个新的 .txt 文件。

with open(“ zjl_lyrics.txt” , “ w” ) as outfifile:outfifile.write(“ \n.join(zjl_lyrics))

通过这几行代码,我们就获得了周杰伦所有歌曲的歌词数据(见图1)。以这个 .txt 文件为基础,我们便可以进行词频统计了。

图1

以下附上一种在 Python 中分词的方法。首先引入 jieba 库(安装 :pip install jieba)、pandas 库(安装 :pip install pandas)、用于频次统计的 Counter 库,以及表单工具,代码如下。

import jiebaimport jieba.analyseimport pandas as pdfrom collections import Counter

事先准备好一个中文的停用词表(.txt 文件,里面包含一些常见的、需要过滤的中文标点和虚词,可在网上下载),代码如下。

with open(‘ chinese_stop_words.txt’ ) as f:stopwords = [line.strip() for line in f.readlines()]

打开歌词文件,利用 jieba 库进行分词。分词之后,删除停用词、去除无用的符号等。用 Counter 库对清洗干净的词语进行频次统计。然后将统计结果用 pandas库转换为数据表单,存储为 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()






请到「今天看啥」查看全文