[原创]三国人物简单分析

(分析数据的能力有限,大篇幅写了前面的准备内容…对数据的认识还需要继续深刻理解和学习,有幸被转载的话,还是和我说下吧 *_*)
具体代码,可查看我的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文件中,大约是长这样子…
wordroot.png

'''参考代码'''
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个词, 得到了以下结果;
handledTimes.png
4.整理上述52个词汇,将玄德曰,玄德怒,玄德乃,刘皇叔等词语合并,绘制Top10;
top10.png

    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个人分别出现的次数,这里的空白是不能参与相加减的合并计算的,需要进一步处理;
meihui.png

	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回左右,等他们退出历史舞台,诸葛亮接过蜀国重任,支撑着蜀国大业;

蜀国.png
(2)看刘备和诸葛亮的分布,35-40回左右两人重叠较多,自然是 “三顾茅庐” 了,80回后,诸葛先生有较为密集的输出,正是 “先帝托孤”后“鞠躬尽瘁” 的具体表现,这其中更有人人熟知的 “巧布八阵图”、“七擒孟获” 等历史故事;

刘诸葛.png
(3)四位当权者,曹操、刘备、孙权、司马懿活动的活度,前80回,曹刘孙较为活跃,正是三国纷争的历史局面,读这一部分,争斗厮杀的情节相当精彩;待三位同时代的人物相继离开后,司马懿开始活跃,“一统秦两汉,三分魏蜀吴,两晋前后延”,慢慢的朝代更替,历史车轮滚滚向前;

四位当权者.png

7.分析人物关系,根据全文2700多个自然段,如果一个自然段内同时出现了人物A和B,就将A和B之间的关系强度+1。运行代码得到node和edge两份csv文件后,输入到Gephi,得到以下关系图,可以看出故事总体来说还是围绕曹刘纷争开展,较大的篇幅提到了诸葛亮,他周围密集的线,正是其经天纬地之才 的充分体现;
relationship

8.词云制作。
自己扣了一张图,给了一个渐变色,取逐鹿中原的 “逐” 字。其中各种 “曰” ,对话还是占据了书中的很大一部分章节,读者读起来不至于太闷,当然通过对话,更有代入感,身临其境。

image.png


只有自己做了,才能发现坑在哪里,这可能就是自己在进步吧…

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值