第一次个人编程作业
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算法的核心是建立了以敏感词为基础的许多敏感词树。
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进行拆字耗时较大,还想不出有什么更好的拆解方式,自己构造敏感词库耗时应该会降低一些些。
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的搬运工
-
最先开始的时候,毫不犹豫选择了Java进行解题,相对会熟悉一些,但是看完题目要求,不能获取外部文件,这就很麻烦了,想要实现拆字和拼音,很需要做出一个自己的敏感词库,不行,还是转向python
-
在设计算法的时候,想过几种算法,正则表达式或者暴力求解,这两种算法耗时会特别长。在同学的安利下,成功引入了DFA算法,兼顾使用pypinyin和pychar完成拆字和将汉字转化为拼音,再想方设法得出敏感词全部组合,最后放入DFA求解得出答案
-
本次作业,我学会了如何更好的将手上的工具进行使用,学会了使用性能分析器,开始慢慢接受单元测试的方式进行代码检验