闲来垂钓碧溪上

计算与软件工程 作业四

作业要求 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,新建一个,这时直接将代码复制进来,就不会产生这个问题了。
    通过查询资料以及探索教程,我们解决了其中一部分问题,后期还需更多的更深入的学习。

posted on 2020-04-05 14:28  闲来垂钓碧溪上  阅读(179)  评论(0编辑  收藏  举报

导航