CMS Eleanor - Поиск
Полная версия этой страницы: Официальный форум Eleanor CMS » Нужно создать оптимальный алгоритм
Официальный форум Eleanor CMS » Поддержка пользователей системы Eleanor CMS » Секреты и советы
Atix
возможно есть орфографические ошибки, забейте, я торопился.

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

Предыстория:
В данный момент на больничном, суть не очень важна, но срок больничного почти 2 месяца, времени появилось много, сутками без сна сидел за компом, ковырялся в разных тематиках, то и се смотрел, вчера устал сильно, спать не охота, а от компа тошнит, решил посмотреть фильм, набрал в поиске что посмотреть, везде хрен знает что пишут, толком не смог определиться и лег спать, пока засыпал, в связи с этим придумал такую штуку для эльки, назовем эту штуку двояка "Индекс Внимания-Полезности-Важности" о как, даже трояка, сократим пусть будет "Индекс ВПВ" по трем первым буквам желаемого результата. Этот индекс будет представлять из себя число в низу каждой новости, типа рейтинга на хабре, но создаваться он будет не за счет прямого влияния людей (плюсы или минусы ставить), а автоматически основываясь на 4 аргументах.. Концепция схожа чем то с таргетингом у рекламы яндекса, собираем, суммируем, делаем выводы, выводим результат. Ну это я конечно в грубой форме, у нас не то количество аргументов и не та польза.


Для вывода "Индекс ВПВ", у нас есть 3 аргумента, есть еще 4 но работать с датами я не умею по этому его в щет не берем,(если поможите, то и его добавим, он кстати будет супер полезен) благодаря этим аргументам мы и будем создавать наш "Индекс ВПВ" контента, формироваться он должен исходя из наших аргументов, при чем сам, автоматически, что собственно и будет, не каких баз данных и мега супер пупер скриптов, одна простая математика и калькулятор, реализацию я уже придумал, единственное что мы не сможем делать, это манипулировать этим индексом, или можем (я в php нуб) точно не скажу.

Аргументы у нас будут с весом, это нужно для вывода конечного результата, вес это значение аргумента по отношению к другим, чем жирнее вес аргумента, тем больше его % влияет на обще значению.


1 аргументПросмотры новости - их обычно много, по этому они будут нести легкий вес.
2 аргумент Коментарии - обычно, что бы написать комментарий нужно приложить усилие, да и повод написать что то тоже должен быть и зависит от важности или от качество контента.
3 аргумент Рейтинг от голосования - ну нажать на рейт бар не сложно, возьмем за среднию тяжесть
4 аргумент Дата публикации до реального времени это аргумент составляет роль регулирующего органа для компенсации быстрого роста значения, а значит веса аргумента с малым весом. Все позже объясню конкретней.

Тупой пример алгоритма для объяснения принципа

