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

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

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

Ответ 1

Вы упомянули об этом в 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 более важным/релевантным, чем URL B? Он делает это, сравнивая их приоритеты, которые являются наибольшими, а не их абсолютные значения.

//ненормализованный - x - это идентификатор страницы  un (x) = 0,3 * log (views (x) +10)/log (10 + maxViews()) +          0.7 * Log (комментарии (х) + 10)/журнал (10 + maxComments())  // исходная формула (теперь в псевдокоде)

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

мы определяем un (0) как минимальное значение, т.е. (где представления (x) и комментарии (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.

Ответ 2

То, что вы ищете здесь, - это не алгоритм, а формула.

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

Вместо этого попробуйте вместе пройти проблему.

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

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

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

Если на странице 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 видами, если веса равны.

Итак, суммируем:

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

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

Ответ 3

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

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

Ответ 4

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

Если вы хотите иметь способ ранжировать что-то, и есть несколько факторов, которые вы используете для выполнения этого ранжирования, вы делаете что-то, называемое многокритериальным анализом решений. (ВРСГО). См.: 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)

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

Пусть v[i] виды страницы i, c[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 < 1, который указывает на важность взглядов на комментарии: p = 0 означает, что комментарии значительны, p = 1 означает, что только взгляды значительны, а p = 0,5 дает равный вес.

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

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

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