zoukankan      html  css  js  c++  java
  • Python数据分析——谁才是《三体》的主角?

    准备工作

    matplotlib库

    三体.txt(utf-8编码)

    三体主要人物.txt(utf-8编码)

    代码

    大纲

    导入matplotlib.pyplot方法,创建1个Novel类,包含2个属性和4个方法。

    import matplotlib.pyplot as plt
    
    class Novel():
        """创建一个小说的类"""
        
        def __init__(self, novel_name, roles_name):
            """初始化类的属性"""
      
      def one_role_nums(self, role_name):
            """统计一个人物名字出现的次数"""
    
      def main_roles_nums(self):
            """统计主要人物名字出现的次数"""
    
      def show_datas(self):
            """输出人物名字及出现次数"""
    
      def draw_picture(self, title = ""):
            """可视化数据"""
    

    初始化

    类包含两个属性,小说名字和主要人物名字。

    主要人物来源于《三体》百度百科,以每行一个名字的格式存储于txt文档,如下图。

    注:艾aa的名字采用aa,因小说中多称呼aa。

    def __init__(self, novel_name, roles_name):
        """初始化类的属性"""
    
        self.novel_name = novel_name
        self.roles_name = roles_name
    

    方法

    one_role_nums方法

    def one_role_nums(self, role_name):
        """统计一个人物名字出现的次数"""
    
        with open(self.novel_name, encoding = 'utf-8') as f:
            content = f.read()
    
        count = 0
        n = len(role_name)
        for i in range(len(content)):
            if content[i : i + n] == role_name:
                count += 1
        return count
    

    main_roles_nums方法

    返回一个列表,列表元素为字典中的键值对且按value降序排列。

    def main_roles_nums(self):
        """统计主要人物名字出现的次数"""
    
        with open(self.roles_name, encoding = 'utf-8') as f:
            names = [line.strip() for line in f.readlines()]
    
        dic = {}                    
        for name in names:
            num = self.one_role_nums(name)
            if num:
                dic[name] = num
        dic = sorted(dic.items(), key = lambda k : k[1], reverse = True)
        return dic
    

    show_datas方法

    def show_datas(self):
        """输出人物名字及出现次数"""
    
        dic = self.main_roles_nums()
        for x in dic:
            print(x[0], x[1])
    

    draw_picture方法

    运用matplotlib库将所得数据可视化。

    调用方法时可赋予一个标题,默认为空。

    def draw_picture(self, title = ""):
        """可视化数据"""
    
        dic = self.main_roles_nums()
        names, nums = [], []
        for x in dic:
            names.append(x[0])
            nums.append(x[1])
    
        n = list(range(len(names)))
        plt.figure(figsize=(10, 6))    
        plt.bar(n, nums, alpha=0.5)
        plt.xlim((0, len(names)))
        plt.xticks(n, names, rotation = 30, fontproperties = "SimHei", fontsize = 24)
        plt.title(title, fontproperties = "SimHei", fontsize = 40)
    
        plt.show()
    

    调用

    创建一个对象,赋予两个属性。

    novel = Novel("三体.txt", "三体主要人物.txt")   
    

    调用方法show_datas()

    novel.show_datas()
    

    调用方法draw_picture()并赋予一个标题

    novel.draw_picture("三体主要人物名字出现次数")
    


    结果符合预期,汪淼、罗辑和程心是当之无愧的三大主角,且随着《三体I》《三体II》《三体III》小说的篇幅增多而名字出现次数增多。

    其他人物名字出现的次数基本与观感相符合。

    分析射雕三部曲

    再以同样的方法分析射雕三部曲,可以发现,张无忌主角光环最甚。

    dic = {"射雕英雄传.txt":"射雕英雄传主要人物.txt", 
           "神雕侠侣.txt":"神雕侠侣主要人物.txt", 
           "倚天屠龙记.txt":"倚天屠龙记主要人物.txt"} 
    for key, value in dic.items():
        novel = Novel(key, value)
        novel.draw_picture()
    

    射雕英雄传

    mark

    神雕侠侣

    mark

    倚天屠龙记

    mark

    GitHub

    https://github.com/ruansh/Three-body-roles

  • 相关阅读:
    nginx
    httprunner(8)用例调用-RunTestCase
    httprunner(7)测试用例RunRequest
    jmespath(2)投影Projections
    jmespath(1)基础语法
    httprunner(6)配置信息config
    httprunner(5)编写测试用例
    Pytest(18)pytest接口自动化完整框架思维导图
    charles(3)charles防止30分钟自动重启
    charles(2)MAC Charles关闭后无法上网
  • 原文地址:https://www.cnblogs.com/ruanshuai/p/12169778.html
Copyright © 2011-2022 走看看