((1 аргумент(легкий вес)=10 просмотрам новости) / на 100 к примеру) =0.1
((2 аргумент(большой вес)=5 коментариям) / на 30 к примеру) =0,1666666666666667
((3 аргумент(средний вес)=7 оценка рейтинга / на 56 к примеру = 0,125

теперь все это плюсуем

1 аргумент+2 аргумент+3 аргумент=1.285 (сумма 3 аргументов)

4 аргумент(дата публикации)= реальное время(2013 07 2 6 ) - (2013 07 2 4 )дата публикации

4 аргумент=2 (разница во времени)

теперь создаем принцип старения, а в итоге уменьшаем "Индекс ВПВ" за счет прошедшего времени.

1.285 (сумма 3 аргументов) / делим на 2 (разница во времени) = 0,6425 наш "Индекс ВПВ"

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



php реализация, с датами работать не могу, по этой причине без старения,

в файле templates/Uniel/Classes/UserNews.php

есть вывод новости, я просто добавил его туда, от стандартного немного отличается, я внес свои изменения

вот что добавил 'indexvpv'=>'<div class="indexvpv" title="Индекс ВПВ, рассчитывается очень мудрено.">'.$indexvpv=(Strings::CutindexStr($totalindex=(($v['reads']/468)+$v['comments']+$v['r_total']),4)).'</div>',

Strings::CutindexStr у меня другой, точки мешали, клонировал функцию без точек. (...)

выделил куда поставил

$T->$tpl(array(
                'top'=>array(
                #    'published'=>sprintf(static::$lang['noleng'],Eleanor::$Language->Date($v['date'],'fdt')),
                'category'=>isset($data['cats'][$v['_cat']]) ? sprintf(static::$lang['noleng'],'<a href="'.$data['cats'][$v['_cat']]['_a'].'">'.$data['cats'][$v['_cat']]['t'].'</a>') : false,
                #    'comments'=>$lc($v['comments'],'<a href="'.$v['_url'].'#comments">'.$v['comments'].'</a>'),
                #    'author'=>'<div class="avtor">'.sprintf(static::$lang['noleng'],$v['author_id'] ? '<a href="'.Eleanor::$Login->UserLink($v['author'],$v['author_id']).'" rel="author">'.$v['author'].'</a>' : $v['author']).'</div>',
                ),
                'bottom'=>array(

                    'author'=>'<div class="author" title="Автор публикации">'.sprintf(static::$lang['noleng'],$v['author_id'] ? '<a href="'.Eleanor::$Login->UserLink($v['author'],$v['author_id']).'" rel="author">'.$v['author'].'</a>' : $v['author']).'</div>',
'published'=>'<div class="date" title="Дата публикации">'.sprintf(static::$lang['noleng'],Eleanor::$Language->Date($v['date'],'fdt')).'</div>',
#'reads'=>'<div class="viev">'.sprintf(static::$lang['noleng'],$v['reads']).'</div>',
'comments'=>'<div class="comments" title="Комментарии">'.sprintf(static::$lang['noleng'],'<a href="'.$v['_url'].'#comments">'.$v['comments'].'</a>').'</div>',
'yoindex'=>'<div class="indexvpv" title="Индекс ВПВ, расчитывается очень мудрено.">'.$indexvpv=(Strings::CutindexStr($totalindex=(($v['reads']/468)+$v['comments']+$v['r_total']),4)).'</div>',
#'readmore'=>$v['_readmore'] ? '<a href="'.$v['_url'].'#more">'.static::$lang['readmore'].'</a>' : false,
#'readmore'=>$v['_readmore'] ? '<a href="'.$v['_url'].'#more">'.static::$lang['readmore'].'</a>' : false,
                 #'voting'=>'<div class="voting">'.$v['voting'] ? ' <a href="'.$v['_url'].'#voting">'.static::$lang['voting'].'</a>' : false.'</div>',
                    #'status'=>$status,
                    'rating'=>Eleanor::$vars['publ_rating'] ? static::Rating($k,$v['_canrate'],$v['r_total'],$v['r_average'],0,$marks,false) : false,
                    #'edit'=>$v['_aedit'] ? Eleanor::$Template->EditDelete($v['_aedit'],$v['_adel']) : false,
                ),
                'title'=>$v['_readmore'] ? '<a href="'.$v['_url'].'">'.$v['title'].'</a>'.($v['_hastext'] ? ' <a href="#" data-id="'.$k.'" data-more="#more-'.$k.'" class="getmore"></a>' : '') : $v['title'],
                'text'=>Strings::CutStr($v['announcement'],150).($v['_hastext'] ? '<div id="more-'.$k.'" style="display:none"></div>' : '').($ntags ? '<div class="tags">'.sprintf(static::$lang['tags_'],rtrim($ntags,', ')).'</div>' : ''),
            ));
    

итог

http://floomby.ru/s2/KYN6tT

Надеюсь все внятно объяснил, теперь прошу помощи для формирования оптимального алгоритма и php решения для старения, я не знаю как дату перевести в целое число, искал пару примеров, но мне сервер все время 70 год показывает, с синтаксисом php мало знаком, да и не нужен он мне больно, я и без него на хлеб с маслом зарабатываю.

Оптимальный алгоритм, это числа на что делить, при каком условии, как делить или умножать, что бы в итоге получалось оптимальное вычисление с учетом всех факторов.


Спасибо за внимание.
Atix
Ребята, написал значения условно, все кроме веса аргументов, но мое мнение может быть ошибочным, статистики за длительное время нет, аргументировать нечем. Что качается старения, то есть уменьшение этого индекса от длительности размещения на сайте, могу объяснить вот чем, например разместили статью с офигенным архиватором, все его качают, восхваляют в комментах, тут проходит время, новая новость с еще более классным архиватором, не можем позволить старому затмить нового своим авторитетом, по этому отживаем старением часть индекса. Все это конечно условно, требуется правильная, вернее сказать оптимальная математическая конструкция с повсеместной реорганизацией индекса, даже можно добавить отключение индекса или смены статуса на отжил за счет временного периода, например занял почетное место с выше средним индексом после 120 дней со дня публикации. Да вообще много чего еще можно придумать, было бы желание. Так что помогайте, сам не математик, больше рас...й)
Alexander
Мне понравилась идея. Надо будет в каком-нибудь видеть её реализовать. Единственное, что я пока не очень понял, так это где её реально применять? При сортировке? - окей, но новости же вроде как должны сортироваться по дате добавления.

Также нужно разработать механизм хранения этого ПВП индекса в базе. Неразумно каждый раз с определенным интервалом (ежедневно, еженедельно) пересчитывать этот ПВП индекс для всех новостей: слишком много ресурсов на это уйдет.

Касаемо кода. Чтобы узнать разницу между двумя датами в днях, нужно воспользоваться кодом:
$diff=(strtotime($date1)-strtotime($date2))/86400;

TO_DAYS(`date1`)-TO_DAYS(`date2`)


Цитата (Atix @ 2024-10-13 19:19)
Что качается старения, то есть уменьшение этого индекса от длительности размещения на сайте, могу объяснить вот чем, например разместили статью с офигенным архиватором, все его качают, восхваляют в комментах, тут проходит время, новая новость с еще более классным архиватором, не можем позволить старому затмить нового своим авторитетом, по этому отживаем старением часть индекса.

Это все конечно хорошо, но представим картину, когда архиваторы выходят с периодичностью раз в год. Допустим, старый архиватор уже набрал дофига комментариев, рейтинга и просмотров. У нового же архиватора эти показатели по нулям. При текущем алгоритме, старый обязательно будет отображаться выше нового. Поэтому нужны какие-то дополнительные факторы.
A1es
Продвинутый рейтинг! Лайк! :yes4:
leshij
Цитата (Alexander @ 2024-10-13 19:19)
Это все конечно хорошо, но представим картину, когда архиваторы выходят с периодичностью раз в год. Допустим, старый архиватор уже набрал дофига комментариев, рейтинга и просмотров. У нового же архиватора эти показатели по нулям. При текущем алгоритме, старый обязательно будет отображаться выше нового. Поэтому нужны какие-то дополнительные факторы.
Для этого можно сделать похожие новости, при открытие новости архиватора человек будет видеть что на сайте есть и другие его версии
alexben73
Можно новому архиватору т.е улучшенной и новой копии отдавать вес или ее часть веса (что будет правильнее), при условии, что новый архиватор действительно явл. улучшеной копией(не альтернатива), а прошлый ссылается.
Рейтинг ревалентности новостей на основе внутренних показателей. Я бы так назвал.
Естественно подмечу, что внешние факторы будут косвенно влиять на внутренние показатели.
Alexander
alexben73, а предложите схему, как можно отдать часть веса новому архиватору.
A1es
Цитата (Alexander @ 2013-08-11, 18:33)
alexben73, а предложите схему, как можно отдать часть веса новому архиватору.

В админке сделать галочку приоритет :)
termit
Цитата (Alexander @ 2024-10-13 19:19)
alexben73, а предложите схему, как можно отдать часть веса новому архиватору.
При создании контента указывать "ролевантного родителя", и плюсовать например 50% от него

П.С. Идея классная, это всё можно поцепить на крон, и раз в сутки пусть юзается =)
Также, можно проходиться по тегам, и связывать похожие елементы, это тоже по крону, имхо нагрузка не малая.
Loader
Цитата (Atix @ 2024-10-13 19:19)
решил посмотреть фильм, набрал в поиске что посмотреть, везде хрен знает что пишут, толком не смог определиться и лег спать

Так надо было зайти на http://pda-kino.net/ , там сразу на главной для таких случаев фильмы вывешаны. И кстати есть сортировка по популярности! :rolleyes:
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.