이 섹션은 가장 인기 있는 온라인 북마크 사이트 중 하나에서 데이터를 검색하는 방법과 이 데이터를 사용하여 유사한 사용자를 찾고 이전에 보지 못한 링크를 추천하는 방법을 보여준다. http://del.icio.us에서 접속할 수 있는 이 사이트는 사람들이 나중에 참조할 수 있도록 관심있는 계정을 설정하고 링크를 게시할 수 있게 해준다. 당신은 이 사이트를 방문하여 다른 사람들이 게시한 링크를 볼 수 있고, 또한 많은 다른 사람들이 게시한 "인기적인" 링크를 찾아볼 수 있다. del.icio.us의 샘플 페이지는 그림 2-6에 나와 있다.


일부 링크 공유 사이트와는 달리, del.icio.us은 (글을 쓸 때) 비슷한 사람들을 찾거나 여러분이 좋아할 만한 링크를 추천하는 어떤 방법도 포함하지 않는다. 다행히도, 당신은 이 장에서 논의된 기술을 사용하여 그 기능을 직접 추가할 수 있다.


del.icio.us API

del.icio.us의 데이터는 XML 형식으로 데이터를 반환하는 API를 통해 이용할 수 있다. 더욱 쉽게 하기 위해,  To이나 http://code.google.com/p/pydelicious/source에서 다운로드할 수 있는 Python API가 있다.


이 섹션의 예를 살펴보려면 최신 버전의 라이브러리를 다운로드하여 Python 라이브러리 경로에 넣으십시오(이 라이브러리 설치에 대한 자세한 내용은 부록 A 참조).


이 도서관에는 사람들이 제출한 링크를 받기 위한 간단한 전화가 몇 통 있다. 예를 들어, 프로그래밍에 대한 최근 인기 게시물 목록을 얻으려면 get_popular call을 사용하십시오.


>> import pydelicious

>> pydelicious.get_popular(tag='programming')

[{'count': '', 'extended': '', 'hash': '', 'description': u'How To Write

Unmaintainable Code', 'tags': '', 'href': u'http://thc.segfault.net/root/phun/

unmaintain.html', 'user': u'dorsia', 'dt': u'2006-08-19T09:48:56Z'}, {'count': '',

'extended': '', 'hash': '', 'description': u'Threading in C#', 'tags': '', 'href':

u'http://www.albahari.com/threading/', 'user': u'mmihale', 'dt': u'2006-05-17T18:09:

24Z'},

...etc...


각 사전, URL, 설명, 게시한 사용자 등 사전 목록을 반환하는 것을 볼 수 있다. 당신이 실시간 데이터로 작업하고 있기 때문에, 당신의 결과는 예시와는 다르게 보일 것이다. 사용할 다른 두 가지 통화, 즉 get_urlposts와 get_userposts는 지정된 URL에 대한 모든 게시물을 반환하며, 지정된 사용자에 대한 모든 게시물을 반환한다. 이 통화에 대한 데이터는 같은 방식으로 반환된다.


데이터셋 구축

del.icio.us에서 모든 사용자 게시물의 전체 집합을 다운로드할 수 없으므로, 그 중 일부를 선택해야 한다. 이 일을 하고 싶은 대로 할 수도 있지만, 예를 들어 재미있는 결과를 보여주려면, 자주 글을 올리고 비슷한 글을 쓰는 사람들을 찾는 것이 좋을 것이다.


이를 위한 한 가지 방법은 최근에 특정 태그가 있는 인기 링크를 게시한 사용자 목록을 얻는 것이다. deliciousrec.py이라는 새 파일을 생성하고 다음 코드를 입력하십시오.

from pydelicious import get_popular,get_userposts,get_urlposts

def initializeUserDict(tag,count=5):

 user_dict={}

 # get the top count' popular posts

 for p1 in get_popular(tag=tag)[0:count]:

 # find all users who posted this

 for p2 in get_urlposts(p1['href']):

 user=p2['user']

 user_dict[user]={}

 return user_dict


이것은 당신에게 몇몇 사용자들과 함께 사전을 줄 것이고, 각각 링크가 채워지기를 기다리고 있는 빈 사전을 참조할 것이다. API는 링크를 게시하기 위해 마지막 30명만 반환하므로, 이 기능은 처음 5개 링크에서 사용자를 모아 더 큰 집합을 만든다.


영화 평론가 데이터 세트와 달리 이 경우 등급은 사용자가 이 링크를 올리지 않은 경우 0, 게시한 경우 등급은 1에 불과하다. 이제 API를 사용하여 모든 사용자의 등급을 채우는 기능을 만들 수 있다. 


def fillItems(user_dict):

 all_items={}

 # Find links posted by all users

 for user in user_dict:

 for i in range(3):

 try:

 posts=get_userposts(user)

 break

 except:

 print "Failed user "+user+", retrying"

 time.sleep(4)

 for post in posts:

 url=post['href']

 user_dict[user][url]=1.0

 all_items[url]=1

 # Fill in missing items with 0

 for ratings in user_dict.values( ):

 for item in all_items:

 if item not in ratings:

 ratings[item]=0.0


이것은 이 장의 시작 부분에서 손으로 작성한 비평가 사전과 유사한 데이터 세트를 구축하는 데 사용할 수 있다.


>> from deliciousrec import *

>> delusers=initializeUserDict('programming')

>> delusers ['tsegaran']={} # Add yourself to the dictionary if you use delicious

>> fillItems(delusers)


세 번째 줄은 사용자 tsegaran을 목록에 추가한다. del.icio.us를 사용하면 tsegaran을 자신의 사용자 이름으로 대체할 수 있다.


이티템을 채우기 위한 전화는 사이트에 몇 백 건의 요청을 하기 때문에 실행하는데 몇 분 정도 걸릴 수 있다. 때때로 API는 너무 빠르게 반복되는 요청을 차단한다. 이 경우, 코드는 3회까지 일시 중지했다가 재시도한다.

  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기