受刘思喆大佬一篇文章《爱情永远寂寞》的启发,对其中的文本挖掘技术非常感兴趣,遂产生了复制这个分析的想法。最近我一直在阅读各种各样的有趣分析,或者是Kaggle Notebooks,其中若有我比较感兴趣的主题、数据、算法,我都会尝试复现一下。
比如《爱情永远寂寞》这篇文章中提到的:
拿到22996 首中文歌曲(844 个流行歌手)之后,总觉得在这些非结构化数据背后肯定隐藏了什么,但到底会有什么模式呢?当经历了分词、构建矩阵、去除停止词、矩阵约减,最终通过模式识别,统计数字之后爱情居然是这样的一个真相
看上去还挺复杂的有没有?我之前只接触过Text Mining with R 这本书提供的方法,也就是构建N-gram。也不知道上边说的“构建矩阵”、“矩阵约减”、“模式识别”之类的方法怎么实现。但目前确定的是构建N-gram能够给出类似的文本词语关联关系。
这篇文章并没有给出分析用的原始代码及数据。那么复现类似的分析需要自己找一份歌词数据。在github上搜了一下,找到的是这个repo中所用的数据:
数据是json格式的。首先我使用了Python读入json数据,使用jieba
工具进行汉语分词。Python程序如下:
import jieba
import json
import time
import gc
import pandas as pd
import matplotlib.pyplot as plt
stopword_list = [k.strip() for k in open('../input/english-and-chinese-stopwords/stopwords.txt', encoding='utf8').readlines() if k.strip() != '']
music = []
for line in open('../input/chinese-pop-song-lyrics/music.json','r'):
music.append(json.loads(line))
print('json文件总长度 {} '.format(len(music)))
# json文件总长度 140068
lyrics = []
for i in music:
lyrics.append(i['geci'])
def generate_ngrams(text, n_gram=2):
'''得到N元组
'''
token = [k