Тема: Similar news addon for Strawberry 1.1.1

Дополнение "Похожие новости" для Strawberry 1.1.1
v.1.0 similar-news_1_0.zip (1.54 kb)
v.1.1 (cmd edition) similar-news_1_1.zip (1.64 kb)

Описание:
Выводит $sn_number похожих новостей. Похожесть определяется максимальным количеством совпадающих тэгов (ключевых слов). Работает совместно с плагином keywords.

Довольно простой метод вывода "новостей по теме" для текущей новости описан в доках. Чем он плох? Да там же в доках все и написано: "Вы пишите новость, указываете кейворды "Путин", "А лох-то кто?" и "Киркоров". Все другие новости, которым присвоен кейворд "Киркоров" являются "по теме". Т.е. в "похожие" новости попадают все, у которых совпадает хотя бы один кейворд, а сортировка идет по дате. В общем релевантность таких новостей оставляет желать лучшего. Дополнение Similar News выводит список действительно похожих новостей, отсортированных сначала по максимальному количеству совпадающих ключевых слов, а затем по дате.

Использование:
1. Это дополнение, а не плагин, поэтому распаковываем содержимое архива непосредственно в директорию Strawberry (не в plugins!).
2. После вывода полной новости пишем нечто вроде:

echo '<hr><b>Новости по теме:</b><br />';
$sn_number = 5;
include_once rootpath.'/similar-news.php';

Changelog:
v.1.1:
* переписана функция, выполняющая запрос к базе данных (by cmd), в результате быстродействие увеличилось на 40%.

v.1.0:
первая версия Similar News.


Примечания:
1. Озабоченные вопросом производительности могут ознакомиться с результатами профайлинга для v.1.0 (для v.1.1 все еще быстрее).
2. Особо параноидальные обладатели high-load проектов, не обремененных использованием ЧПУ, могут закомментировать строку

echo '<a href="'.cute_get_link($news_by_repeat[$snc]).'">'.$news_by_repeat[$snc]['title'].'</a><br />'; // медленно, но верно

и раскомментировать следующую за ней.

Отредактировано Zomb1e (15 Sep 2011 23:46:05)

Post's attachments

similar-news_1_0.zip 1.54 kb, 23 downloads since 2011-09-15 

similar-news_1_1.zip 1.64 kb, 23 downloads since 2011-09-15 

борец за победу добра над разумом в кратчайшие сроки

Re: Similar news addon for Strawberry 1.1.1

Zomb1e, с одной стороны респект и уважуха за то, что сделал, с другой стороны я такое

foreach ($sql->select(array('table' => 'news')) as $row){
        if (in_array($tag_to_check, explode(',', $row['keywords']))){
            $news_w_tag[$tag_to_check][$row['id']] = array('title' => $row['title'], 'url' => $row['url']);
        }
    }

на серьезный проект не поставлю никогда.

Есть такая штука как IceStrawberry 1.04 b. Можете юзать на свой страх и риск... или слямзить что-то. Мне фиолетово.

Re: Similar news addon for Strawberry 1.1.1

А я ведь не просто так просил помощи с реализацией первого пункта алгоритма в этом топике. Честно говоря, мне этот кусок кода тоже очень не нравится, но пока я придумал только один вариант, как это реализовать по другому (да и то не совсем до конца).

Идея такая: разобрать $post['keywords'] и сформировать массив, содержащий все возможные последовательности полученных кейвордов. Примерно так:

$tmp_tags = explode(',', $post['keywords']);
$count_tags = count($tmp_tags);
$all_tags = array(); // массив всех возможных последовательностей кейвордов
for ($ti=0; $ti<$count_tags; $ti++) {
    $ati = $ti+1;
    for (; $ati<$count_tags; $ati++) {
        $all_tags[] = $tmp_tags[$ti].','.$tmp_tags[$ati];
    }
}

