zoukankan      html  css  js  c++  java
  • 第一次个人编程作业

    https://github.com/CNllb/031902610

    一、PSP表格

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 60 70
    · Estimate · 估计这个任务需要多少时间 400 540
    Development 开发 180 220
    · Analysis · 需求分析 (包括学习新技术) 240 230
    · Design Spec · 生成设计文档 50 40
    · Design Review · 设计复审 60 55
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 45
    · Design · 具体设计 90 115
    · Coding · 具体编码 500 480
    · Code Review · 代码复审 60 30
    · Test · 测试(自我测试,修改代码,提交修改) 100 70
    Reporting 报告
    · Test Repor · 测试报告 30 40
    · Size Measurement · 计算工作量 40 25
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 60
    · 合计 1900 2020

    二、计算模块接口

    1、计算模块接口的设计与实现过程

    1.1 算法:

    1.1.1 核心算法:DFA

    有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号;DFA算法的核心是建立了以敏感词为基础的许多敏感词树。

    thisisimage

    1.1.2 构建出的trie树其中的单例

    sensi_word_trie_tree = {
    '邪':{
    	'孝':{
    			'攵':{
    				'end_flag':True
    				},
    			'end_falg':False
    			},
    	'end_flag':False
    	}
    }
    

    1.1.3 实现思路:

    • 首先,将敏感词文件内容读出,构造敏感词的trie树
    • 然后,使用DFS找出所有形式的敏感词出现的组合
    • 最后,使用DFA算法进行搜索

    1.2 类设计和函数设计

    • 在本次开发中,仅创建了一个File类,用于文件的各种操作
    • File里面的函数:
      • __init__:用于初始化,定义类中的各种变量
      • get_sensi_word:用于读敏感词文件,将敏感词读出
      • build_sensi_word_trie_tree:构建敏感词trie树
      • get_single_line_sensi_word:对敏感词进行单行测试
      • get_single_line_result:读入检测文本的内容,并得出检测结果数组
      • print_out:将结果以文件的形式读出
      • combine_function:对敏感词进行组合,得到组合的结果
      • DFS:深度优先搜索所有出现的敏感字的类型组合

    2、计算模块接口部分的性能改进

    2.1 Profiler性能分析图

    • 如以下图,get_single_line_sensi_word函数花费了较多的时间,在该函数中pychai进行拆字耗时较大,还想不出有什么更好的拆解方式,自己构造敏感词库耗时应该会降低一些些。

    thisisimage

    thisisimage

    3、计算模块部分单元测试展示

    • 刚开始没想到单元测试这一茬,本次作业中基本使用类的全局变量,环环相扣,较难进行单元测试,单元测试没有完成到位,但每一步完成都有进行单行输出调试

    • 最终结果文件(打码打码):

      thisisimage

    3.1 对combine_function进行单元测试,获得所有的笛卡尔积组合

    def test_1(self):
        f = File()
        test_number = 2
        test_result = [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]
        all_combine_result = f.combine_function(test_number)
        self.assertEqual(all_combine_result,test_result)
    

    3.2 单元测试覆盖率
    单元测试实在是太少了,还没开始就结束了
    thisisimage

    4、计算模块部分异常处理说明

    • 本次作业中,我们需要实现多次的文本读写工作,本人在编程的时候没有较规范进行单独出函数,直接在操作文件时添加进去了,不够单元测试有进行函数的测试
    def test_2(self):
            lines = []
            try:
                with open("words.txt","r+",encoding="utf-8") as file:
                    lines = file.readlines()
            except IOError:
                print("读写文件异常")
            else:
                print("get words!")
            print(lines)
    

    thisisimage

    三、心得

    • 本次作业应该是我学完python后做的第一个小作业,拿到题目的时候,不得不说,真的感觉算法挺难的,第一件事就是上搜索引擎和GitHub,咱就争取先做个GitHub的搬运工

    • 最先开始的时候,毫不犹豫选择了Java进行解题,相对会熟悉一些,但是看完题目要求,不能获取外部文件,这就很麻烦了,想要实现拆字和拼音,很需要做出一个自己的敏感词库,不行,还是转向python

    • 在设计算法的时候,想过几种算法,正则表达式或者暴力求解,这两种算法耗时会特别长。在同学的安利下,成功引入了DFA算法,兼顾使用pypinyin和pychar完成拆字和将汉字转化为拼音,再想方设法得出敏感词全部组合,最后放入DFA求解得出答案

    • 本次作业,我学会了如何更好的将手上的工具进行使用,学会了使用性能分析器,开始慢慢接受单元测试的方式进行代码检验

  • 相关阅读:
    简单爬取腾讯新闻内容方法封装
    Python正则表达式函数
    Escape(反思与总结)
    springboot中使用mybatis
    解决 java.lang.UnsatisfiedLinkError:no ** in java.library.path in java.library.path 的异常
    解决 fatal error: jni_md.h: No such file or directory #include “jni_md.h”
    Git troubleshooting
    Java8 新特性2——强大的Stream API
    Java8 新特性1—— Lambda表达式、内置函数式接口、方法引用与构造器引用
    搭建Linux(Ubuntu)系统下的Differential Datalog运行环境
  • 原文地址:https://www.cnblogs.com/CNLLB/p/15293160.html
Copyright © 2011-2022 走看看