我从崖边跌落 落入星空辽阔 银河不清不浊 不知何以摆脱——谢春花《我从崖边跌落》
作为一名春花粉,决定用python,分析下春花歌词里的高频词语,以期找到有趣的规律。
1. 数据爬取
歌词来源:网易云谢春花热门26首
爬取完之后以txt格式存储
# 第一部分:爬取数据
import requests
import re
import os
import json
from bs4 import BeautifulSoup
#发起响应
def get_html(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
try:
response = requests.get(url, headers=headers)
html = response.content
return html
except:
print('request error')
pass
#函数:按照歌曲id,提取歌词内容
def download_by_music_id(music_id):
lrc_url = 'http://music.163.com/api/song/lyric?'+'id='+str(music_id) + '&lv=1&kv=1&tv=-1'
r = requests.get(lrc_url)
json_obj = r.text
j = json.loads(json_obj)
try:
lrc = j['lrc']['lyric']
pat = re.compile(r'\[.*\]')
lrc = re.sub(pat, "",lrc)
lrc = lrc.strip()
return lrc
except:
pass
#函数:按照歌手id,发起请求,解析网页,提取歌曲id
def get_music_ids_by_musician_id(singer_id):
singer_url = 'http://music.163.com/artist?id={}'.format(singer_id)
r = get_html(singer_url)
soupObj = BeautifulSoup(r,'lxml')
song_ids = soupObj.find('textarea').text
jobj = json.loads(song_ids)
ids = {}
for item in jobj:
print(item['id'])
ids[item['name']] = item['id']
return ids
# 创建文件夹,在文件夹下存储每首歌的歌词
# os.mkdir创建目录,os.chdir改变当前工作目录到指定的路径
def download_lyric(uid):
try:
os.mkdir(str(uid))
except:
pass
os.chdir(str(uid))
music_ids = get_music_ids_by_musician_id(uid)
for key in music_ids:
text = download_by_music_id(music_ids[key])
file = open(key+'.txt', 'a')
file.write(key+'\n')
file.write(str(text))
file.close()
if __name__ == '__main__':
download_lyric(1039895)
2. 歌词分析
利用jieba分词包进行分词,用set()去掉每首歌里的重复的词(比如在一首歌里出现借我 借我 借我只按1次算),同时去掉停用词(如的、和、吗等无意义的虚词),统计词频,然后以词云图显示。
# 第二部分:词频分析
import os
from collections import Counter
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from scipy.misc import imread
from pylab import mpl
#第一步:定义停用词库
def stopwordslist(filepath):
stopwords = [line.strip() for line in open(filepath, 'r').readlines()]
return stopwords
stopwords=stopwordslist('C:/Users/chen/PycharmProjects/stoplist.txt')
# 第二步:读取文件,分词,生成all_words列表,用停用词检查后生成新的all_words_new
all_words=[]
outstr = ''
for filename in os.listdir('1039895'):
with open('1039895/'+filename) as f:
lyrics=f.read()
data=jieba.cut(lyrics)
all_words.extend(set(data))
for word in all_words:
if word not in stopwords:
if word != '\t':
outstr += word
outstr += " "
all_words_new= outstr.split(" ") #转成列表
#第三步:对all_words中的词计数,并按照词频排序
count=Counter(all_words_new)
result=sorted(count.items(), key=lambda x: x[1], reverse=True)
print(result)
#第四步,词云显示
#将频率变成字典
word_dic=dict(count.items())
# 使matplotlib模块能显示中文
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
color_mask=imread('xinxing.jpg') #背景图
cloud=WordCloud(
font_path='C:\Windows\Fonts\SIMYOU.TTF',
width=600,
height=480,
background_color='black',
mask=color_mask,
max_words=350,
max_font_size=150)
world_cloud=cloud.fit_words(word_dic)
world_cloud.to_file('chunhua.jpg')
plt.imshow(world_cloud)
谢春花式少女情怀,在每个洒满阳光的日子,藏一桩期盼,几许心思,做一颗在春天开花的树,有生之年,做几场梦,忍几次痛,但一定会遇见你,然后把明天说与你听,不知你愿不愿懂。
常用词——“心”:
11887:宠溺的笑 漏半拍心跳
借我:借我怦然心动如往昔
只道寻常:雨落时才想起那种心安
11887: 我想此刻的心被你填满了一些
心空空:时而心空空时而痛汹涌
常用词——“懂”
唱不了一首欢乐的歌:嘿 我想只有你懂我了
妄为:稠密的心思没几人能懂 到头来怕只把自己感动
心空空:说来不知你会不会懂
荒岛:我想让你懂我的固执
常用词——“遇见”、“相见”、“梦”
一棵会开花的树:但有生之年还好遇见你
如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁:这样慵懒的午后 转角书店遇见你
我一定会爱上你:虽然我还没遇见你但我一定会爱上你
洛干的吻:期待每一次的相见
已是两条路上的人:不用停留 就要相见
只道寻常:相距远相见难不聚只散
俗人言:今生莫相见
我从崖边跌落:谁把美梦捕捉
新屋:把时间交给 温热的床 一同跌进梦乡
无终:胜握在掌 神魂摇荡 故事几章 梦一场
“如此幸福的一天。雾一早就散了,我在花园里干活。蜂鸟停在忍冬花上。这世上没有一样东西我想占有,我知道没有一个人值得我羡慕。任何我曾遭受的不幸,我都已忘记。想到故我今我同为一人并不使我难为情。在我身上没有痛苦。直起腰来,我望见蓝色的大海和帆影。” ——以米沃什的《礼物》结尾,have a sweet dream。