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

Мне нужен алгоритм, который позволяет мне определять подходящее поле <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

person stacker    schedule 27.05.2010    source источник
comment
связанные meta.stackexchange.com/questions/37216/   -  person stacker    schedule 27.05.2010
comment
Что именно вы имеете в виду под приоритетом? Вы просто ищете способ упорядочить URL-адреса? Если это так, просто возьмите взвешенную сумму важных факторов: W1 * nViews + W2 * nComments и отсортируйте по ней. Играйте с W1 и W2, пока не получите заказ, который вас устраивает.   -  person j_random_hacker    schedule 27.05.2010
comment
Если большее количество просмотров (соответственно комментариев) означает большее значение, тогда вы можете получить общее максимальное количество m просмотров (или комментариев), а затем вы можете для каждой страницы разделить количество просмотров (или комментариев) на m. Это даст число от 0 до 1, а самый важный сайт (т.е. большинство просмотров или комментариев) будет иметь приоритет 1.   -  person phimuemue    schedule 31.05.2010
comment
@j_random_hacker проблема не в порядке. проблема в том, как назначить значение приоритета на основе этих данных. Допустим, я уже заказал их, поэтому мне нужно разделить данные на 10 и установить для каждой группы другое значение: 1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0. проблема в том, что мне нужно сделать это в SQL-запросе, а строки даже не упорядочены по этому значению.   -  person stacker    schedule 31.05.2010
comment
@stacker Я немного поправил ваш вопрос, надеюсь, вы не против: O   -  person Thomas Bonini    schedule 01.06.2010
comment
@stacker: Извините, я не понял. Я имел в виду, что эти значения приоритета используются только для упорядочивания окончательных результатов в каком-то листинге, верно? Таким образом, сами ценности не имеют значения, имеет значение только относительный порядок значений. Например. вы можете удвоить все значения приоритета, и значение не изменится, верно? (Я пытаюсь понять конечную цель поля приоритета.)   -  person j_random_hacker    schedule 01.06.2010
comment
@j_random_hacker nop. значение имеет смысл и может быть только от 0,0 до 1,0.   -  person stacker    schedule 02.06.2010


Ответы (6)


Вы упомянули, что делаете это в 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 * журнал (просмотры (x) +10) / журнал (10 + maxViews ()) + 0,7 * журнал (комментарии (x) +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.
person mdma    schedule 01.06.2010
comment
Спасибо за ответ. Меня больше волнует алгоритм, а не реализация. Этот алгоритм выглядит неплохо, но совсем не идеально. прямо сейчас у меня самая низкая статья: мало просмотров и никаких комментариев, чтобы иметь приоритет 0,4, а не 0,1. но, как вы сказали, это динамично. насчет формулы для горячих страниц, это действительно интересно, но я не знаю, это другая тема, так как этот пост посвящен файлу sitemap.xml. но, возможно, вы правы, и мне стоит добавить эту логику в sitemap.xml. Я не уверен. - person stacker; 03.06.2010
comment
@Stacker - Важна ли абсолютная величина рейтинга? Я думал, что важен только относительный порядок - абсолютные значения служат только для определения порядка. Что-то мне не хватает? - person mdma; 03.06.2010
comment
Да, я ищу абсолютное значение. порядок не по полю приоритета, а по полю LastModified. Пожалуйста, взгляните на файл stackoverflow sitemap.xml, чтобы лучше понять этот файл. Поскольку доступ к этой странице ограничен IP-адресами из белого списка, вы можете просмотреть этот файл только через Google. - person stacker; 03.06.2010
comment
Вы можете увидеть кешированный файл в Google: google .com / - person stacker; 03.06.2010
comment
Можно получить диапазон от 0,1 до 1,0, но это потребует дополнительных вычислений. И в этом действительно нет необходимости. Взгляните на статью в Википедии - в ней указано, что значение приоритета - показать, насколько важен URL-адрес по сравнению с другими URL-адресами на сайте. См. en.wikipedia.org/wiki/Sitemaps. Принуждение к любому диапазону приоритета может быть только эстетическим и не влияет на то, как поисковая система определяет приоритеты страниц. - person mdma; 03.06.2010
comment
Правильно. Итак, как я уже сказал, этот алгоритм не идеален, но достаточно хорош. если у вас может быть другой алгоритм / ресурс, это будет здорово. кстати, я не понимаю, зачем использовать функцию log10 как в числителе, так и в знаменателе, а не только для всей дроби. - person stacker; 03.06.2010
comment
Как сделать диапазон явно 0..1 более совершенным - это даст те же результаты независимо от диапазона. Вы можете иметь все свои приоритеты в диапазоне 0,99–1,00 - пока они относительно упорядочены, это все, что имеет значение. Минимальное значение 0,1 не является требованием карты сайта. - person mdma; 03.06.2010
comment
Почему делить на MAX(views), а не быть average(views)? Возьмем, к примеру, SO, они также могут ранжироваться по голосам, и среднее значение здесь имеет больше смысла, чем максимальное. - person stacker; 03.06.2010
comment
Журнал существует для того, чтобы, если у вас есть страница с миллионом просмотров и страница с 1000 просмотров и одна с 1 просмотром, вы не получите приоритеты, такие как 1, 0,0001 и 0,0000001. Он сжимает динамический диапазон примерно до 0,9,0,5,0,1. Порядок останется прежним, просто требуется меньшее количество цифр точности. - person mdma; 03.06.2010
comment
Использование среднего значения не повлияет на относительный порядок, вы меняете только базовый уровень для сравнения. Моя исходная формула заключается в том, насколько далеко от максимальной оценки находится эта страница, и вы предполагаете, насколько далека от средней оценки эта страница. Все страницы по-прежнему будут иметь одинаковый порядок. - person mdma; 03.06.2010
comment
Просто попробуйте формулу на практике. ТАК не место для изучения математики. Если вы затем увидите, что эти две страницы не получают относительных приоритетов, как вы хотели бы, мы можем изучить это, поскольку могут быть детали, которые вы не упомянули. В противном случае, я думаю, это сработает, как вы хотите. - person mdma; 03.06.2010
comment
Вы пробовали формулу по-настоящему? Поскольку вы запросили это, я обновил свой ответ формулой, которая гарантирует, что диапазон будет строго от 0,1 до 1,0. Но имейте в виду, что в этом нет необходимости, и это не повлияет на относительный приоритет, который поисковая система использует для определения приоритета URL-адресов вашего сайта. - person mdma; 06.06.2010
comment
Я действительно пробовал использовать это по-настоящему. Я использую формулу @Full Decent для получения относительного порядка, моя формула: 0,2 * log10 (10 + просмотров) / losg10 (10 + maxViews) + 0,8 * log10 (10 + комментарии) / log10 (10 + maxComments). для этих значений: просмотров = 100, комментариев = 0, результат 0,4. это не имеет смысла. это связано со значением +10 и максимальным значением вместо среднего. - person stacker; 06.06.2010
comment
Как вы сказали, карта сайта хороша с относительным порядком. но я искал идеальную ценность, которая действительно показывала ценность статьи. в любом случае, вы помогли мне с этой проблемой, и я даю вам награду. - person stacker; 06.06.2010
comment
Кстати, не могли бы вы подробнее рассказать о решении горячих тем, которое вы упомянули? как это должно быть реализовано? куча запросов с луком? - person stacker; 06.06.2010
comment
формула горячей темы будет серией формул в предложении WHERE. Представьте, что у вас есть таблица, в которой каждая страница представляет собой строку со столбцами для просмотров / комментариев, упорядоченных по дате в 4 временных шкалах. (4 столбца для представлений, 4 для сообществ) Затем ваше предложение where вычисляется на основе этих столбцов, применяя формулу 4 раза для каждой шкалы времени. - person mdma; 07.06.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)

