Построение рекомендателя ссылок с помощью API сайта del.icio.us

В этом разделе я покажу, как запрашивать данные с одного из наиболее популярных сайтов онлайновых закладок и как с их помощью находить похожих пользователей и рекомендовать ссылки, которых они раньше не видели. Сайт http://del.icio.us позволяет пользователю создать учетную запись и сохранять интересующие его ссылки. Зайдя на этот сайт, вы можете посмотреть, какие ссылки сохранили другие люди, а также найти «популярные» ссылки, сохраненные многими пользователями. На рис. 2.6 показана одна из страниц сайта del.icio.us.

Рис. 2.6. Страница сайта del.icio.us,

содержащая популярные ссылки на тему программирования

В отличие от некоторых других сайтов обмена ссылками, del.icio.us (в настоящее время) не позволяет искать похожих людей и не рекомендует ссылки, которые могли бы вам понравиться.

API сайта del.icio.us

Сайт del.icio.us предоставляет API для доступа к данным, которые возвращаются в формате XML. Чтобы упростить вам жизнь еще больше, имеется обертка этого API на языке Python в виде библиотеки, которую можно скачать со страницы http://code.google.com/p/pydelicious/ source или http://oreilly.com/catalog/9780596529321. Для работы с примером из этого раздела загрузите последнюю версию этой библиотеки и поместите ее в папку, где интерпретатор Python ищет библиотеки (подробнее об установке этой библиотеки см. приложение А).

В библиотеке есть несколько простых функций для получения ссылок, сохраненных пользователями. Например, чтобы получить последний список популярных ссылок на тему программирования, следует вызвать функцию get_popular: >> 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’}, …и т. д. …

Как видите, возвращается список словарей, каждый из которых содержит URL, описание и имя пользователя, который разместил ссылку. Поскольку мы работаем с живыми данными, полученные вами результаты могут отличаться от приведенных в книге. Есть еще две полезные функции: get_urlposts возвращает все хранящиеся ссылки на данный URL, а get_userposts – все ссылки, сохраненные данным пользователем. Данные возвращаются в том же формате, что и выше.

Построение набора данных

Загрузить все данные о ссылках с сайта del.icio.us невозможно, поэтому придется ограничиться каким-то подмножеством. Вы можете выбрать его как угодно, но, чтобы получить интересные результаты, нам хотелось бы найти людей, которые часто сохраняют ссылки, и тех, чьи наборы ссылок похожи.

Для этого можно, например, запросить список пользователей, которые недавно сохранили популярную ссылку с конкретным признаком. Создайте файл deliciousrec.py и введите в него такой код:

from pydelicious import get_popular,get_userposts,get_urlposts

def initializeUserDict(tag,count=5): user_dict={}

#       получить подсчет самых популярных ссылок for p1 in get_popular(tag=tag)[0:count]:

# найти всех пользователей, сохранивших эту ссылку for p2 in get_urlposts(p1[‘href’]): user=p2[‘user’] user_dict[user]={} return user_dict

В результате мы получаем словарь, содержащий нескольких пользователей; каждый из них ссылается на пустой словарь, который предстоит заполнить ссылками. API возвращает только 30 человек, сохранивших ссылку последними, поэтому мы запрашиваем списки пользователей для пяти разных ссылок, чтобы набор данных получился более представительным.

В отличие от примера с кинокритиками, в данном случае есть всего две возможные оценки: 0, если пользователь не сохранял ссылку, и 1 – если сохранял. С помощью API мы теперь готовы написать функцию, которая вычислит оценки для всех пользователей. Добавьте следующий код в файл deliciousrec.py:

def fillItems(user_dict): all_items={}

#       Найти ссылки, сохраненные всеми пользователями for user in user_dict:

for i in range(3): try:

posts=get_userposts(user) break except:

print "Ошибка для пользователя "+user+", пробую еще раз" time.sleep(4) for post in posts: url=post[‘href’] user_dict[user][url]=1.0 all_items[url]=1

#       Вместо отсутствующих элементов записать 0 for ratings in user_dict.values( ):

for item in all_items: if item not in ratings: ratings[item]=0.0

Этой функцией можно воспользоваться для построения набора данных, аналогичного словарю critics:

>> from deliciousrec import * >> delusers=initializeUserDict(‘programming’)

>> delusers [‘tsegaran’]={} # Добавьте в словарь себя, если пользуетесь сайтом delicious

>> fillItems(delusers)

В третьей строке в список добавляется пользователь tsegaran. Можете вместо него указать собственный идентификатор, если вы зарегистрированы на сайте del.icio.us.

Обращение к функции fillItems может занять некоторое время, поскольку сайту посылается несколько сотен запросов. Иногда API перестает обрабатывать запросы, если они посылаются слишком быстро. В таком случае программа приостанавливается и пытается еще раз получить информацию о том же пользователе (но делает не более трех попыток).

Рекомендование соседей и ссылок

Построив набор данных, мы можем применить к нему те же функции, что и к набору данных о кинокритиках. Чтобы выбрать пользователя наугад и найти других пользователей с похожими вкусами, введите следующие команды: >> 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. Она возвращает упорядоченный список всех ссылок, поэтому лучше ограничиться первыми десятью:

>> 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 поддерживает поиск по признакам (в его терминологии – тегам (tag)), можно поискать похожие признаки. Можно даже поискать людей, которые пытаются манипулировать страницами «популярных ссылок», сохраняя одни и те же ссылки под разными учетными записями.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100