blogging

집단지성프로그래밍 데이터셋을 입맛대로 바꾸기

hongiiv 2008. 8. 31. 03:07
반응형
지오코딩을 활용한 온라인 데이트 사이트 데이터 만들기

집단지성프로그래밍을 구입한지는 꽤 된거 같은데, 계속 가방속에서 자고 있다. 가장 관심을 끄는 부분부터 틈나면 읽어 나가고는 있는데, 요즘 9장을 좀 읽고 있다가 이전에 만들어 놓은 (리버스)지오코딩 서비스도 사용할 겸 사용되는 데이터셋도 국내용(??)으로 바꿀겸 간단히 코드와 데이터셋을 변경했다.

9장 고급 분류 기법: 커널 기법과 SVM을 보면 중매 데이터 세트가 나온다. 이 중매 데이터(matchmaker.csv)는 나이, 흡연여부, 자녀희망, 관심목록, 거주지의 형식으로 되어있는데, 마지막의 거주지는 4절 '분류 데이터의 특성'의 '야후! 지도를 사용한 거리 계산' 부분에서 설명이 나온다.

주소를 가지고 위/경도의 좌표 정보를 야후의 지오코딩 서비스를 통해 알아내고 남/녀 커플의 거주지간 거리를 반환하여 분류시 하나의 특성으로 사용하도록 되어있다. - 남녀간의 매칭에서 서로간의 거주지역은 무시 못할 변수임에는 분명하다. 모든 조건이 동일할 경우 서울:서울 커플을 맺어주는 것이 서울:부산 커플을 맺어주는 것보다는 낫지 않은가? 물론 나도 멀리 원거리 연예를 하고 있지만,,,,^^

여기서 세가지를 바꾸어 보았다. 우선 첫 번째로는 영문주소로 되어있는 부분을 국내 주소로 바꾸고, 두 번째는 야후!의 지오코딩 서비스 대신에 국내 순수 기술로 개발된 ^^ Geocoding and Reverse Geocoding Open API(for Korea)를 가지고 주소를 위/경도 좌표로 변환할 것이다. 마지막으로는 두 주소지간의 거리를 마일에서 킬로미터 단위로 변경(마일로 해주면 감이 안온다 ^^)하여 사용하도록 할 것이다.

우선 advancedclassify.py에서 주소지를 입력하면 해당 위/경도 좌표를 반환하는 getlocation을 대신해서 사용할 getlocation_kor을 다음과 같이 코딩한다.

국내 지오코딩 서비스(http://www.hongiiv.com/service/geocoding_search.php?address=주소) 형태의 Open API로 제공되고 있으며(물론 야후! 코리아에서도 국내 주소용 지오코딩 서비스를 제공하기는 한다.), 여기에 대한 응답은 다음과 같은 XML 형태로 반환한다.

<rsp stat="ok">
  <method>geocoding_search</method>
  <format>rest</format>
  <result>
    <address>서울 은평구 녹번동 질병관리본부</address>
    <zipcode>122-701</zipcode>  
    <naver>
      <naver_x>306151</naver_x>
      <naver_y>556443</naver_y>
    </naver>
    <google>
      <google_lat>37.6027433174</google_lat>
      <google_lng>126.937116733</google_lng>
    </google>
  </result>
</rsp>

우리가 사용하고자 하는 좌표는 네이버에서 사용하는 좌표가 아닌 구글에서 사용하는 좌표계이므로, google_lat와 google_lng 엘리먼트에 있는 값을 가져온다.

def getlocation_ko(address):
  s=unicode(address, "utf8").encode("cp949")
  if address in loc_cache: return loc_cache[address]
  data=urlopen('http://www.hongiiv.com/service/'+
                'geocoding_search.php?address=%s' %
                 (quote(s))).read()
  doc=parseString(data)
  lat=doc.getElementsByTagName('google_lat')[0].firstChild.nodeValue
  long=doc.getElementsByTagName('google_lng')[0].firstChild.nodeValue
  loc_cache[address]=(float(lat),float(long))
  return loc_cache[address]

킬로미터 형태로 두 좌표간의 거리를 반환하는 kmdistance는 milesdistance에 1.6093을 곱해서 마일 대신 킬로미터로 반환하도록 하였다.

def kmdistance(a1,a2):
  lat1,long1=getlocation_ko(a1)
  lat2,long2=getlocation_ko(a2)
  latdif=69.1*(lat2-lat1)
  longdif=53.0*(long2-long1)
  miles= (latdif**2+longdif**2)**.5
  return miles*1.6093

Picture 3
수행한 결과

국내 주소로 변환한 matchmaker_kor.csv getlocation_ko와 kilodistance가 포함된 advancedclassify.py 코드는 여기서 다운로드 한다.
반응형