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 | · 设计复审 | 55 | |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 45 |
· Design | · 具体设计 | 90 | 115 |
· Coding | · 具体编码 | 500 | 480 |
· Code Review | · 代码复审 | ||
· Test | · 测试(自我测试,修改代码,提交修改) | 100 | |
Reporting | 报告 | ||
· Test Repor | · 测试报告 | ||
· Size Measurement | · 计算工作量 | 25 | |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | ||
· 合计 | 1900 | 2020 |
二、计算模块接口
1、计算模块接口的设计与实现过程
1.1 算法:
1.1.1 核心算法:DFA
有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号;DFA算法的核心是建立了以敏感词为基础的许多敏感词树。
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
-
:构建敏感词trie树build_sensi_word_trie_tree
-
:对敏感词进行单行测试get_single_line_sensi_word
-
:读入检测文本的内容,并得出检测结果数组get_single_line_result
-
:将结果以文件的形式读出print_out
-
:对敏感词进行组合,得到组合的结果combine_function
-
:深度优先搜索所有出现的敏感字的类型组合DFS
-
2、计算模块接口部分的性能改进
2.1 Profiler性能分析图
- 如以下图,
函数花费了较多的时间,在该函数中pychai进行拆字耗时较大,还想不出有什么更好的拆解方式,自己构造敏感词库耗时应该会降低一些些。get_single_line_sensi_word
3、计算模块部分单元测试展示。
- 刚开始没想到单元测试这一茬,本次作业中基本使用类的全局变量,环环相扣,较难进行单元测试,单元测试没有完成到位,但每一步完成都有进行单行输出调试
- 最终结果文件(打码打码):
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 单元测试覆盖率
单元测试实在是太少了,还没开始就结束了
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)
三、心得
- 本次作业应该是我学完python后做的第一个小作业,拿到题目的时候,不得不说,真的感觉算法挺难的,第一件事就是上搜索引擎和GitHub,咱就争取先做个GitHub的搬运工