Алгоритм расчета важности страницы на основе ее просмотров / комментариев - PullRequest
11 голосов
/ 27 мая 2010

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

Для тех из вас, кто не знаком с картами сайта, поле приоритета используется для обозначения важности страницы по сравнению с другими страницами того же сайта. Это должно быть десятичное число от 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

Ответы [ 6 ]

12 голосов
/ 02 июня 2010

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

Если у вас есть таблица / представление 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)))

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

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

  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)

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

РЕДАКТИРОВАТЬ: Чтобы получить строгий диапазон от 0,1 до 1,0, вы должны мотивировать формулу, как это. Но я подчеркиваю - это только добавит накладных расходов и не является необходимым - абсолютные значения приоритета не важны - только их относительные значения к другим URL-адресам. Поисковая система использует их для ответа на вопрос, является ли URL A более важным / релевантным, чем URL B? Он делает это, сравнивая их приоритеты - какой из них наибольший, - а не их абсолютные значения.

// ненормализовано - x это некоторый идентификатор страницы un (x) = 0.3 * log (просмотров (x) +10) / log (10 + maxViews ()) + 0.7 * Log (комментарии (х) + 10) / журнал (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.
4 голосов
/ 05 июня 2010

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

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

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

У вас есть два входящих параметра, viewCount и commentCount.Вы хотите вернуть один номер, Приоритет.Пока все хорошо.

Вы говорите, что приоритет должен быть в диапазоне от 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 голосов
/ 31 мая 2010

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

Хотя ИМХО, просто используйте 0.5*log_10(10+views)/log_10(10+maxViews) + 0.5*log_10(10+comments)/log_10(10+maxComments)

2 голосов
/ 21 января 2011

Я знаю, что прошло много времени с тех пор, как об этом спросили, но я столкнулся с подобной проблемой и нашел другое решение.

Когда вы хотите иметь способ ранжировать что-то, и есть несколько факторов, которые вы используете для этого ранжирования, вы делаете то, что называется многокритериальным анализом решений. (ВРСГО). Смотри: http://en.wikipedia.org/wiki/Multi-criteria_decision_analysis

Есть несколько способов справиться с этим. В вашем случае ваши критерии имеют разные «единицы». Один в единицах комментариев, другой в единицах просмотров. Кроме того, вы можете придать этим критериям различный вес в зависимости от бизнес-правил, которые вы придумали.

В этом случае лучшее решение - это модель взвешенного продукта. Смотри: http://en.wikipedia.org/wiki/Weighted_product_model

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

Наконец, вы умножаете каждый из результатов вместе, чтобы получить ранг. Если рейтинг больше 1, то страница числителя имеет более высокий рейтинг, чем страница знаменателя.

Каждая страница будет сравниваться с любой другой страницей, выполняя что-то вроде:

  • p1C = страница 1 комментариев
  • p1V = просмотр страницы 1
  • p2C = страница 2 комментария
  • p2V = страница 2 просмотров
  • wC = вес комментария
  • WV = посмотреть вес

rank = (p1C / p2C) ^ (wC) * (p1V / p2V) ^ (wV)

Конечным результатом является отсортированный список страниц в соответствии с их рангом.

Я реализовал это в C #, выполнив сортировку для коллекции объектов, реализующих IComparable.

1 голос
/ 06 июня 2010

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

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

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

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

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

0 голосов
/ 04 июня 2010

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

Позвольте 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)

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

...