Как генерить список интересных тем?

Vitaly

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

Алгоритм не очевидный, так как если просто брать количество просмотров, то “выше всех” окажутся только очень старые темы, которые за год-другой явно смотрели больше чем свежие.

Кто может формулу сбацать? Желательно без абстрактный принципов, я их и так знаю, не стал бы спрашивать.

PS. Да, понятно, что потом все равно вручную отсеивать. Но хочется какое-то подспорье, чтобы не весь форум вручную перетряхивать.

BALAL

Отношение Количество просмотров на время… 😒

hinkar

(колво ответов+колво просмотров)/время
хотя можно и колво ответов/колво просмотров

Под временем подразумеваю разницу между текущей и датой создания

Vitaly

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

Я ж не заради потрепаться спрашиваю. Хочу что-нибудь готовое, что можно в скипт подставить, и что выдаст вменяемый результат. Вот передт тем как написать сюда, задайте себе контрольный вопрос: “а можно ли это подставить в программу?”.

Добавлено

To hinkar:

Просмотры с ответами точно складывать смысла маловато, так как величины разных порядков (по-моему). И еще, когда указываете неочевидные велечины типа “время”, не пожалейте сил объяснить, что за время и как его вычислять.

И еще никто не предложил отсекать по датам (не знаю точно каким), хотя с виду напрашивается. Буду ждать следующих предложений 😃

toxa

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

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

Vitaly

Повторяю третий раз, не надо ничего объяснять, я догадаюсь. Пишите сразу формулу. С конкретными коэффициентами.

Сергеич

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

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

R= (A1*UserName1+A2*UserName2+…A(n)*UserName(n))\n, где

R - рейтинг темы
A(n) - вес пользователя,
n - число пользователей в теме.

Фсё.

Vitaly

Осталась мелочь. Как автоматически расчитывать этот хитрый коэффициент? Если вручную, дык наверное проще тогда сразу вручную темы перебирать.

Ну и кроме того, тут даты нигде не учитываются. Будут стары темы только всплывать, а это не очень интересно. Хочется, чтобы свежие были.

Сергеич
Vitaly:

Осталась мелочь. Как автоматически расчитывать этот хитрый коэффициент? Если вручную, дык наверное проще тогда сразу вручную темы перебирать.

Ну и кроме того, тут даты нигде не учитываются. Будут стары темы только всплывать, а это не очень интересно. Хочется, чтобы свежие были.

Я, конечно, могу тебе предложить формулу расчёта, но она уж больно эмпирична и реальности, скорее всего, не отразит. Поэтому либо проставлять коэффициенты на всех вручную, либо я не знаю. Еще вариант - выбрать наиболее активных и толковых человек 30-40, и отсеивать темы по процентному содержанию постов этих людей в данной теме.

По датам всё просто. Ставь запрет на рейтинг тем возрастом больше, чем период выхода дайджеста.

Vitaly

Ну с ограничением по времени я примерно так и думал.

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

Пиши другую формулу, думать будем.

Сергеич

Кажется, ты не совсем так понял. Я имел в виду, что надо создать некий список, зараннее и однократно сформированый, из активных и толковых пользователей. Например, Графа туда вставить, Володю Василькова и так далее. Следует формула:

R=(P(UserName1)+P(UserName2)+…+P(UserNameN))\P(all), где

R - рейтинг
Р - число постов данного юзера
N - число юзеров из списка, участвующих в теме
P(all) - число постов в теме

Список можешь обновлять там, скажем, раз в квартал. Просто добавлять туда появившихся интересных ребят. Кажется, это не проблема.

ЗЫ. Вообще, я слабо себе представляю возможности твоего скрипта, поэтому не могу что-то предметно посоветовать. Давай в асю дальше, что ли.

romychs

Может просто,
K=Pi/P+k*(Vi-n)/V
Pi - число постов за неделю в данной теме, P - общее число постов за неделю на форуме, Vi - число просмотров темы за неделю, V - общее число просмотров тем форума. n - число уникальных пользователей за неделю. (Vi-n) должно быть >=0. Таким образом можно отсеить темы с интересным заголовком и неинтересным содержанием (заглянули один раз и забыли).
k - можно изначально взять заведомо маленьким (0.2, скажем), на столько ли важно вообще это количество просмотров?

