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


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


The del.icio.us API

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


이 섹션의 예를 살펴보려면 최신 버전의 라이브러리를 다운로드하여 Python 라이브러리 경로에 넣자.


이 라이브러리에는 사람들이 제출한 링크를 받기 위한 간단한 절차가 몇 가지 있다. 예를 들어, 프로그래밍에 대한 최근 인기 게시물 목록을 얻으려면 get_popular call을 사용해야 한다.


>> import pydelicious

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


각 사전, 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회까지 일시 중지했다가 재시도한다.



추천 이웃 및 링크

이제 데이터 세트를 구축했으므로 이전에 사용했던 것과 동일한 기능을 영화 비평가 데이터 세트에 적용할 수 있다. 사용자를 임의로 선택하고 자신의 취향과 유사한 다른 사용자를 찾으려면 Python 세션에 다음 코드를 입력하십시오.


>> import random

>> user=delusers.keys( )[random.randint(0,len(delusers)-1)]

>> user

u'veza'

>> recommendations.topMatches(delusers,user)

[(0.083, u'kuzz99'), (0.083, u'arturoochoa'), (0.083, u'NickSmith'), (0.083,

u'MichaelDahl'), (0.050, u'zinggoat')]


getRecommendations를 호출하여 이 사용자에 대한 링크에 대한 권장 사항을 얻을 수도 있다. 이렇게 하면 모든 품목이 순서대로 반환되므로 10위 이내로 제한하는 것이 좋다.


>> recommendations.getRecommendations(delusers,user)[0:10]

[(0.278, u'http://www.devlisting.com/'),

(0.276, u'http://www.howtoforge.com/linux_ldap_authentication'),

(0.191, u'http://yarivsblog.com/articles/2006/08/09/secret-weapons-for-startups'),

(0.191, u'http://www.dadgum.com/james/performance.html'),

(0.191, u'http://www.codinghorror.com/blog/archives/000666.html')]


물론, 앞에서 설명한 것처럼, 기본 설정 목록이 전송될 수 있어, 사람들이 아닌 링크라는 관점에서 검색을 프레임할 수 있다. 특히 흥미로운 링크와 유사한 링크를 찾으려면 다음을 시도해보자.


>> url=recommendations.getRecommendations(delusers,user)[0][1]

>> recommendations.topMatches(recommendations.transformPrefs(delusers),url)

[(0.312, u'http://www.fonttester.com/'),

(0.312, u'http://www.cssremix.com/'),

(0.266, u'http://www.logoorange.com/color/color-codes-chart.php'),

(0.254, u'http://yotophoto.com/'),

(0.254, u'http://www.wpdfd.com/editorial/basics/index.html')]


다 됐다! Del.icio.us에 추천 엔진을 성공적으로 추가했다. 여기서 할 수 있는 일이 훨씬 더 많다. del.icio.us은 태그별 검색을 지원하므로 서로 비슷한 태그를 찾아볼 수 있다. 여러분은 심지어 여러 개의 계정으로 같은 링크를 게시함으로써 "인기적인" 페이지를 조작하려는 사람들을 검색할 수도 있다.

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