第一次个人编程作业

1.GitHub

2.PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 100 60
Estimate 估计这个任务需要多少时间 20 30
Development 开发 420 560
Analysis 需求分析(包括学习新技术) 120 240
Design Spec 生成设计文档 90 75
Design Review 设计复审 30 45
Design 具体设计 60 120
Coding 具体编码 240 300
Code Review 代码复审 30 20
Test 测试(自我测试,修改代码,提交修改) 180 120
Reporting 报告 60 10
Test Repor 测试报告 30 25
Size Measurement 计算工作量 20 15
Postmortem&Process Improvement Plan 事后总结,并提出过程改进计划 60 45
  合计 1460 1665

3.计算模块接口的设计与实现过程

  • 设计思路

1.将样例输入为字符串类型,提取前面两位字符,判断是”1!","2!",还是“3!”,以此为根据划分五级或七级地址
2.根据“,”分割,将名字提取出来,再根据连续的11位数据,用正则表达式提取手机号码,将姓名和手机号码提取后,剩下的就是地址划分
3.利用cpca可以提取省市县三级行政地址,再对直辖市北京,天津,上海,重庆进行特判,提取省市县三级地址,继续对剩下的地址操作
4.以“街道”,“镇”,“城”,“乡”,“区”等为关键字,利用正则表达式划分出第四级地址,若难度等级为2,至此五级地址划分完毕
5.若难度地址为3,则对剩余地址以“港”,“路”,“街”,“胡同”等关键词,利用正则表达式继续划分出第五级地址
6.以"号“,”弄“,”乡道“等关键词,将剩下的地址分割为两级,至此,七级地址划分完毕

  • 类和函数

因为第一次用python编程,时间比较赶,所以并没有用到类,直接是面向过程编程;
部分关键代码如下:

    dataframe=cpca.transform(location1,cut=False,lookahead=10)
    #划分省市县三级行政的关键
    townpattern=re.compile(r'(.*?)镇')
    town=townpattern.findall(address)
    #第四级地址划分
    road=re.search(r'(.*?港路)|(.*?[路街港道])|(.*胡同)|(.*?庭)|(.*?区)|(.*?里)',address)
    #第五级地址划分
  • 关键和独到之处

利用cpca划分行政地址的时候,单一使用全文搜索和局部搜索在应用中都会有不足的地方,比如全文匹配会造成匹配效率的低下,因此在代码中,根据输入样例做判断,将全文搜索和局部搜索应用在不同的地方,并且设置了cpca搜索字段的长度,以便匹配到如“新疆维吾尔自治区”这样名字较长的省份


4.计算模块接口部分的性能改进

性能分析:函数调用图

使用pycharm自带的profile功能得到

性能分析:时间开销

因为是面向过程的编程,看到时间开销最大时input函数,也在意料之中,一天速成python我真是太难了,在性能改进中,删减了一些繁琐的语句,将可以并行搜索的关键词,或者不互斥的判断放在一起,尽量简洁代码


5.计算模块部分单元测试展示

样例输入与结果显示

1!席赠,湖南省长沙市雨花区黎托街道黎托15224968346乡川河村雨花区托溪小学.
{"姓名": "席赠", "手机": "15224968346", "地址": ["湖南省", "长沙市", "雨花区", "黎托街道", "黎托乡川河村雨花区托溪小学"]}
1!淳于象,辽宁丹东凤城市刘家河镇304国道徐家台村委13986910893会.
{"姓名": "淳于象", "手机": "13986910893", "地址": ["辽宁省", "丹东市", "凤城市", "刘家河镇", "304国道徐家台村委会"]}
1!成偶,山西省吕梁岚18918500295县王狮乡209国道阳湾明德小学.
{"姓名": "成偶", "手机": "18918500295", "地址": ["山西省", "吕梁市", "岚县", "王狮乡", "209国道阳湾明德小学"]}
2!常寒玷,山西省吕梁岚县13530096765王狮乡阳湾明德小学.
{"姓名": "常寒玷", "手机": "13530096765", "地址": ["山西省", "吕梁市", "岚县", "王狮乡", "", "", "阳湾明德小学"]}
1!何东,北京东城13297814858区朝阳门街道南小街59号竹杆胡同小区.
{"姓名": "何东", "手机": "13297814858", "地址": ["北京", "北京市", "东城区", "朝阳门街道", "南小街59号竹杆胡同小区"]}
1!满哪俊,福建福州仓山区临江街道工农路36号下池小区11号15384414182楼.
{"姓名": "满哪俊", "手机": "15384414182", "地址": ["福建省", "福州市", "仓山区", "临江街道", "工农路36号下池小区11号楼"]}
1!钱僻苍,安徽省合肥市瑶海区合肥龙岗综合经济开发区海洲景秀世家2期13001981786.
{"姓名": "钱僻苍", "手机": "13001981786", "地址": ["安徽省", "合肥市", "瑶海区", "合肥龙岗综合经济开发区", "海洲景秀世家2期"]}
2!澹台拄云,浙江省杭州市丁兰街道环丁路10号明珠15244068259.
{"姓名": "澹台拄云", "手机": "15244068259", "地址": ["浙江省", "杭州市", "", "丁兰街道", "环丁路", "10号", "明珠"]}
1!阳吟,上海市绿华18970386517镇华西村村委会.
{"姓名": "阳吟", "手机": "18970386517", "地址": ["上海", "上海市", "", "绿华镇", "华西村村委会"]}
2!微生句,广西壮族自治区桂林市七星15605131954区七星区街道金星路2号矿地院.
{"姓名": "微生句", "手机": "15605131954", "地址": ["广西壮族自治区", "桂林市", "七星区", "七星区街道", "金星路", "2号", "矿地院"]}
2!柳吻,辽宁省大连市中山区青泥13013864707洼桥街道上海路45号宏孚大厦苏宁易购.
{"姓名": "柳吻", "手机": "13013864707", "地址": ["辽宁省", "大连市", "中山区", "青泥洼桥街道", "上海路", "45号", "宏孚大厦苏宁易购"]}

构造测试数据来源于python测试工具

代码覆盖率


代码覆盖率只有66%,我太菜了昂


6.计算模块部分异常处理说明

1.五级地址被划分出六级地址

1!家按犯,西藏自治区昌都卡若区城关镇214国道城关镇嘎东街社区居民委员15347650776会.
{"姓名": "家按犯", "手机": "15347650776", "地址": ["西藏自治区", "昌都市", "卡若区", "城关镇", "214国道城关", "嘎东街社区居民委员会"]
这种情况是因为划分了省市县三级行政地址后,剩余的地址中对关键字“镇”的划分,不是如预想的划分两个部分,而是划分了三个部分,可在对关键字处理上,在提取到第一次关键字后,以第一个关键字的位置划分地址


7.实际耗时

已在博客开始的PSP表格中给出

一些无关紧要的话:听舍友念叨了好几天柯逍老师的地址匹配作业,那时候还幸灾乐祸,没想到没中了柯逍老师的课,却掉进了柯逍老师布置作业的坑里面、,第一次接触python编程,不是自己习惯的语言(至于为什么,很大一个原因就是被C++的测评工具吓得不敢用C++写了),还因为一些事情导致周五下午才开始软件工程的作业,一度让我以为不是我凉了就是我头发没了,另外感谢老师延长了提交的时间,然后要继续愁接下来的十三水了。

posted on 2019-09-27 19:53  Monster--  阅读(210)  评论(3编辑  收藏  举报