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

    这个作业要求在哪里 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()  # 按执行时间次数排序
    

  • 相关阅读:
    centos7 yum 方式安装nginx
    在Windows系统下用命令把应用程序添加到系统服务
    WPF内置命令
    Json解析实例
    端口占用的问题
    WPF里的报警闪烁效果
    python类中的一些神奇方法
    python中交换两个变量值的方法
    lambda应用
    python函数不定长参数
  • 原文地址:https://www.cnblogs.com/chenyu666/p/12549111.html
Copyright © 2011-2022 走看看