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

(分析数据的能力有限,大篇幅写了前面的准备内容...对数据的认识还需要继续深刻理解和学习)
查看具体代码,可查看我的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


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

你可能感兴趣的:([原创]三国人物简单分析)