А вот как дальше написать запрос с where, и писать все одним запросом или их кол-во должно быть count($all_tags) - я не знаю. Если есть идеи - напиши плиз.

борец за победу добра над разумом в кратчайшие сроки

Re: Similar news addon for Strawberry 1.1.1

Это брацы мне по силе, откажусь теперь едва ли

function news_by_keyword($tag_to_check){
global $sql, $post; // edit by cmd

$key_where = '['.str_replace(',', '|', $post['keywords']).']'; // add by cmd
    
$news_w_tag = array(); // возвращаемый массив с выборкой по заданному тэгу
//  if ($_GET['id'])
    
    foreach ($sql->select(array('table' => 'news', 'where' => array('keywords ? '. $key_where))) as $row){ // edit by cmd
        if (in_array($tag_to_check, explode(',', $row['keywords']))){
            $news_w_tag[$tag_to_check][$row['id']] = array('title' => $row['title'], 'url' => $row['url']);
        }
    }
    return $news_w_tag;
}

Проверил. Работает.

Есть такая штука как IceStrawberry 1.04 b. Можете юзать на свой страх и риск... или слямзить что-то. Мне фиолетово.

Re: Similar news addon for Strawberry 1.1.1

cmd, отлично! Спасибо! Оперативно запилил версию 1.1.
А вот как изменилось время выполнения запроса к БД (в базе 300 новостей):
v.1.0: 0.01165 c.
v.1.1: 0.00671 c.

борец за победу добра над разумом в кратчайшие сроки

Re: Similar news addon for Strawberry 1.1.1

Strawberry 1.1.1

Спасибо за плугин, очень давно о таком думал. Поставили, выводится, но есть одно НО.

Все ссылки вида http://www.top.ua/top.html, не вида http://www.top.ua/news/top.html.

Т.е. исчезают из адреса промежуточные категории. С cute_get_link в functions.inc.php вроде-бы всё как нужно ?

Re: Similar news addon for Strawberry 1.1.1

olafsen пишет:

Поставили, выводится, но есть одно НО.
Все ссылки вида http://www.top.ua/top.html, не вида http://www.top.ua/news/top.html.
Т.е. исчезают из адреса промежуточные категории.

У меня нет ЧПУ, поэтому с ними не тестировал sad
Для вывода промежуточных категорий как мне кажется нужно расширить выборку из таблицы news, добавив туда category.
Попробуй строку 26 заменить на

$news_w_tag[$tag_to_check][$row['id']] = array('title' => $row['title'], 'url' => $row['url'], 'category' => $row['category']);

после строки 57 добавить

$news_by_repeat[$key]['category'] = $value['category'];

Отпишись о результатах.

борец за победу добра над разумом в кратчайшие сроки

Re: Similar news addon for Strawberry 1.1.1

Zomb1e

Ничего не изменилось, ссылки как были вида www.top.ua/top.html , так и остались. sad

Re: Similar news addon for Strawberry 1.1.1

Есть какие нибудь подвижки в плане прикручивания корректных урлов к данному модулю?

Re: Similar news addon for Strawberry 1.1.1

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

борец за победу добра над разумом в кратчайшие сроки

Re: Similar news addon for Strawberry 1.1.1

Я думаю надо добавить $массив[date]. Почему? Потому что в функции cute_get_link() есть такой кусок:

if (!$arr['date']){ # если в массиве нет date (атрибут новости), то $arr['category'] принимает id
        $arr['category'] = $arr['id'];
    }

Это я пальцем в небо - сам даже не проверял с ЧПУ ни разу.

56 минут и 43 секунды спустя:

Можно для эксперимента просто закомментировать приведенный выше код и посмотреть что получится. Вот только оставлять его закомментированным навсегда не желательно - другие url-ы могут посыпаться.

Есть такая штука как IceStrawberry 1.04 b. Можете юзать на свой страх и риск... или слямзить что-то. Мне фиолетово.