В завершении, мы переходим к сценарию recommend.php, который реализует рекомендацию ссылок.
Существует множество различных способов выработки рекомендаций. Мы решили применить принцип "сходства образа мышление". Другими словами, выполняется поиск остальных пользователей, у которых хотя бы одна закладка совпадает с закладкой данного пользователя. Предполагается, что их остальные закладки также могут представлять интерес для пользователя.
Простейший метод реализации этого подхода в SQL-запросе связан с использованием подзапросов. Первый подзапрос выглядит следующим образом:
select distinct(b2.username)
from bookmark b1, bookmark b2
where b1.username='$valid_user'
and b1.username != b2.username
and b1.bm_URL = b2.bm_URL
В этом запросе используется псевдонимы для соединения таблицы bookmark базы данных с собой же — странная, но иногда полезная концепция. Предположим, что действительно существуют две таблицы закладок — b1 и b2. В таблице b1 выбираются данные по закладкам текущего пользователя. В другой таблице просматриваются закладки всех остальных пользователей. Выполняется поиск других пользоватетелей (b2.username), имеющих закладку (то есть URL-адрес), совпадающий с закладкой текущего пользователя ( b1.bm_URL = b2.bm_URL). Их имена не должны совпадать с именем текущего пользователя (b1.username != b2.username).
Этот запрос выдает список пользователей, интересы которых совпадают с интересами текущего пользователя. Воспользовавшись полученным списком, можно выполнить поиск всех остальных закладок пользователей, представленных в списке, с помощью следующего внешнего запроса:
select bm_URL
from bookmark
where username in
(select distinct(b2.username)
from bookmark b1, bookmark b2
where b1.username='$valid_user'
and b1.username != b2.username
and b1.bm_URL = b2.bm_URL)
Второй подзапрос служит для фильтрации закладок текущего пользователя. Если пользователь уже имеет какую-то закладку, не имеет смысла рекомендовать ему ее еще раз. Наконец переменная $popularity добавляет некоторый элемент фильтрации — не следует рекомендовать "слишком персональные" закладки. Выбираются лишь те URL-адреса, которые сохранены определенным числом других пользователей. В конечном итоге запрос приобретает следующий вид:
select bm_URL
from bookmark
where username in
(select distinct(b2.username)
from bookmark b1, bookmark b2
where b1.username='$valid_user'
and b1.username != b2.username
and b1.bm_URL = b2.bm_URL)
and bm_URL not in
(select bm_URL
from bookmark
where username='$valid_user')
group by bm_url
having count(bm_url)>$popularity
Если ожидается регистрация в системе большого количества посетителей, можно увеличить значение переменной $popularity, тем самым рекомендуя лишь такие URL-адреса, которые были сохранены большим числом пользователей. Эти адреса должны оказаться наиболее интересными и отвечать более широкому спектру интересов по сравнению с обычными веб-страницами.
recommend.php — предлагает пользователю ссылки, которые могут заинтересовать пользователя
<?php
require_once('bookmark_fns.php');
session_start();
$title = "Рекомендация URL-адресов";
$description = "Рекомендация URL-адресов ";
$keywords = "рекомендация url-адресов ";
do_html_header($title, $description, $keywords);
blok_left();
echo'<div id="blok_right">';
echo '<div class="blok_text">';
echo'<div class="text_top" align=left>';
do_html_heading($title);
try
{
check_valid_user();
$urls = recommend_urls($_SESSION['valid_user']);
display_recommended_urls($urls);
}
catch(Exception $e)
{
echo $e->getMessage();
}
display_user_menu();
echo '</div></div></div>';
do_html_footer();
?>
Функция recommend_urls() из библиотеки urljfns.php — этот сценарий вырабатывает рекомендации
function recommend_urls($valid_user, $popularity = 1)
{
// Мы попытаемся обеспечить для пользователей выдачу *полуинтеллектуальных*
// рекомендаций. Если пользователи имеют URL-адрес, совпадающий с закладками
// других пользователей, их могут заинтересовать и прочие URL-адреса,
// которые имеют другие пользователи
$conn = db_connect();
// Найти других пользователей, закладки которых
// совпадают с закладкой текущего пользователя.
// В качестве простейшего способа исключения из рассмотрения
// приватных страниц посетителей, а также для более совершенной
// рекомендации мы устанавливаем минимальный уровень популярности.
// Если $popularity = 1, могут рекомендоваться лишь
// адреса, сохраненные более чем одним пользователем
$query = "select bm_URL
from bookmark
where username in
(select distinct(b2.username)
from bookmark b1, bookmark b2
where b1.username='$valid_user'
and b1.username != b2.username
and b1.bm_URL = b2.bm_URL)
and bm_URL not in
(select bm_URL
from bookmark
where username='$valid_user')
group by bm_url
having count(bm_url)>$popularity";
if (!($result = $conn->query($query)))
throw new Exception('Не удается найти закладки для рекомендации.');
if ($result->num_rows==0)
throw new Exception('Не удается найти закладки для рекомендации.');
$urls = array();
// Сформировать массив подходящих URL-адресов
for ($count=0; $row = $result->fetch_object(); $count++)
{
$urls[$count] = $row->bm_URL;
}
return $urls;
}
Пример вывода сценария recommend.php показан на рисунке.
Возможные расширения сайта закладок
Мы рассмотрели базовые функциональные возможности веб-приложения ABCMemori. Ниже представлен список возможных расширений.
- Группирование закладок по темам.
- Реализация в функции выдачи рекомендаций ссылки Добавить это к моим закладкам.
- Выдача рекомендаций, основанных на наиболее популярных URL-адресах в базе данных либо на определенной теме.
- Интерфейс для администрирования пользователей и тем.
- Методы повышения "интеллектуальности" либо быстродействия закладок.
- Дополнительная проверка вводимой пользователемя информации на предмет ошибок.
Комментарии(0)
Для добавления комментариев надо войти в систему и авторизоватьсяКомментирование статей доступно только для зарегистрированных пользователей:Зарегистрироваться