Vitaly

To Сергеич

Понятно. Рациональное зерно бесулловно есть, я о чем-то похожем думал.

проблемы:

  • можно пропустить что-нибудь суперновое, где ни один из “аксакалов” не отметился, потому что не интересно или не в курсе
  • не уверен, что количество постов есть показатель ума. Показатель активности, “долгожительства” на форуме, но это не кореллирует с интересностью темы. Иначе мы темы Wit-а про турбины будем видесь в самом хвосте, только потому что он появился недавно.
  • вычислительная сложность так себе, хотя это конечно больше замечание, чем минус.

To romychs

Говорил уже, количество просмотров повязано не на интересность темы, а на количество постов и время жизни темы. Поэтому не вижу смысла наворачивать формулы одновременным использованием количества постов и количества просмотров.

Taboo

R=P(User1)*K(User1)/Tp(User1)+P(User2)*K(User2)/Tp(User2)+ … +P(UserN)*K(UserN)/Tp(UserN), где

R - рейтинг,
Р - общее число постов текущего юзера,
K - вес юзера. Можно задать К поумолчанию =1, и только для отдельных юзеров сделать табличку. К может быть, как больше 1, так и меньше.
Tp - время поста в днях + 1, в двухднях +1, в неделях +1. Надо пробовать.

vovic

Если рейтинг юзера брать по логарифмической шкале и темы оценивать не как средне-взвешенное, а как средне-квадратичное взвешенное, то… можно уже дисер писать. 😛

На самом деле к вопросу лучше с другой стороны подходить. К примеру, как на anekdot.ru верхняя десятка формируется. Вот это будет репрезентативно!
Но для этого скрипт надо подправлять. 😕

toxa
vovic

На самом деле к вопросу лучше с другой стороны подходить. К примеру, как на anekdot.ru верхняя десятка формируется. Вот это будет репрезентативно!

Не получится. Там каждый анекдот оценивается и анекдоты друг с другом не связаны. Если оценивать тему целиком, то все равно есть вопросы. Например, рейтинг темы может меняться по мере ее развития. Как в положительную, так и в отрицательную сторону. Если люди уже как-то голосовали за нее в начале, то что им делать потом? И еще, чем бредовее тема, тем почему-то она популярнее. Здравомыслящая часть аудитории будет оценивать такую тему ниже плинтуса, но к популярности-то такая оценка отношения не имеет. 😃

Vitaly

Так, трындеть хватит, а? Формулы гоните.

Я пока склоняюсь оценивать по средней скорости поступления сообщений за последнюю неделю. То есть:

Количество сообщений/[дата первого сообщения - дата последнего]

(*) Сообщения отсекаются где-то по последним 2 неделям.

Возможно, есть смысл какие-то локальные максимумы считать за 3 дня. Надо подумать.

Зато никакой привязки к “умности” пользователей, ибо это мне это почему-то не нравится. Есть вероятность что будет слишком усредненная “авторитарная попса” вылезать.

toxa

для всех сообщений в теме за последний месяц:
сумма{([дата i-го сообщения] - [дата i+1-го сообщения]) < 3 дней } / кол-во {([дата i-го сообщения] - [дата i+1-го сообщения]) < 3 дней }

чтобы “авторитарная попса” не лезла, можно засчитывать первое сообщение пользователя с весом 1, второе сообщение от этого же пользователя в этой же теме с весом 0.5, третье - 0.25 и так далее. Таким образом, тема, где участвуют два собеседника, будет проигрывать теме, где участвуют 3 и больше, при прочих равных.

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

Vitaly

О, дельная мысль, кстати. Насчет количества авторов.

SAN

Тоха прав, а то по формуле

Количество сообщений/[дата первого сообщения - дата последнего]

Самыми “интересными и актуальными” темами вылезут
Полетушки в Люберцах и
магазины нашинские. доколе ещё?