计算与软件工程第四次作业

这个作业要求在哪里 https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10534
我在这个课程的目标是 了解学习软件工程相关知识、应用,为以后打下基础。
此作业在哪个具体方面帮我实现目标 学会代码复审和结对编程
其他参考文献 https://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html https://www.cnblogs.com/xinz/archive/2011/08/07/2130332.htmlintro_zh_CN.html https://www.cnblogs.com/-1307/p/6529269.html https://pypi.org/project/matplotlib/#files https://www.cnblogs.com/Sabre/p/8007034.html

作业正文|https://i-beta.cnblogs.com/posts/edit;postId=12431633

作业1

每个人针对之前两次作业所写的代码,请按照代码规范(风格规范、设计规范)要求评判其他学生的程序,同时进行代码复审(按照代码复审核表 https://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html),要求评价数目不少于8。
对代码复审的博客链接:https://www.cnblogs.com/chenyu666/p/12609752.html

作业2 结对编程

1人物统计程序

参考结对编程的方法、过程(https://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html)开展两人合作完成本项目
实现一个简单而完整的软件工具(中文文本文件人物统计程序):针对小说《红楼梦》要求能分析得出各个人物在每一个章回中各自出现的次数。
队友结对编程链接:https://www.cnblogs.com/li-lingling/p/12620082.html

此代码中利用到的函数:

(1)Readtxt(filename):读取文件,文件名是由用户输入,本函数需要对文件存在与否进行判断和处理,如果存在则返回读取的文本内容,否则提示“检查文件是否存在”,并返回读取内容为空。
(2)Txtcut(txt):功能是分词并生成结果字典(单词:数量)counts
(3)word_exclude(counts,excludes):功能是对分词结果字典进行数据清洗(排除干扰单词)和排序。其中参数counts为Txtcut(txt)分词结果字典,excludes为用户自己设置的排除内容。
(4)word_out(items,num):功能是输出用户希望看到的统计人物数量情况。其中参数items是函数word_exclude(counts,excludes)的处理结果,num是用户输入的数量程序

利用Python编程要注意:

(1)下载jieba:下载放到Python文件夹中。
(2)下载可以进行图表的软件:matplotlib,利用cmd下载失败,则用网站下载。注意找到合适的matplotlib版本,[下载指南]https://www.cnblogs.com/Sabre/p/8007034.html

(3)建立new file,命名并run,即可得到关于词频统计的柱状图。

import jieba
excludes = {"什么","一个","我们","那里","你们","如今","说道","知道","起来","姑娘","这里","出来","他们","众人","自己",
            "一面","只见","怎么","奶奶","两个","没有","不是","不知","这个","听见","这样","进来","咱们","告诉","就是",
            "东西","袭人","回来","只是","大家","只得","老爷","丫头","这些","不敢","出去","所以","不过","的话","不好",
            "姐姐","探春","鸳鸯","一时","不能","过来","心里","如此","今日","银子","几个","答应","二人","还有","只管",
            "这么","说话","一回","那边","这话","外头","打发","自然","今儿","罢了","屋里","那些","听说","小丫头","不用","如何"}
'''
这些是一些干扰词汇,先列出,之后把这些词删除
'''
txt = open("shz.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(20):
    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['font.sans-serif'] = ['SimHei']
        # 绘制条形图,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(), '%d' % name_list_count[i], ha='center', va='bottom')
            i += 1
        # 显示图形
        plt.show()

    # 此函数用于绘制饼状图
    def showNamePie(self, name_list_sort, name_list_fracs):
        # 处理中文乱码
        plt.rcParams['font.sans-serif'] = ['SimHei']
        # 绘制饼状图
        plt.pie(name_list_fracs, labels=name_list_sort, autopct='%1.2f%%', 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, 'rb').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 == '熙凤':
                # 将熙凤出现的次数合并到凤姐
                name_dict['凤姐'] += 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+':'+str(v))
        # 绘制条形图
        self.showNameBar(name_list_sort, name_list_count)
        # 绘制饼状图
        self.showNamePie(name_list_sort,name_list_fracs)
        

if __name__ == '__main__':
    # 参与统计的人名列表,可修改成自己想要的列表
    name_list = ['宝玉', '黛玉', '宝钗', '元春', '探春', '湘云', '妙玉', '迎春', '惜春', '凤姐', '熙凤', '巧姐', '李纨', '可卿', '贾母', '贾珍', '贾蓉', '贾赦', '贾政', '王夫人', '贾琏', '薛蟠', '香菱', '宝琴', '袭人', '晴雯', '平儿', '紫鹃', '莺儿']
    # 红楼梦txt文件所在路径,修改成自己文件所在路径
    txt_path = 'C:/Users/hp/Desktop/hl.txt'
    hnc = HlmNameCount()
    hnc.getNameTimesSort(name_list,txt_path)

4.使用源代码管理系统Gitee

5.针对上述形成的软件程序,对于新的文本小说分析各个章节人物出现次数,用图表来表现。



相关文本的单元测试、效能测试:

单元测试

import unittest
from ceshi import *
class MyTestCase(unittest.TestCase):
    def setUp(self):
        print("测试开始")
    def test_something(self):
        name_list = ['熙凤', '黛玉', '宝钗', '探春', '湘云', '迎春', '元春', '惜春', '妙玉', '巧姐', '李纨', '可卿']
        txt_path = 'hl.txt'
        name_list_count = [1149, 953, 696, 448, 393, 146, 126, 105, 81, 40, 36, 14]
        items = list()
        for i in range(12):
            items.append([name_list[i], name_list_count[i]])
        self.assertEqual(items, NameCount().getNameTimesSort(name_list,txt_path))
    def tearDown(self):
        print("测试结束")
if __name__ == '__main__':
    unittest.main()

效能测试

效能测试
if name == "main":
import cProfile
import pstats
cProfile.run("main()", "result")
# 直接把分析结果打印到控制台
p = pstats.Stats("result") # 创建Stats对象
p.strip_dirs().sort_stats("call").print_stats() # 按照调用的次数排序
p.strip_dirs().sort_stats("cumulative").print_stats() # 按执行时间次数排序
p.print_callers(0.5, "process_file") # 如果想知道有哪些函数调用了process_file,小数,表示前百分之几的函数信息
p.print_callers(0.5, "process_buffer") # 如果想知道有哪些函数调用了process_buffer
p.print_callers(0.5, "output_result") # 如果想知道有哪些函数调用了output_res

# 水浒传人物统计
import jieba
import csv
import pstats
import profile
class NameCount():
     def getNameTimesSort(self, name_list, txt_path):
         # 添加jieba分词
        mydict = ['及时雨','黑旋风','行者','豹子头','花和尚','智多星','玉麒麟','小旋风','小李广','九纹龙','青面兽','母大虫','母夜叉','王教头','扈三娘','陆虞候']
        for item in mydict:
            jieba.add_word(item)
        #打开并读取txt文件
        txt = open('shz.txt','r',encoding='utf-8').read()
         # 定义别名列表
        bieming = [['及时雨','宋江','呼保义','孝义黑三郎','宋公明','宋押司'],['黑旋风','李逵','铁牛'],['武松','武二郎','行者','武行者','武都头'],['豹子头','林冲','林教头'],
                   [ '鲁提辖' ,'鲁达','智深','花和尚','鲁智深'],['智多星','吴用','吴学究','吴加亮','赛诸葛','加亮先生'],['卢俊义','玉麒麟','卢员外'],[ '小旋风','柴进'],
                   ['花荣','小李广'],['九纹龙','史进'],['杨志','杨制使','杨提辖','青面兽'],['顾大嫂','母大虫'],['孙二娘','母夜叉'],['王进','王教头'],['扈三娘','一丈青'],['陆虞候','陆谦']]
        words = jieba.lcut(txt)
        counts = {}
        for word in words:
            if len(word) == 1:
                continue
            else:
                counts[word] = counts.get(word, 0) + 1
        # 计算出场次数(各个别名的合计次数)
        lst = list()
        for i in range(16):
            lt = 0
            for item in bieming[i]:
                lt += counts.get(item, 0)
            lst.append(lt)
        items = list()
        for i in range(16):
            items.append([name_list[i], lst[i]])
        items.sort(key=lambda x: x[1], reverse=True)
        f = open('水浒传人物统计.csv', 'w', newline='', encoding='utf-8')
        csv_writer = csv.writer(f)
        csv_writer.writerow(['水浒传人物统计'])
        csv_writer.writerow(["姓名", "出现次数"])
        for i in range(16):
            word, count = items[i]
            csv_writer.writerow([word, count])
            print("{0:<10}{1:>5}".format(word, count))
        f.close()      
        return items
if __name__ == '__main__':

    # 参与统计的人名列表,可修改成自己想要的列表
    name_list = ['宋江','李逵','武松','林冲','鲁智深','吴用','卢俊义','柴进','花荣','史进','杨志','顾大嫂','孙二娘','王进','扈三娘','陆谦']
    # txt文件所在路径
    txt_path = 'shz.txt'
    NameCount().getNameTimesSort(name_list,txt_path)
    print("效能测试:")
    profile.run('NameCount()', 'result')
    # 直接把分析结果打印到控制台
    p = pstats.Stats('result')  # 创建Stats对象
    p.strip_dirs().sort_stats("call").print_stats()  # 按照调用的次数排序
    p.strip_dirs().sort_stats("cumulative").print_stats()  # 按执行时间次数排序

原文地址:https://www.cnblogs.com/chenyu666/p/12549111.html