Иная система рейтинга Live Street

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

В новой системе рейтинга отсутвуют минимальные значения влияния на силу и пользователь с 0 силой не может повлиять на силу других пользователей и голосовать за топики, что на мой взгляд кажется логичным. В связи с этим при регистрации всем пользователям присваивается определенная сила, в моем случае равная 1. Рейтинг нового пользователя равен 0 т.к. новый пользователь не может иметь авторитета в сообществе.

Основные формулы для расчета силы и рейтинга:
$iDeltaSkill=log($skill/3.85+1,10);
$iDeltaRating=log($rating+1,10)+log(log($skill/1.2+1,10)+1,10);
Коэффициенты подобраны из соображений, что на начальном этапе пользователь может передать десятую часть своей силы и рейтинга другому пользователю.
В зависимости от силы пользователя, влияние на силу другого пользователя выглядит следующим образом:
влияние на силу пользователя

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

При голосовании за топик и комментарий используются те же формулы, но влияние при голосовании за топик в 4 раза меньше чем за пользователя, а за комментарий — в 40 раз.
Кол-во голосов за топик считается по следующей формуле:
$iDeltaRating=round($iValue*log($skill*3+1,10)+0,12);
возможность плюсануть топоки появляется при силе около 0.5, при силе 10 пользователь отдает уже 2 голоса за топик и при силе около 100 — 3 голоса.

Для установки начальной силы необходимо изменить значение по-умолчанию на 1 в таблице prefix_user, поле user_skill. Для более точного расчеты силы и рейтинга в таблице prefix_user поля user_skill и user_rating удалить значение разрядности 9,3

Модуль рейтинга с описаными формулами можно скачать здесь.

68 комментариев

avatar
Интересное решение. Попробую в действии Ваш алгоритм.
avatar
Да, что-то в этом есть:) надо испытывать!
avatar

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

И потом, что это у вас с кодировкой случилось?
б�аЕаЙб�аИаНаГаАаМаИ аИ б�аИаЛаОаЙ

Вообще концепция конечно любопытная… да.
  • skif
  • 0
avatar
всем существующим пользоваьелям еужно прибавить единицу силы
update prefix_user set user_skill=user_skill+1
с кодировкой все нормально, кодировка файла utf-8 если у вас браузер не определяет
avatar
Поправьте, user_rating, такого поля user_karma — нет. А вообще, идея понравилась, буду тестировать.
avatar
Дорого вы себя оценили, однако. Ваши работы не стоят 1000 евро.
avatar
ты о чем))))
avatar
Прошу прощения, не туда :\
avatar
ой, кажется я не туда пишу :)
avatar

