第一次个人编程作业
一、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
planning | 计划 | ||
Estimate | 估计这个任务需要多少时间 | 20 | 30 |
Development | 开发 | ||
Analysis | ·需求分析 (包括学习新技术) | 300 | 480 |
· Design Spec | · 生成设计文档 | 30 | 60 |
· Design Review· | 设计复审 | 120 | 180 |
· Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 20 |
· Design | · 具体设计 | 90 | 120 |
· Coding· | 具体编码 | 600 | 780 |
· Code Review· | 代码复审 | 60 | 120 |
· Test· 测试 | (自我测试,修改代码,提交修改) | 60 | 90 |
Reporting | 报告 | ||
· Test Repor· | 测试报告 | 60 | 90 |
Size Measurement | 计算工作量 | 10 | 5 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 90 | 30 |
合计 | 1390 | 2005 |
二、计算模块接口
2.1计算模块接口的设计与实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?说明你的算法的关键(不必列出源代码),以及独到之处。
2.1.1 函数设计
利用正则表达式检测出敏感词
函数的功能图
- func_chaizi函数:进行汉字的拆分。
def func_chaizi():
wubi98 = Schema('wubi98')
wubi98.run()
return wubi98
- Tosplit函数:对汉字进行二分拆解,例如(理)字得到的第一部分(王)和第二部分(里)
def Tosplit(split_word, word:
return split_word.tree[word].first.name[0], split_word.tree[word].second.name[0]
- ToSearchsensitive函数:对敏感词进行检测,将制定的正则表达式与文本一一匹配
def ToSearchsensitive(sentence_list, rules_list, rules_split_list, pinyinlist, sensitive_words):
- creatRules_pinyin函数:制定正则表达式拼音规则
def creatRules_pinyin(dictionary):
rules.append(rules_key)
return rules
- creatRules_split函数:制定正则表达式拆字部分规则
def creatRules_split(dictionary):
rules.append(rules_key)
return rules
- Creatdictionary函数:构造敏感词字典,当敏感词是英文时,key=word,值为None。若是中文,此时key=word,值为二分拆字的结果。同时构造拼音列表,列表元素[('法','fa'),('轮’,'lun')]。
def Creatdictionary(sensitive_words, text):
pinyinlist.append((character, ''.join(lazy_pinyin(character))))
代码的独到之处:
对于多音字的处理
if ''.join(lazy_pinyin(word)) == pinyin[1] and word != pinyin[0]: #当拼音一样而字不一样
location.append((index, word))
s1 = list(sentence)
s1[index] = pinyin[0]
sentence = ''.join(s1)
首先找出多音字的下标并且记录,sentence = ''.join(s1)进行替换,可以实现多音字的处理
输出结果
2.2.计算模块接口部分的性能改进。记录在改进计算模块性能上所花费的时间,描述你改进的思路,并展示一张性能分析图(由VS 2019、JProfiler或者Jetbrains系列IDE自带的Profiler的性能分析工具自动生成),并展示你程序中消耗最大的函数。
时间降序图
可以发现时间用的最多的模块在func_chaizi上,代码中存在着多次调用二分拆字,占的时间较大,后续希望能够保存二分拆字的结果从而减少过多的调用来提升func_chaizi模块的速度。
计算模块部分单元测试展示。展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。并将单元测试得到的测试覆盖率截图,发表在博客中。
对于测试数据,没进入条件语句则以下代码块没被覆盖,对于构造的测试数据应该要考虑到所有的情况
2.4 计算模块部分异常处理说明。在博客中详细介绍每种异常的设计目标。每种异常都要选择一个单元测试样例发布在博客中,并指明错误对应的场景。
IO异常
def IOerror(self)
try:
org_file = open('org.txt', encoding='utf-8')
except IOError:
print("Not Found")
else:
print("Successfully Load")
三、心得
(3.1)在完成本次作业过程的心得体会
一开始拿到题目的时候以为调一下库就能解决问题,但是现在我的肝告诉我之前的想法过于天真。首先去github上搜敏感词检测,得到的做法是dfa算法,所以一开始从dfa入手,后来发现没有能力实现题目拆字的要求,就放弃了这种做法改为正则表达式。最后使用了正则表达式加上调库大法以及无数次的debug得到了最初版。
通过这几天在互联网的奔波,还是学到了不少东西(虽然过程很痛苦