person William Entriken    schedule 31.05.2010
comment
Какая польза от log_10? почему вы добавляете 10 к просмотрам / комментариям? можешь объяснить свой алгоритм? - person stacker; 31.05.2010
comment
@stacker Лог 10 предназначен для сжатия широкого диапазона в меньший диапазон. Например. Страница с максимальным количеством просмотров занимает 1 место, в то время как страница с 10-кратным меньшим количеством просмотров имеет гораздо меньший, чем 10-кратный рейтинг. Это часто бывает полезно, когда количество просмотров варьируется от нескольких до сотен тысяч. +10 означает, что log (0) не участвует в вычислении - log (0) не определен - некоторые говорят, что это отрицательная бесконечность - но в любом случае log (0) здесь бесполезен, поэтому формула добавляет константу, чтобы избежать Это. - person mdma; 02.06.2010
comment
@mdma, поэтому я могу использовать 1 вместо 10. 10 имеет смысл избегать log (1)? - person stacker; 02.06.2010
comment
@stacker Это также позволяет избежать деления на ноль. Log (1) равен 0, поэтому при отсутствии maxView вы получите ошибку деления на ноль. Придерживайтесь 10, это самая безопасная ставка, которая практически не влияет на окончательный результат. - person mdma; 02.06.2010
comment
@mdma Верно, log (1) равен 0. Технически я могу использовать +2, но +10 он написан более красиво ... - person stacker; 02.06.2010
comment
Используя функцию журнала, я получаю приоритет от 0,4 до 0,0 без функции журнала. При использовании функции журнала наименьшее число составляет 0,4. - person stacker; 02.06.2010
comment
@Stacker - это будет меняться по мере увеличения вашего maxViews / maxComments - формула динамическая. - person mdma; 02.06.2010
comment
Хороший алгоритм, но он может быть лучше. - person stacker; 02.06.2010
comment
@Stacker - смотри мой ответ. Если это не соответствует вашим потребностям, добавьте в свой вопрос дополнительные сведения. - person mdma; 02.06.2010

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

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

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

У вас есть два входящих параметра: 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 просмотрами, если веса равны.

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

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

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

person Michael Dorfman    schedule 04.06.2010

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

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

ранг = (p1C / p2C) ^ (wC) * (p1V / p2V) ^ (wV)

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

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

person RMD    schedule 20.01.2011

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

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

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

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

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

person Joel Hoff    schedule 06.06.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‹ 1, который указывает на важность просмотров над комментариями: p = 0 означает, что значимы только комментарии, p = 1 означает, что значимы только просмотры, а p = 0,5 дает равный вес.

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

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

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

person Il-Bhima    schedule 04.06.2010
comment
Я ищу более сложный алгоритм, который даст абсолютное значение. - person stacker; 04.06.2010
comment
Что вы подразумеваете под абсолютной величиной? Не могли бы вы объяснить это поподробнее? - person Il-Bhima; 05.06.2010