а как же эти?
`topic_rating` float(9,3) NOT NULL default '0.000',
`blog_rating` float(9,3) NOT NULL default '0.000',
`blog_limit_rating_topic` float(9,3) NOT NULL default '0.000',
`vote_delta` float(9,3) NOT NULL default '0.000',
тож удалять 9,3?
avatar
topic_rating — прибавляются целые числа и отображаются целые числа, если давать прибавлять значения меньше единицы, то в результате округления может ввести в заблуждение некоторых пользователей, когда рейтинг топика был 0.4999 и округлялся до 0, а в результате прибавления 0.01 рейтинг будет округляться до 1 и пользователь подумает что это он добавил 1 голос
blog_rating — да надо удалить, забыл написать и у себя не поменял
blog_limit_rating_topic — не знаю что это такое
vote_delta — там указываются только положительный голос или отрицательный, не знаю зачем у него тип float
avatar
ставлю силу 500, плюсую или минусую комментарий пользователя, его рейтинг и сила на месте
avatar
Обновил файл Rating.class.php там опечатка была в названии переменно, да и немного не та версия
avatar
Не согласен с такой системой, кто вам дал право затыкать пользователю рот?
avatar
И вообще я не понимаю как впредлагаете, стартапить свой проект с такой системой, сидеть самому и плюсовать и миносовать 100-500 пользователей? Увольте!
avatar
а с чего вы взяли что они не могут это делать самостоятельно?
avatar
С того что вы считаете что новый юзер не должен обладать все возможностями рейтинга
avatar
Приведите цитату где это написано.
При выполнении всех рекомендаций в данном топике, новый пользователь влияет на рейтинг и силу другого пользователя независимо от того за что он голосует, за топик или за комментарий.
avatar
Рейтинг нового пользователя равен 0 т.к. новый пользователь не может иметь авторитета в сообществе.
avatar
а разве в текущей системе при регистрации нового пользователя рейтинг отличен от 0?
avatar
меня интересует не цифра а фраза, цитирую «не может иметь авторитета в сообществе»
avatar
а если процитировать побольше? «новый пользователь не может иметь авторитета в сообществе»
но он всегда может его приобрести
если вы уж придираетесь к словам то читайте как «только что созданный пользователь»
avatar
на данный момент ему никто рот не затыкает, он может писать комментарии и создавать топики.
он даже может тыкать на плюс и минус, только его голос ничего не значит при 0 силе.
avatar
все это глупо для стартапа, он сразу загнеся на том что никто другу другу не сможет нормально накидать кармы и рейтинга
avatar
не согласна с вами, если бы вы вникли и потестировали вы бы всё поняли, так что проходите мимо :)
avatar
Есил вы бы вникнили то поняли что текущая система для развития своего проекта подходит как никогда лучше, а эта система только усугубит положения «начинающего» проекта, вот когда будет за 3к юзеров зарегено тогда имеет смысл её внедрять.
avatar
старт всегда трудный :) а раскачать можно было бы жилание, а если аж потом ее внедрять, то посетитель с новой системой рейтинга никогда не догонит поситетеля с кармой 800
avatar
новому пользователю проще подниматься в прокаченом сообществе нежели в новом. при том же кол-ве голосов он получит больше силы и рейтинга. так что на счет не догонит можно поспорить.
avatar
это понятно, вопрос в другом куда гнать картину и спешить?, кароче решайте сами, я для себя выводы сделала
avatar
Не хотелось бы повторяться, но всё же спрошу. Вот тут я писал про влияние времени на рейтинг. Обсуждения реализации там не получилось, может получиться тут? Давайте порассуждаем, как это вяжется с вашей системой, которая стати уже поставлена у нас на вооружение. За проработку отдельное спасибо.
avatar
чтоб реализовать возможность влияния времени на рейтинг необходимо постоянно пересчитывать этот самый рейтинг (например, раз в день). К данной системе это никак не вяжется, те не имеет к ней никакого отношения. Для возможности пересчета рейтинга нужно знать дату каждого голоса о чем я писал в одном из комментариев к топику про рейтинг. У себя я добавил к таблицам голосов поле времени и могу пересчитать рейтинг с любыми изменившимися условиями.
avatar
Угу. время знать нужно. А Вы конкретно зачем добавили? Как Вы будете увязывать время и рейтинг?
avatar
Я добавил для того чтобы делать пересчет, поскольку подбираю оптимальную для себя систему рейтинга. Для увязывания времени и рейтинга есть замечательная функция a/(x+a+1), где x — разница во времени. Если x измеряется в днях, то а должно быть порядка 200.
Вот только я не уверен, нужно ли завязывать рейтинг на время. Пока в раздумьях…
avatar
вот я тоже в раздумьях. Заминусованный, как и заплюсованный, должны иметь шанс придти к нулю(или к еденице в Вашем случае). Пользователь должен чётко знать возможность своего искупления.
avatar
я подумал и решил что принижать заслуги пользователя с течением времени нельзя. по-вашему получается что пользователь написавший несколько топиков и получивший за них плюсы, через некоторое время будет иметь такой же рейтинг как пользователь написавший 1 комментарий с плюсом. так вы убьете все желание пользователей что-либо писать.
avatar
Я не утверждал. Давайте рассуждать. Как сделать?

Вот возврат из минусов нужен? Нужен. А тогда обратное правило, из плюсов нужно? Нужно вроде. Вы сделали систему рейтингования, понятной. Давайте пойдем дальше. Может зафиксировать скажем СИЛУ и не фиксировать КАРМУ. Или как?

Что думаете, остальные?
avatar
Как сделать я написал, нужен пересчет по указанной формуле. Если есть необходимость — выложу скрипт для пересчета.
Пишите позитивные комментарии и будет вам возврат из минусов.
А насчет возврата из плюсов можно привести множество примеров что этого делать не стоит, например, вы говорите ветерану войны, что война была давно и то что вы в ней участвовали сейчас имеет гораздо меньшее значение.
avatar
Отлично! Нам остаётся ждать скрипта для перерасчёта текущих рейтингов и сыли (при дефолтовых настройках)?

