Алгоритм определения самой популярной статьи за последнюю неделю, месяц и год? - PullRequest
7 голосов
/ 14 октября 2010

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

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

Вот доступные переменные:

  • Время [дата], когда статья былапервоначально опубликовано
  • Время [дата] статья была рекомендована редакторами (если она была)
  • Количество голосов, которое статья получила от пользователей (всего, за последнюю неделю, за последнююмесяц, за последний год)
  • Количество просмотров статьи (всего за последнюю неделю, за последний месяц, за последний год)
  • Количество просмотров статьибыл загружен пользователями (всего, за последнюю неделю, за последний месяц, за последний год)
  • Комментарии к статье (всего, за последнюю неделю, за последний месяц, за последний год)
  • Сколько раз пользователь сохранялпереходите к их списку для чтения (всего за последнюю неделю, за последний месяц, за последний год)
  • Количество раз, когда статья была представлена ​​как "лучшее, что мы можем предложить""(редакционный) список (всего за последнюю неделю, за последний месяц, за последний год)
  • Время [дата] статья была названа" статьей недели "(если она была)

Прямо сейчас я делаю некоторые взвешивания для каждой переменной и делю на время, когда она была прочитана.Это почти все, что я мог придумать после прочтения Weighted Means .Моя самая большая проблема состоит в том, что есть некоторые пользовательские статьи, которые всегда находятся на вершине популярного списка.Возможно, потому что автор «обманывает».

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

Кто-нибудь с более статистически умным умом, чем мой, готов мне помочь?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 14 октября 2010

Я думаю, что подход взвешенных средних является хорошим.Но я думаю, что есть две вещи, которые нужно решить.

  1. Как взвесить критерии.
  2. Как предотвратить "игру" системы

Как взвесить критерии

Этот вопрос относится к области Анализ решений по нескольким критериям .Ваш подход - Модель взвешенной суммы .В любом вычислительном процессе принятия решений ранжирование критериев часто является наиболее сложной частью процесса.Я предлагаю вам пойти по пути парных сравнений: насколько важен, по вашему мнению, каждый критерий по сравнению с другими?Создайте себе таблицу, подобную этой:

    c1     c2    c3   ...

c1  1      4      2

c2  1/4    1     1/2

c3  1/2    2      1

...

Это показывает, что C1 в 4 раза важнее C2, что вдвое важнее C3.Используйте конечный пул весов, скажем, 1.0, так как это легко.Распределяя его по критериям, мы имеем 4 * C1 + 2 * C3 + C2 = 1 или примерно C1 = 4/7, C3 = 2/7, C2 = 1/7.Если возникают несоответствия (например, если вы думаете, C1 = 2*C2 = 3*C3, но C3 = 2*C2), это хороший признак ошибки: это означает, что вы не согласны с вашими относительными рейтингами, поэтому вернитесь и пересмотрите их.Я забыл название этой процедуры, комментарии были бы полезны здесь.Все это хорошо задокументировано.

Теперь, это все, вероятно, кажется вам немного произвольным на данный момент.Они по большей части номера, которые вы вытащили из собственной головы.Поэтому я бы предложил взять пример из около 30 статей и ранжировать их так, чтобы «ваша интуиция» говорила, что они должны быть заказаны (часто вы интуитивнее, чем можете выразить цифрами).Отыщите цифры, пока они не получат что-то близкое к этому порядку.

Предотвращение игр

Это второй важный аспект.Независимо от того, какую систему вы используете, если вы не можете предотвратить «мошенничество», она в конечном итоге потерпит неудачу.Вы должны быть в состоянии ограничить голосование (должен ли IP быть в состоянии рекомендовать историю дважды?).Вы должны быть в состоянии предотвратить спам-комментарии.Чем важнее критерий, тем больше вам нужно, чтобы он не был задействован.

3 голосов
/ 15 октября 2010

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

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

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

Пример в R:

alt text

Код:

#Test data frame generated at random
test <- data.frame(
  quoted = rpois(100,12),
  seen = rbinom(100,60,0.3),
  download = rbinom(100,30,0.3)
)
#Create some link between user-vars and editorial
test <- within(test,{
  editorial = round((quoted+seen+download)/10+rpois(100,1))
})
#add two test cases
test[101,]<-c(20,18,13,0) #bad article, hyped by few spammers
test[102,]<-c(20,18,13,8) # genuinely good article

# mahalanobis distances
mah <- mahalanobis(test,colMeans(test),cov(test))
# simple linear modelling
mod <- lm(editorial~quoted*seen*download,data=test)

# the plots
op <- par(mfrow=c(1,2))
hist(mah,breaks=20,col="grey",main="Mahalanobis distance")
points(mah[101],0,col="red",pch=19)
points(mah[102],0,,col="darkgreen",pch=19)
legend("topright",legend=c("high rated by editors","gamed"),
  pch=19,col=c("darkgreen","red"))

hist(resid(mod),breaks=20,col="grey",main="Residuals model",xlim=c(-6,4))
points(resid(mod)[101],0,col="red",pch=19)
points(resid(mod)[102],0,,col="darkgreen",pch=19)

par(op)
1 голос
/ 14 октября 2010

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

Например

// x[i] = any given variable above
// w[i] = weighting for that variable
// age = days since published OR 
//      days since editor recommendation OR 
//      average of both OR 
//      ...
score = (x[1]w[1] + ... + x[n]w[n])/age

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

// Fw = some non-linear function
// (possibly multi-variable) that calculates
// a sub-score for the given variable(s)  
score = (Fw1(x[1]) + ... + FwN(x[n]))/FwAge(age)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...