(分析数据的能力有限,大篇幅写了前面的准备内容…对数据的认识还需要继续深刻理解和学习,有幸被转载的话,还是和我说下吧 *_*)
具体代码,可查看我的Github
主要任务
1.找出《三国演义》中名字出现最多的10人;
2.分析主要几个人物120回中,每回出现的次数,结合具体内容,看发生了什么;
3.分析任务之间的关系利用gephi简单绘图;
4.绘制“逐”字词云。
准备工作
1.由于要分析120回中主要人物的出场次数,找到了按回分段的章节。也就是说整本书共120行,每行就是一回,当然主要是为了下面的分析要用;
2.需要安装主要的python库,如jieba, wordcloud, pandas, codecs, matplotlib, pyecharts, bs4
等,当然还有Gephi
。
开始工作
1.找到人名出现最多的词语,利用jieba的分词功能,将不是nr词性和长度小于2的统统过滤掉,排序后写入到csv文件中,大约是长这样子…
'''参考代码'''
def findMostWords(self, dict, readBook, writeFile):
jieba.load_userdict(dict) # 加载字典
with codecs.open(readBook, 'r', 'utf8') as f:
i = 0
for line in f.readlines():
self.processBar(i, 120) # 显示完成进度
i += 1
poss = pseg.cut(line) # 返回各个词及其词性
for w in poss:
if w.flag != 'nr' or len(w.word) < 2:
continue
if self.nouns.get(w.word) is None:
self.nouns[w.word] = 0
self.nouns[w.word] += 1 # 如果出现依次,则次数加1
self.nouns = sorted(self.nouns.items(), key=lambda x: x[:][1], reverse=True)
2.通过上述代码大约找到了7238个nr词汇, 然后手动选取了出现次数超过20次以上的词语,大约200条,剔除“曹兵”、“黄巾”类似的词语,最终得到了52个词;(看到操大喜,莫名很想笑…)
[‘曹操’, ‘玄德’, ‘孔明’, ‘关公’, ‘丞相’, ‘孔明曰’, ‘玄德曰’, ‘云长’, ‘张飞’, ‘主公’,‘吕布’, ‘刘备’, ‘孙权’, ‘赵云’, ‘司马懿’, ‘周瑜’, ‘魏延’, ‘袁绍’, ‘马超’, ‘姜维’, ‘黄忠’, ‘诸葛亮’, ‘庞德’, ‘张辽’, ‘刘表’, ‘董卓’, ‘孙策’, ‘鲁肃’, ‘邓艾’, ‘大将军’, ‘张苞’, ‘袁术’, ‘刘玄德’, ‘玄德大’, ‘子龙’, ‘司马’, ‘孔明笑’, ‘公瑾’, ‘操大喜’, ‘翼德’, ‘刘皇叔’, ‘赵子龙’, ‘郭嘉’, ‘仲达’, ‘关云长’,‘操大怒’, ‘玄德问’, ‘阿斗’, ‘刘豫州’, ‘玄德闻’, ‘玄德乃’, ‘曹丞相’]
3.逐词匹配上述的52个词, 得到了以下结果;
4.整理上述52个词汇,将玄德曰,玄德怒,玄德乃,刘皇叔等词语合并,绘制Top10;
def occurrencesTop10(self, file, html): # 截取了出现20次以上的人物
self.Top10 = pd.read_excel(file)
bar = Bar(html)
bar.add("出场次数", list(self.Top10['人物'])[:10], list(self.Top10["出场次数"])[:10],
xaxis_rotate=60, is_label_show=True)
bar.show_config()
bar.render(html)
5.分别分析每一回,利用pandas很方便的绘制了每回52个人分别出现的次数,这里的空白是不能参与相加减的合并计算的,需要进一步处理;
def appearEachEpisode(self, readBook, writeFile): # 每回中人物出现次数
with open(readBook, 'r') as f:
all_chaps = [chap for chap in f.readlines()]
dictionary = []
# 读取文件并分词
for i in range(120):
print("处理第{}回".format(i + 1))
words = list(jieba.cut(all_chaps[i]))
for word in words:
if word in self.nameList:
if word in self.eachChapter:
self.eachChapter[word] += 1
else:
self.eachChapter[word] = 1
dictionary.append(self.eachChapter)
self.eachChapter = {}
data = pd.DataFrame(dictionary)
data.to_excel(writeFile, index=True, header=True)
6.绘制一些简单的图;
(1)蜀国主要人物在书中的分布情况,三位结拜兄弟贯穿了前80回左右,等他们退出历史舞台,诸葛亮接过蜀国重任,支撑着蜀国大业;
(2)看刘备和诸葛亮的分布,35-40回左右两人重叠较多,自然是 “三顾茅庐” 了,80回后,诸葛先生有较为密集的输出,正是 “先帝托孤”后“鞠躬尽瘁” 的具体表现,这其中更有人人熟知的 “巧布八阵图”、“七擒孟获” 等历史故事;
(3)四位当权者,曹操、刘备、孙权、司马懿活动的活度,前80回,曹刘孙较为活跃,正是三国纷争的历史局面,读这一部分,争斗厮杀的情节相当精彩;待三位同时代的人物相继离开后,司马懿开始活跃,“一统秦两汉,三分魏蜀吴,两晋前后延”,慢慢的朝代更替,历史车轮滚滚向前;
7.分析人物关系,根据全文2700多个自然段,如果一个自然段内同时出现了人物A和B,就将A和B之间的关系强度+1。运行代码得到node和edge两份csv文件后,输入到Gephi,得到以下关系图,可以看出故事总体来说还是围绕曹刘纷争开展,较大的篇幅提到了诸葛亮,他周围密集的线,正是其经天纬地之才 的充分体现;
8.词云制作。
自己扣了一张图,给了一个渐变色,取逐鹿中原的 “逐” 字。其中各种 “曰” ,对话还是占据了书中的很大一部分章节,读者读起来不至于太闷,当然通过对话,更有代入感,身临其境。
只有自己做了,才能发现坑在哪里,这可能就是自己在进步吧…