Ваш файл в текущей редакции уже готов к замене дефолтового Rating.class.php?
avatar
да, просто замените свой
avatar
Какое затухание от давности вы хотите увидеть?
Для возможности пересчета у вас все голоса должны иметь дату когда этот голос был поставлен.
avatar
Не понял вопрос.
В данный момент у меня всё по умолчанию.
Для возможности пересчета у вас все голоса должны иметь дату когда этот голос был поставлен.
Если она в по дефолту ставится — значит дата имеется.
avatar
по-дефолту она не ставится. если у вас уже есть голоса в системе, то пересчитать не получится (значения рейтинга и силы изменятся неопределенным образом)
менять нужно в чистой системе
avatar
А что если в таблицу добавить столбец с датой скажем 2005\12\12 и потом запустить скрипт перерасчёта?
avatar
а смысл его таким добавлять? для пересчета нужно знать порядок всех голосов. Без временной отметки у вас сначала посчитаются голоса за комментарии, потом за топики, потом за пользователей или в другом порядке, зависит от реализации.
avatar
странно, если у нас сила 1 ставим + за комментарий то у человека карма 0,01 а сила на месте, но если у человека карма и сила по нулям и мы ставим минус за коммепнт всё стоит на месте! т.е. карма в минус не уходит
avatar
может что-то перепутали? по моей формуле при голосовании за комментарий рейтинг и сила изменяется на 0.0025
avatar
нет всё ваше, попробуйте проголосовать отрицательно за комментарий посетителя с кармой и силой ноль. Его карму в минус не будет сдвигать а значит он так может баловать до безконечности
зайдите в ICQ пожалуйста :)
avatar
оказалось недостаточно снять ограничня на точность только в бд, нужно еще в файлах
у себя изменил User.entity.class.php
public function getSkill($round=1) {
if($round) return number_format(round($this->_aData['user_skill'],2), 2, '.', '');
else return $this->_aData['user_skill'];
}
public function getRating($round=1) {
if($round) return number_format(round($this->_aData['user_rating'],2), 2, '.', '');
else return $this->_aData['user_rating'];
}
и User.mapper.class.php
public function Update
$oUser->getSkill(0),
$oUser->getRating(0),
avatar
добавьте это в пост) а вообще, спасибо огромное)
avatar
методом исключений и проведений тестов на компьютере выяснилось, что отматывает прекрасно назад и наматывает вперёд при комментировании, НО! Если на компьютере 2 проекта, даже если в конфиге разный кеш и разные базы или кеш и там и там выключен, появляються глюки а именно при голосовании за коммент, в БД не добавляе тинформацию а соответственно рейтинг пользователя не меняеться
что-то где-то конфликует, но где?
avatar
Ждём ещё баги и ответ разработчика.
avatar
это мои баги — используйте смело :)
avatar
Что-то дискуссия прекратилась… Можно без опасений ставить то, что в посте опубликовано или же это рисковано?

Будет ли подобная система расчета применена в новой версии движка по умолчанию?
avatar
у меня работает. не жалуюсь.
avatar
Спасибо, что отписался =) Я тоже себе все-таки сделал так, как в посте написано. А ты в файлах что-нибудь менял или только сам модуль и в БД?
avatar
еще поправил так как написано тут. Единственное, что у меня пользователи все также создаются с 0 силы и рейтинга. и дал пяти самым активным пользователям +5 к силе и рейтингу :)
avatar

Так, ну создаваться новые должны, судя по всему, с силой = 1 и рейтингом = 0. У меня так и происходит.
Ты точно изменил значение по-умолчанию на 1 в таблице prefix_user, поле user_skill? А вот для чего это я не понял и не делал. и меня смущает это:
$oUser->getSkill(0),
$oUser->getRating(0),
Может, потому они у вас и создаются с нулями?
avatar
нет, в моем случае как раз нужно силу и рейтинг 0 :)

>>А вот для чего это я не понял и не делал
Ну чуть выше вроде написано, для того, чтобы карма уходила в ноль при минусовании комментария
avatar

$oUserComment->setRating($oUserComment->getRating()+$iValue*$iDelta/на что хотите);

если хотим и силу в минус, то закоментим строку
// $iSkillNew=($iSkillNew<0)? 0: $iSkillNew;
avatar
интересно, при голосовании с минусовой силой как будет меняться рейтинг? :)
avatar
переделать пороги под силу и карму, и указать, например, что если у пользователя рейтинг -1 или сила 0 — > запретить
avatar
А что будет, если не делать этого? Как будет вести себя карма при минусовании?
avatar
а тяжело локально потестировать чтоли? :)
avatar
Да, надо дэнвер качать, ставить и т.п.
avatar
да, кстати. заметил небольшую странность. Я не знаю, так должно быть по умолчанию (в начальном конфиге) или это уже после модификации))
если рейтинг больше 15, то при голосовании за топик ставица уже 2 голоса)
avatar
или если сила больше 8. надо смотреть)
avatar
)) Лан, лучше откачусь к стандартной системе.
avatar

Я правильно понял, что нужно сделать следующее?…
classes\modules\user\entity\User.entity.class.php
найти
public function getSkill() {
        return number_format(round($this->_aData['user_skill'],2), 2, '.', '');
    }
Заменить на
public function getSkill($round=1) {
if($round) return number_format(round($this->_aData['user_skill'],2), 2, '.', '');
else return $this->_aData['user_skill'];
}
Далее найти
public function getSkill() {
        return number_format(round($this->_aData['user_skill'],2), 2, '.', '');
    }
Заменить на
public function getRating($round=1) {
if($round) return number_format(round($this->_aData['user_rating'],2), 2, '.', '');
else return $this->_aData['user_rating'];
}
А вот что в User.mapper.class.php надо — не понял
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.