第一次个人编程作业

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求解得出答案

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

posted @ 2021-09-16 13:51  刘凌斌  阅读(104)  评论(0编辑  收藏  举报