Как обеспечить наиболее релевантные результаты с многофакторной взвешенной сортировкой - PullRequest
29 голосов
/ 06 января 2012

Мне нужно предоставить взвешенную сортировку по 2+ факторам, упорядоченную по «релевантности».Однако факторы не полностью изолированы, так как я хочу, чтобы один или несколько факторов влияли на «срочность» (вес) других.

Пример: добавленное содержимое ( статьи * 1004)*) может быть поднят за / против, и, следовательно, иметь рейтинг;у них есть дата публикации, и они также помечены категориями.Пользователи пишут статьи и могут голосовать, и могут иметь или не иметь какой-то рейтинг сами (эксперт и т. Д.).Вероятно, похоже на StackOverflow, верно?

Я хочу предоставить каждому пользователю список статей, сгруппированных по тегу, но отсортированных по «релевантности», где релевантность рассчитывается на основе рейтинга и возрастастатьи, и, возможно, зависит от рейтинга автора.IE высоко оцененная статья, которая была написана несколько лет назад, может не обязательно быть столь же актуальной как статья среднего ранга, написанная вчера.И, может быть, если бы статья была написана экспертом, она будет рассматриваться как более релевантная, чем статья, написанная "Джо Шмоэ".

Другим хорошим примером будет назначение отелям "мета-балла", состоящего из цены., рейтинг и достопримечательности .

Мой вопрос: каков наилучший алгоритм многофакторной сортировки?Это может быть дубликатом этого вопроса , но меня интересует универсальный алгоритм для любого числа факторов (более разумное ожидание - 2–4 фактора), предпочтительно «полностью автоматическая» функция, котораяМне не нужно настраивать или требовать пользовательского ввода, и я не могу разобрать линейную алгебру и ненормальность собственного вектора.


Возможности, которые я нашел до сих пор:

Примечание: S - это «оценка сортировки»

  1. «Линейно-взвешенный» - используйте функцию типа: S = (w<sub>1</sub> * F<sub>1</sub>) + (w<sub>2</sub> * F<sub>2</sub>) + (w<sub>3</sub> * F<sub>3</sub>), где w<sub>x</sub> назначены произвольновеса и F<sub>x</sub> являются значениями факторов.Вы также хотели бы нормализовать F (то есть F<sub>x_n</sub> = F<sub>x</sub> / F<sub>max</sub>).Я думаю, это примерно так: Поиск Lucene работает .
  2. "Взвешенное по основанию" - больше похоже на группирование, чем на взвешивание, это просто линейное взвешивание, где веса увеличиваютсякратное основанию 10 (принцип, аналогичный специфичность селектора CSS ), так что более важные факторы значительно выше: S = 1000 * F<sub>1</sub> + 100 * F<sub>2</sub> + 10 * F<sub>3</sub> ....
  3. оценочное истинное значение (ETV) - это, очевидно, то, что Google Analytics представило в своих отчетах , где значение одного фактора влияет ( веса ) на другой фактор - следствием является сортировка по более «статистически значимым»ценности.Ссылка объясняет это довольно хорошо, поэтому вот только уравнение: S = (F<sub>2</sub> / F<sub>2_max</sub> * F<sub>1</sub>) + ((1 - (F<sub>2</sub> / F<sub>2_max</sub>)) * F<sub>1_avg</sub>), где F<sub>1</sub> - это «более важный» фактор («показатель отказов» в статье), а F<sub>2</sub> - это «фактор, изменяющий значимость» («посещения» в статье).
  4. Байесовская оценка - выглядит очень похоже на ETV, именно так IMDb вычисляет свой рейтинг.См. этот пост StackOverflow для объяснения ;уравнение: S = (F<sub>2</sub> / (F<sub>2</sub>+F<sub>2_lim</sub>)) * F<sub>1</sub> + (F<sub>2_lim</sub> / (F<sub>2</sub>+F<sub>2_lim</sub>)) × F<sub>1_avg</sub>, где F<sub>x</sub> - это то же самое, что и # 3, а F<sub>2_lim</sub> - минимальный пороговый предел для фактора "значимости" (т. е. любое значение меньше X не должно учитываться).1065 *

    Варианты № 3 или № 4 выглядят действительно многообещающе, поскольку вам не нужно выбирать произвольную схему взвешивания, как вы это делаете в № 1 и № 2, но проблема в том, как вы делаете это более чемдва фактора?

    Я также сталкивался с реализацией SQL для алгоритма двухфакторного взвешивания , который, в основном, мне и нужно написать в конце концов.

Ответы [ 2 ]

6 голосов
/ 30 декабря 2014

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

По сути, вы рассматриваете каждый свой критерий как координату (конечно, после нормализации). Исходя из вашего суждения, вы выбираете абсолютную оптимальную точку, например, в данном случае автор самого высокого ранга, новейшая статья и т. д. После выбора оптимального решения каждое «решение» оценивается на основе его расстояния от этого оптимального. Примерная формула будет обратна евклидову дистанцию ​​для оценки каждой статьи: S = 1 / (sqrt ((rank - rank_ideal) ^ 2 + (age - age_ideal) ^ 2 + ... + (xn - xn_ideal) ^ 2 )).

Это рассматривает все критерии как равные, так что имейте это в виду.

0 голосов
/ 20 марта 2012

Рассмотрим цепочку весов.Например, у вас есть 3 фактора: X , Y и Z .Вы можете вычислить ETVyz как W = (Z/Zmax * Y) + (1 - Z/Zmax) * Yavg для каждой записи, а затем вычислить ETVxw как S = (W/Wmax * X) + (1 - W/Wmax) * Xavg.Вы можете объединить больше факторов, чем аналогичных.

...