第一次个人编程作业

github链接

一、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 函数设计
利用正则表达式检测出敏感词
函数的功能图
enter image description here

  • 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的性能分析工具自动生成),并展示你程序中消耗最大的函数。
时间降序图
enter image description here
可以发现时间用的最多的模块在func_chaizi上,代码中存在着多次调用二分拆字,占的时间较大,后续希望能够保存二分拆字的结果从而减少过多的调用来提升func_chaizi模块的速度。
计算模块部分单元测试展示。展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。并将单元测试得到的测试覆盖率截图,发表在博客中。

enter image description here

对于测试数据,没进入条件语句则以下代码块没被覆盖,对于构造的测试数据应该要考虑到所有的情况

enter image description here
enter image description here

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得到了最初版。
通过这几天在互联网的奔波,还是学到了不少东西(虽然过程很痛苦

posted @ 2021-09-23 22:33  mingliangzi  阅读(37)  评论(0编辑  收藏  举报