이 섹션은 가장 인기 있는 온라인 북마크 사이트 중 하나에서 데이터를 검색하는 방법과 이 데이터를 사용하여 유사한 사용자를 찾고 이전에 보지 못한 링크를 추천하는 방법을 보여준다. 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은 태그별 검색을 지원하므로 서로 비슷한 태그를 찾아볼 수 있다. 여러분은 심지어 여러 개의 계정으로 같은 링크를 게시함으로써 "인기적인" 페이지를 조작하려는 사람들을 검색할 수도 있다.