zoukankan      html  css  js  c++  java
  • 计算与软件工程 作业四

    作业要求 https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10534
    课程目标 积累编程的知识,增强简单开发的能力
    实现目标的方面 提高编程能力
    本次作业 https://www.cnblogs.com/cdinzz/p/12637127.html

    作业1

    总结:

    整体来说,大家的代码在格式上没有太大的问题,在必要的地方基本都进行了明确的注释使得代码清晰易懂。在完成代码后仍需反复测试,保证代码正确性,通过复审可以学习其他同学的优点,改正自己的不足之处,及时改正其他同学提出的错误。

    作业2 结对编程

    两人自由组队进行结对编程

    1. 实现一个简单而完整的软件工具(中文文本文件人物统计程序):针对小说《红楼梦》要求能分析得出各个人物在每一个章回中各自出现的次数,将这些统计结果能写入到一个csv格式的文件。
    2. 进行单元测试、回归测试、效能测试,在实现上述程序的过程中使用相关的工具。
    3. 进行个人软件过程(PSP)的实践,逐步记录自己在每个软件工程环节花费的时间。
    4. 使用源代码管理系统 (GitHub, Gitee, Coding.net, 等);
    5. 针对上述形成的软件程序,对于新的文本小说《水浒传》分析各个章节人物出现次数,来考察代码。
    • 将上述程序开发结对编程过程记录到新的博客中,尤其是需要通过各种形式展现结对编程过程,并将程序获得的《红楼梦》与《水浒传》各个章节人物出现次数与全本人物出现总次数,通过柱状图、饼图、表格等形式展现。
    • 《红楼梦》与《水浒传》的文本小说将会发到群里。

    注意,要求能够分章节自动获得人物出现次数

    同伴地址:https://www.cnblogs.com/zhou1231/p/12636576.html

    PSP Personal Software Process Stages 预估耗时 实际耗时
    Planning 计划 1天 5小时
    Estimate 估计这个任务需要多少时间 2周 2周
    Development 开发 1周 2周
    Analysis 需求分析(包括学习新技术) 5天 5天
    Coding Standard 代码规范 1小时 1小时
    Design 具体设计 3天 4天
    Coding 具体编码 5天 1周
    Code Review 代码复审 3小时 5小时
    Test 测试 1小时 2小时
    Reporting 报告 2小时 3小时
    Size Measurement 计算工作量 1小时 1小时
    Postmortem&Process Improvement Plan 事后总结,并提出过程改进计划 1小时 半小时

    代码

    import jieba
    excludes = {"什么","一个","我们","那里","你们","如今","说道","知道","起来","姑娘","这里","出来","他们","众人","自己",
                "一面","只见","怎么","奶奶","两个","没有","不是","不知","这个","听见","这样","进来","咱们","告诉","就是",
                "东西","袭人","回来","只是","大家","只得","老爷","丫头","这些","不敢","出去","所以","不过","的话","不好",
                "姐姐","探春","鸳鸯","一时","不能","过来","心里","如此","今日","银子","几个","答应","二人","还有","只管",
                "这么","说话","一回","那边","这话","外头","打发","自然","今儿","罢了","屋里","那些","听说","小丫头","不用","如何"}
    #这些是一些干扰词汇,先列出,之后把这些词删除
    txt = open("红楼梦.txt","r",encoding='utf-8').read()
    #不写明路径的话,默认和保存的python文件在同一目录下 注意打开格式是utf-8,这个可以打开txt文件,选择另存为,注意界面右下角的格式
    words = jieba.lcut(txt)
    #利用jieba库将红楼梦的所有语句分成词汇
    counts = {}
    #创建的一个空的字典
    for word in words:
        if len(word) == 1:      
    #如果长度是一,可能是语气词之类的,应该删除掉
            continue
        else:         counts[word] = counts.get(word,0) + 1
    #如果字典中没有这个健(名字)则创建,如果有这个健那么就给他的计数加一,[姓名:数量],这里是数量加一
    for word in excludes:			
        del(counts[word])
    #这一步:如果列出的干扰词汇在分完词后的所有词汇中那么删除
       items = list(counts.items())
    #把保存[姓名:个数]的字典转换成列表
        items.sort(key=lambda x:x[1],reverse = True)
    #对上述列表进行排序,'True'是降序排列
    for i in range(10):
        word,count = items[i]
        print("{0:<10}{1:>5}".format(word,count)) 
    #这里是打印前十个,因为列表也是[姓名:个数],word就是保存姓名的变量,count就是保存个数的变量
    
    

    import jieba
    from collections import Counter
    import matplotlib.pyplot as plt
    import numpy as np
    
    
    class HlmNameCount():
        # 此函数用于绘制条形图
        def showNameBar(self,name_list_sort,name_list_count):
            # x代表条形数量
            x = np.arange(len(name_list_sort))
            # 处理中文乱码
            plt.rcParams[&apos;font.sans-serif&apos;] = [&apos;SimHei&apos;]
            # 绘制条形图,bars相当于句柄
            bars = plt.bar(x,name_list_count)
            # 给各条形打上标签
            plt.xticks(x,name_list_sort)
            # 显示各条形具体数量
            i = 0
            for bar in bars:
                plt.text((bar.get_x() + bar.get_width() / 2), bar.get_height(), &apos;%d&apos; % name_list_count[i], ha=&apos;center&apos;, va=&apos;bottom&apos;)
                i += 1
            # 显示图形
            plt.show()
    
        # 此函数用于绘制饼状图
        def showNamePie(self, name_list_sort, name_list_fracs):
            # 处理中文乱码
            plt.rcParams[&apos;font.sans-serif&apos;] = [&apos;SimHei&apos;]
            # 绘制饼状图
            plt.pie(name_list_fracs, labels=name_list_sort, autopct=&apos;%1.2f%%&apos;, shadow=True)
            # 显示图形
            plt.show()
    
        def getNameTimesSort(self,name_list,txt_path):
            # 将所有人名临时添加到jieba所用字典,以使jieba能识别所有人名
            for k in name_list:
                jieba.add_word(k)
            # 打开并读取txt文件
            file_obj = open(txt_path, &apos;rb&apos;).read()
            # jieba分词
            jieba_cut = jieba.cut(file_obj)
            # Counter重新组装以方便读取
            book_counter = Counter(jieba_cut)
            # 人名列表,因为要处理凤姐所以不直接用name_list
            name_dict ={}
            # 人名出现的总次数,用于后边计算百分比
            name_total_count = 0
            for k in name_list:
                if k == &apos;熙凤&apos;:
                    # 将熙凤出现的次数合并到凤姐
                    name_dict[&apos;凤姐&apos;] += book_counter[k]
                else:
                    name_dict[k] = book_counter[k]
                name_total_count += book_counter[k]
            # Counter重新组装以使用most_common排序
            name_counter = Counter(name_dict)
            # 按出现次数排序后的人名列表
            name_list_sort = []
            # 按出现次数排序后的人名百分比列表
            name_list_fracs = []
            # 按出现次数排序后的人名次数列表
            name_list_count = []
            for k,v in name_counter.most_common():
                name_list_sort.append(k)
                name_list_fracs.append(round(v/name_total_count,2)*100)
                name_list_count.append(v)
                # print(k+&apos;:&apos;+str(v))
            # 绘制条形图
            self.showNameBar(name_list_sort, name_list_count)
            # 绘制饼状图
            self.showNamePie(name_list_sort,name_list_fracs)
            
    
    if __name__ == &apos;__main__&apos;:
        # 参与统计的人名列表,可修改成自己想要的列表
        name_list = [&apos;宝玉&apos;, &apos;黛玉&apos;, &apos;宝钗&apos;,  &apos;凤姐&apos;,  &apos;贾母&apos;,&apos;贾琏&apos;,  &apos;平儿&apos;,&apos;王夫人&apos;,&apos;太太&apos;,&apos;老太太&apos; ]
        # 红楼梦txt文件所在路径,修改成自己文件所在路径
        txt_path = &apos;C:/Users/wzz/Desktop/红楼梦.txt&apos;
        hnc = HlmNameCount()
        hnc.getNameTimesSort(name_list,txt_path)
    
    


    总结:

    第一次接触python,在这个过程中,我们遇到了很多的问题,如:

    • 运行时显示ModuleNotFoundError: No module named 'matplotlib',同时按wins+r 进入命令行,输入python -m pip install matplotlib 安装matplotlib模块即可;
    • 代码中路径的杠是/;
    • 运行时显示SyntaxError: multiple statements found while compiling a single statement,Ctrl+N,新建一个,这时直接将代码复制进来,就不会产生这个问题了。
      通过查询资料以及探索教程,我们解决了其中一部分问题,后期还需更多的更深入的学习。
  • 相关阅读:
    js实现继承的5种方式
    JavaScript文件操作(1)-基础
    12 个免费在线的 Web 网站性能测试工具
    server r2 系统更新文件清理
    在C#中,Json的序列化和反序列化的几种方式总结
    ES6,新增数据结构Set的用法
    ES6中有关数组的一些新操作
    vue中mode hash 和 history的区别
    POST和GET的区别
    前端的细节
  • 原文地址:https://www.cnblogs.com/cdinzz/p/12637127.html
Copyright © 2011-2022 走看看