结对编程,一路走来
经过近两周的辛苦历程,我们做到了我们需要做的,和想要的结果。在此之前,我们是对结对编程一无所知,对C#一点都不熟,编程能力也不强的菜鸟。如果你是结对编程了如指掌,如果你是编程大牛,精通各种语言,这篇博客对你没有多大作用。如果你和我一样是刚刚入门的菜鸟,并且有兴趣了解结对编程,或者我们的工作,我们的编程过程,我们的思路,我愿意和你分享具体的过程。(大牛喜欢用简洁概括的话语,甚至引经据典,加入哲理,常常让菜鸟们听的五体投地,一头雾水,到头来依然不知从何下手。作为菜鸟,我希望具体的过程,能让我们知道如何下手,毕竟大牛可不是哲理扯出来的,都是实打实的n多代码堆出来的。)
首先说一下我们的工作:
任务:在一份有2万多的科研机构的名单中,有经纬度的数据覆盖率为54.6553%, 而我们要做的就是找出原有数据要修改的地方,并在保证正确率的前提下尽量补全数据。
目标:在老师要求的时间(10天)内,做完,做好。
开始工作分块:当我们拿到任务时,虽然是一头雾水,但我们依然硬着头皮做了一个粗糙的分块:
(1) 学会用C#对excel表格读写等操作
(2) 使用Google, Bing , Yahoo获得相应机构的经纬度。
(3) 比较各个地图所返回的数据,得到一份综合的最佳数据。
我们先从掌握C#对excel的操作开始,逐步展开工作,在做的过程中,我们实际是这样分块工作的:
实际工作分块:
(1) office 提供了excel 的接口,学会之
(2) 使用webclient发送请求(Google每天有2500的访问限制,需用proxy(代理);而Yahoo则没事,一天可以访问50000个)
(3) 使用Google Geocoding API 和Yahoo Geocoding API 分别用机构名查询地址,返回xml文件,并实时分析,获得想要的信息。
(4) 数据比较处理
时间花费:
分项名称 |
预计时间花费 |
实际时间花费 |
Excel接口 |
1个晚上 |
3个小时 |
得到地址信息 |
3天 |
2天 |
JSON和XML分析 |
3个小时 |
1天 |
数据处理 |
2天 |
1天 |
下面我就具体介绍我们做的过程和相关的资料,方便感兴趣的同学使用:
(1):对excel操作,如果你想花些时间学的系统些,msdn上有不少资料,但个人觉得如果你只是想快速的使用一下,就没必要详细的看,这有两个很不错的博客:http://www.cnblogs.com/kingjiong/archive/2009/01/05/1368964.html ,http://www.cnblogs.com/litianfei/archive/2008/03/21/1116906.html(推荐)
(2):使用webclient 发送请求,这个还是比较容易的,直接上一段小程序吧
WebClient wb = new WebClient();
wb.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
//wb.Proxy = new WebProxy("代理地址", true);
var s = wb.DownloadString(new Uri(str));
wb.Dispose(); // release webclient
如果使用Google的话,每天访问超过2500的话,就应该使用代理了(如果你有代理可以使用的话),或者用朋友,同学的电脑爬数据也行。var s = wb.DownloadString(new Uri(str));
中的 str是什么呢,这个就是Google Geocoding 或者Yahoo Geocoding的的URI。
使用Google Geocoding API 和Yahoo Geocoding API 分别用机构名查询地址,首先了解Google Geocoding 和Yahoo Geocoding 的URI格式(主要注意address中名字之间的空格用加号代替):
Google:
http://maps.googleapis.com/maps/api/geocode/xml?address=a+b+c,+d+e,+f&sensor=false
e.g.
http://maps.googleapis.com/maps/api/geocode/xml?address=Stanford+University&sensor=false
Yahoo:
http://where.yahooapis.com/geocode?q=a+b+c,+d+e,+f&appid=[yourappidhere]
e.g.
http://where.yahooapis.com/geocode?q=1600+Pennsylvania+Avenue,+Washington,+DC&appid=[yourappidhere]
点开给出的两个例子你就可以看到Google 和Yahoo所返回的xml文件。
(3)对xml文件进行分析:
Google和Yahoo返回的xml文件内容上的板块话,有些不同,在分析的时候,要注意。
截一段Google xml的部分: 截一段Yahoo xml的部分:
由于篇幅有限在此就不具体介绍分析板块了,我会单独在之后的博客中把每块的思想,代码,解释依次写出,供有兴趣的同学参考。
(4)然后就是数据处理了:
我们要查询19537个机构,Google返回数据12397个,覆盖率为63.4539%; Yahoo有返回值的机构个数为19170,覆盖率为98.1215% .不过正确率上肯定是Google要高些。原始数据主要是在Bing map的基础上查的,覆盖率为54.6553% 。
我们对数据进行了如下的比较:
①,如果Yahoo数据中的Location在Google数据中的Viewport区域内,我们就认为这种数据是一级可信的 ,得到4122个。
②如果Yahoo数据中的State和Google数据中对应的Area level 1匹配的话,就认为这样的数据是二级可信的,得到4723个。
③如果Yahoo数据中的Country Code 和Google数据中的Country short 匹配的话,就认为这样的数据是三级可信的, 共12271个
④如果对应机构的SourceData location 在Google_location的Viewport 范围内的话,则认为这种数据是 一级可信的,共4633个
⑤把两个一级可信的数据进行整合,得到6311个数据。
其中有1678个一级可信数据是原始数据中的一级可信数据没有的,我们把这部分抽出来,建议原始数据更改:
⑥最后在综合考虑正确率和覆盖率上,我们综合了一份覆盖率99.2373%数据。
最后手动测了100个数据,正确率还是很高的,至此,pair work工作就做完了,一路走来,有些坎坷,但每一个具体的过程都让我们学到了很多,两个人的结对编程对我来说最大的优势就是“快乐可以分享,困难可以分享,最重要是有两颗高度协调工作的大脑”。
我的队友谭明慧是一个大方,开朗,睿智的女孩,10系GPA大牛。虽然我们目前编程能力不强,但是我们的态度足够认真,我们肯花时间,我想这就是我们最后能顺利完成工作的最核心原因。我一直坚信,暂时的能力或许决定你现在走的快慢,然而态度却可以决定你能走多远。
Written by Minglei Li