Рекомендование предметов

Найти подходящего критика – это, конечно, неплохо, но в действительности-то я хочу, чтобы мне порекомендовали фильм. И прямо сейчас. Можно было бы посмотреть, какие фильмы понравились человеку с похожими на мои вкусами, и выбрать из них те, что я еще не смотрел. Но при таком подходе можно было бы случайно наткнуться на критиков, ничего не писавших о фильмах, которые могли бы мне понравиться. Можно также отобрать критика, которому почему-то понравился фильм, получивший отрицательные отзывы от всех остальных критиков, вошедших в список topMatches.

Чтобы разрешить эти проблемы, необходимо ранжировать сами фильмы, вычислив взвешенную сумму оценок критиков. Берем каждого из отобранных критиков и умножаем его оценку подобия со мной на оценку, которую он выставил каждому фильму. В табл. 2.2 показан результат вычислений.

Таблица 2.2. Создание рекомендаций для Тоби

В этой таблице приведены коэффициенты корреляции для каждого критика и оценки, поставленные ими трем фильмам («The Night Listener», «Lady in the Water» и «Just My Luck»), которые я сам не оценивал. В столбцах «П.x» находится произведение коэффициента подобия на оценку, выставленную критиком. Смысл в том, чтобы мнение критика с похожими на мои вкусами вносило больший вклад в общую оценку, чем мнение критика, не похожего на меня. В строке «Итого» приведены суммы вычисленных таким образом величин. Можно было бы использовать для ранжирования сами эти суммы, но тогда фильм, который просмотрело больше людей, получил бы преимущество. Чтобы исправить эту несправедливость, необходимо разделить

полученную величину на сумму коэффициентов подобия для всех критиков, которые рецензировали фильм (строка «S подоб.» в таблице) Поскольку фильм «The Night Listener» рецензировали все, величина «Итого» для него делится на сумму всех коэффициентов подобия. Напротив, фильм «Lady in the Water» критик Puig не рецензировал, следовательно, в этом случае величина «Итого» делится на сумму коэффициентов подобия всех критиков, кроме Puig. В последней строке показано частное от деления.

Код, реализующий этот алгоритм, абсолютно прямолинеен и может работать как с евклидовым расстоянием, так и с коэффициентом корреляции Пирсона. Добавьте его в файл recommendations.py:

#       Получить рекомендации для заданного человека, пользуясь взвешенным средним

#       оценок, данных всеми остальными пользователями

def getRecommendations(prefs,person,similarity=sim_pearson): totals={} simSums={} for other in prefs:

#       сравнивать меня с собой же не нужно if other==person: continue sim=similarity(prefs,person,other)

#       игнорировать нулевые и отрицательные оценки if sim<=0: continue

for item in prefs[other]:

#       оценивать только фильмы, которые я еще не смотрел

if item not in prefs[person] or prefs[person][item]==0:

# Коэффициент подобия * Оценка totals.setdefault(item,0) totals[item]+=prefs[other][item]*sim

# Сумма коэффициентов подобия simSums.setdefault(item,0) simSums[item]+=sim

#       Создать нормализованный список

rankings=[(total/simSums[item],item) for item,total in totals.items( )]

#       Вернуть отсортированный список rankings.sort( ) rankings.reverse( )

return rankings

Здесь мы в цикле обходим всех людей, присутствующих в словаре prefs. Для каждого вычисляется коэффициент подобия с заданным человеком person. Далее обходятся все фильмы, которым текущий критик выставил оценку. В строке, выделенной полужирным шрифтом, вычисляется окончательная оценка фильма – оценка, данная каждым критиком, умножается на коэффициент подобия этого критика и произведения суммируются. В самом конце оценки нормализуются путем деления на сумму коэффициентов подобия и возвращается отсортированный список результатов.

Теперь можно узнать, какие фильмы мне следует посмотреть в ближайшем будущем:

>>> reload(recommendations)

>>> recommendations.getRecommendations(recommendations.critics,’Toby’)

[(3.3477895267131013, ‘The Night Listener’), (2.8325499182641614, ‘Lady in the Water’), (2.5309807037655645, ‘Just My Luck’)] >>> recommendations.getRecommendations(recommendations.critics,’Toby’, … similarity=recommendations.sim_distance)

[(3.5002478401415877, ‘The Night Listener’), (2.7561242939959363, ‘Lady in the Water’), (2.4619884860743739, ‘Just My Luck’)]

Мы получили не только ранжированный список фильмов, но и прогноз оценок, которые я поставлю каждому из них. Имея такую информацию, я могу решить, стоит ли вообще смотреть фильм или лучше заняться каким-нибудь другим делом. В зависимости от приложения вы можете вообще не давать рекомендаций, если не нашлось ничего, отвечающего стандартам данного пользователя. Поэкспериментировав, вы обнаружите, что выбор метрики подобия влияет на результаты очень слабо.

Итак, построена полная система рекомендования, способная работать с товарами любого вида или со ссылками. Необходимо лишь заполнить словарь, поместив в него людей, предметы и оценки, а затем его можно использовать для рекомендования предметов любому пользователю.

Вы можете следить за любыми ответами на эту запись через 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