用pyecharts制作小说《剑来》的人物关系图(粗)

先上效果



今天在一如既往地划水时,水友给我推了个小说叫《剑来》。下班回到家,准备下载了看一下,结果一看,光txt都要9MB,以我磨蹭的速度,怕不是明年都看不完。正好最近在做一些NLP相关的东西,就想拿这个小说来练个手。


根据小说的内容,建立一个简单的人物关系图

思路大概是:

1. 建立人物列表

2. 计算每个人物在小说里的出现次数

3. 计算每2个人物在小说里共同出现的次数

4. 把1,2,3制作成简单的图表

#! /usr/bin/env python
# -*- coding: utf-8 -*-

from pyecharts import Graph

#对全文根据句号进行分割
def cut_test():
    reader = open("jianlai.txt","r",encoding="utf-8").read()
    sentence_list = reader.split("。")
    return sentence_list

#计算名字在全文中出现的次数
def count_name():
    reader = open("jianlai.txt", "r", encoding="utf-8").read()
    output = []
    for i in name:
        count = reader.count(i)
        # 主角出现的次数太多,最终作图效果会受影响,这个小小处理一下
        if i == "陈平安":
            count = count/5
        row = {"name": i, "symbolSize": count/100}
        output.append(row)
    return output

#计算两个角色一起出现在一句句子里的次数
def get_rel(name1, name2,snetence):
    counter = 0
    for i in sentence:
        if name1 in i and name2 in i:
            counter +=1
    row = {"source": name1, "target": name2, "weight": counter/100}
    return row

#根据所有角色列表,计算两两角色一起出现的次数
def count_re():
    output = []
    counter = 0
    for i in name:
        for m in name[counter:]:
            if i != m:
                row = get_rel(i,m,sentence)
                if row["weight"] >0:
                    output.append(get_rel(i,m,sentence))
        counter += 1
    return output

#用pyecharts画图
def paint_grapg(nodes=[],links=[]):
    print(nodes)
    print(links)
    nodes = nodes
    links = links
    graph = Graph("《剑来》人物关系热力图", height=800)
    graph.add("",
              nodes,
              links,
              graph_repulsion=200,
              graph_edge_length=400,
              graph_layout="force",
              is_label_show=True,
              line_opacity=0.2,
              line_curve=0.5
              )
    graph.use_theme("dark")
    graph.render()


if __name__ == '__main__':

    name = ['陈平安', '齐静春', '宁姚', '阮秀', '李宝瓶', '宋集薪', '稚圭', '老秀才', '阿良', '左右', '崔瀺', '阮邛', '老杨头', '陆沉', '道老二', '宋长镜',
            '李二', '郑大风', '魏檗', '崔姓老人', '裴杯', '曹慈', '裴钱']

    sentence = cut_test()
    name_count = count_name()
    rel_count = count_re()
    paint_grapg(name_count,count_re())
复制代码


下一步可以做的优化

1. 现在所有的人物都没有分类,下一步可以根据人物的性别、门派做一个简单的分类

2. 做完才发现这一版连jieba都没用,下一步可以对句子做一些分词和词性标记,看能不能提取点什么好玩的东西出来。

3. 现在人物之间的“共同出现”关系的频次没有表现在图表上,可以下次优化

4. 现在人物之间仅有“共同出现”这一种关系,可以考虑制作更多的人物关系类型,扩展以后,可以考虑使用neo4j或者d3来做呈现。


转载于:https://juejin.im/post/5c0ea550e51d457d8c210a50

Pyecharts是一个基于Python的数据可视化库,可以用来创建各种类型的表,包括关系。要实现西游记人物关系,可以按照以下步骤进行: 1. 安装Pyecharts库:可以使用pip命令在命令行中安装Pyecharts库,如下所示: ``` pip install pyecharts ``` 2. 导入所需的模块:在Python脚本中导入所需的模块,如下所示: ```python from pyecharts import options as opts from pyecharts.charts import Graph ``` 3. 创建关系对象:使用Graph类创建一个关系对象,如下所示: ```python graph = Graph() ``` 4. 添加节点和边:使用add方法添加节点和边,如下所示: ```python nodes = [ {"name": "孙悟空", "symbolSize": 50}, {"name": "猪八戒", "symbolSize": 30}, {"name": "沙僧", "symbolSize": 30}, {"name": "唐僧", "symbolSize": 40} ] edges = [ {"source": "孙悟空", "target": "猪八戒"}, {"source": "孙悟空", "target": "沙僧"}, {"source": "孙悟空", "target": "唐僧"} ] graph.add("", nodes, edges) ``` 5. 设置表属性:使用set_global_opts方法设置表的全局属性,如下所示: ```python graph.set_global_opts(title_opts=opts.TitleOpts(title="西游记人物关系")) ``` 6. 生成并保存表:使用render方法生成并保存表,如下所示: ```python graph.render("west_journey.html") ``` 以上是使用Pyecharts实现西游记人物关系的基本步骤。你可以根据实际需求进行节点和边的添加,以及设置其他表属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值