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测试工具
代码覆盖率
6.计算模块部分异常处理说明
1.五级地址被划分出六级地址
1!家按犯,西藏自治区昌都卡若区城关镇214国道城关镇嘎东街社区居民委员15347650776会.
{"姓名": "家按犯", "手机": "15347650776", "地址": ["西藏自治区", "昌都市", "卡若区", "城关镇", "214国道城关", "嘎东街社区居民委员会"]
这种情况是因为划分了省市县三级行政地址后,剩余的地址中对关键字“镇”的划分,不是如预想的划分两个部分,而是划分了三个部分,可在对关键字处理上,在提取到第一次关键字后,以第一个关键字的位置划分地址
7.实际耗时
已在博客开始的PSP表格中给出
一些无关紧要的话:听舍友念叨了好几天柯逍老师的地址匹配作业,那时候还幸灾乐祸,没想到没中了柯逍老师的课,却掉进了柯逍老师布置作业的坑里面、,第一次接触python编程,不是自己习惯的语言(至于为什么,很大一个原因就是被C++的测评工具吓得不敢用C++写了),还因为一些事情导致周五下午才开始软件工程的作业,一度让我以为不是我凉了就是我头发没了,另外感谢老师延长了提交的时间,然后要继续愁接下来的十三水了。