Алгоритм для вычисления важности страницы на основе ее представлений / комментарии

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

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

Алгоритм примет два параметра, viewCount и commentCount, и возвратит приоритетное значение. Например:

GetPriority(100000, 100000); // Damn, a lot of views/comments! The returned value will be very close to 1, for example 0.995
GetPriority(3, 2); // Ok not many users are interested in this page, so for example it will return 0.082

11
задан stacker 2 June 2010 в 21:52
поделиться

5 ответов

Вы упомянули, что делаете это в SQL запросе, поэтому я приведу примеры в этом.

Если у вас есть таблица/view Pages, что-то вроде этого

Pages
-----
page_id:int
views:int  - indexed
comments:int - indexed

Затем вы можете упорядочить их по написанию

SELECT * FROM Pages
ORDER BY 
    (0.3+LOG10(10+views)/LOG10(10+(SELECT MAX(views) FROM Pages))) +       
    (0.7+LOG10(10+comments)/LOG10(10+(SELECT MAX(comments) FROM Pages)))

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

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

  0.3*(score for views/comments today) - live data
  0.3*(score for views/comments in the last week)
  0.25*(score for views/comments in the last month)
  0.15*(score for all views/comments, all time)

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

EDIT: Чтобы получить строгий диапазон от 0.1 до 1.0, нужно модифицировать формулу следующим образом. Но я подчеркиваю - это только добавит накладных расходов и не является необходимым - абсолютные значения приоритета не важны - только их относительные значения по отношению к другим урлам. Поисковая система использует их, чтобы ответить на вопрос, является ли URL A более важным/релевантным, чем URL B? Это делается путем сравнения их приоритетов - какой из них больше - а не их абсолютных значений.

// ненормализованный - x - идентификатор страницы un(x) = 0.3*log(views(x)+10)/log(10+maxViews()) + 0.7*log(comments(x)+10)/log(10+maxComments()) // оригинальная формула (теперь в псевдокоде)

Максимум будет равен 1.0, минимум будет начинаться с 1.0 и двигаться вниз по мере увеличения количества просмотров/комментариев.

мы определяем un(0) как минимальное значение, т.е. (где views(x) и comments(x) оба равны 0 в вышеприведенной формуле)

Чтобы получить нормализованную формулу от 0.1 до 1.0, вычисляем n(x), нормализованный приоритет для страницы x

                  (1.0-un(x)) * (un(0)-0.1)
  n(x) = un(x) -  -------------------------    when un(0) != 1.0
                          1.0-un(0)

       = 0.1 otherwise.
12
ответ дан 3 December 2019 в 04:51
поделиться

Priority = W1 * views / maxViewsOfAllArticles + W2 * comments / maxCommentsOfAllArticles с W1 + W2 = 1

Хотя IMHO, просто используйте 0,5 * log_10 (10 + просмотров) / log_10 (10 + maxViews) + 0,5 * log_10 (10 + комментарии) / log_10 (10 + maxComments)

4
ответ дан 3 December 2019 в 04:51
поделиться

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

Этот метод довольно легко реализовать для вашей проблемы, и основная концепция хорошо описана в этой статье Википедии о моделях линейной регрессии .

Краткое описание того, как применить его к вашей проблеме:

  1. Определите параметры строки, которые лучше всего соответствуют данным количества просмотров и комментариев для всех веб-страниц вашего сайта, т. Е. Используйте линейную регрессию.
  2. Используйте параметры строки, чтобы получить функцию приоритета для параметров просмотра / подсчета.

Примеры кода для базовой линейной регрессии не составит труда отследить, если вы не хотите реализовывать ее с нуля на основе базовых математических формул (используйте Интернет, Числовые рецепты и т. Д.). Кроме того, любой программный пакет общей математики, такой как Matlab, R и т. Д., Имеет функции линейной регрессии.

1
ответ дан 3 December 2019 в 04:51
поделиться

Самый наивный подход был бы следующим:

Пусть v [i] просмотров страницы i , c [i] число комментариев для страницы i , затем определите относительный вес просмотра для страницы i равным

r_v(i) = v[i]/(sum_j v[j])

, где sum_j v [j] - это сумма v [.] на всех страницах. Аналогичным образом определите относительный вес комментария для страницы i, равный

r_c(i) = c[i]/(sum_j c[j]).

. Теперь вам нужен некоторый постоянный параметр p: 0

Затем установите приоритет

p*r_v(i) + (1-p)*r_c(i)

Это может быть слишком упрощенно, но, вероятно, это лучшая отправная точка.

0
ответ дан 3 December 2019 в 04:51
поделиться

Здесь вы ищете не алгоритм, а формулу.

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

Вместо этого давайте попробуем вместе разобраться в проблеме.

У вас есть два входящих параметра: viewCount и commentCount. Вы хотите вернуть одно число, Priority. Все идет нормально.

Вы говорите, что приоритет должен находиться в диапазоне от 0 до 1, но это не очень важно. Если бы мы придумали формулу, которая нам понравилась, но в результате получили значения от 0 до N, мы могли бы просто разделить результаты на N - так что это ограничение на самом деле не имеет значения.

Теперь первое, что нам нужно решить, это относительный вес комментариев и просмотров.

Если у страницы A 100 комментариев и 10 просмотров, а у страницы B 10 комментариев и 100 просмотров, какая из них должна иметь более высокий приоритет? Или должен быть такой же приоритет? Вам нужно решить, что подходит для вашего определения приоритета.

Если вы решите, например, что комментарии в 5 раз более ценны, чем просмотры, то мы можем начать с формулы вроде

 Priority = 5 * Comments + Views

Очевидно, это можно обобщить до

Priority = A * Comments + B * Views

, где A и B - относительные веса.

Но иногда мы хотим, чтобы наши веса были экспоненциальными, а не линейными, как, например,

 Priority = Comment ^ A + Views ^ B

, который дает очень другую кривую, чем предыдущая формула.

Точно так же

 Priority = Comment ^ A * Views ^ B

даст более высокую ценность странице с 20 комментариями и 20 просмотрами, чем страница с 1 комментарием и 40 просмотрами, если веса равны.

Итак, подведем итог:

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

Мы не можем сделать это за вас, потому что не знаем, как вы хотите ценить вещи.

4
ответ дан 3 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: