2010-06-09 25 views
3

J'ai quelques pages sur un site Web et je dois créer un ordre basé sur "popularité"/"activité"Formule de popularité? (basé sur "like", "comments", "views")

Les paramètres que j'ai à utiliser sont:

  • vue sur la page
  • commentaires sur la page (il y a une forme au fond, où les utilisations peuvent faire des commentaires)
  • clics effectués sur le « comme il » icône

Existe-t-il des normes pour ce que serait une formule pour la popularité? (Sinon opinions sont bonnes aussi)

(d'abord je pensais que des vues + 10 * commentaires + 10 * likeit)

+0

Comment évaluez-vous des commentaires positifs vs commentaires négatifs? Les «likeits» devraient-ils être aussi importants que les commentaires? –

+0

nous n'évaluons pas les commentaires positifs vs négatifs. Si "likeits" devrait être aussi important que les commentaires est quelque chose que je jette là-bas. Je suis assez flexible. (peut-être "le plus actif" pourrait être un meilleur terme que "le plus populaire") – paullb

Répondre

2

Il n'y a pas de formule standard pour ce (comment pourrait-il être?)

Ce que vous avez ressemble à une solution assez normale, et probablement bien fonctionner. Bien sûr, vous devriez jouer avec les 10 pour trouver des valeurs qui répondent à vos besoins. En fonction de vos besoins, vous pouvez également ajouter un facteur temps (c'est-à-dire -X points par semaine) pour que les anciennes pages deviennent moins populaires. Vous pouvez également remplacer vos "pages vues" par "pages vues au cours du dernier mois". Encore une fois, cela dépend de vos besoins, cela peut ne pas être pertinent.

2

Vous pouvez faire quelque chose comme ce que YouTube fait - ont juste triés par le plus grand nombre par catégorie. Par exemple - le plus regardé, le plus commenté, le plus aimé. Dans chaque catégorie, une page différente pourrait venir en premier, bien que les classements pourraient probablement être corrélés. Si vous n'avez besoin que d'un seul classement, vous devrez trouver une formule, de préférence dérivée empiriquement en analysant un tas de données que vous avez déjà et en décidant ce qui doit être calculé comme bon/mauvais, et en travaillant à rebours une équation qui correspond à votre décision.

Vous pourriez même tenter une approche d'apprentissage automatique pour «apprendre» quelle est la bonne pondération pour combiner chacun de ces nombres comme dans votre exemple de formule. Le faire manuellement pourrait aussi ne pas être trop dur.

+0

Merci pour l'idée, les options que vous proposez sont déjà des options sur la liste des résultats. La «popularité globale» finale est ce que j'essaie d'obtenir ici. – paullb

0

J'apprécierais les commentaires plus que «c'est comme si le contenu invite à une discussion. Si c'est juste une déclaration de faits, une ration égale pour les commentaires et le compte similaire semble correct (bien que 10 soit un peu trop, je pense ...)

Est-ce que la visite prend en compte le temps passé par l'utilisateur? Vous pouvez également utiliser cela, car une vue de 2 secondes signifie moins d'une minute.

1

J'utilise,

(C*comments + L*likeit)*100/views 

où vous devez utiliser C et L en fonction de la façon dont vous beaucoup de valeur chaque attribut. J'utilise C = 1 et L = 1. Cela vous donne le pourcentage de vues ayant généré une action positive, ce qui fait que les éléments ayant le pourcentage le plus élevé sont . J'aime ça parce que cela permet aux nouveaux objets d'être très populaires au début, d'apparaître en premier et d'avoir plus de vues et de devenir ainsi moins populaires (ou plus) jusqu'à la stabilisation. En tout cas, J'espère que ça aide. PS: De cela fonctionnerait tout de même sans le "* 100" mais j'aime les pourcentages.

1

En fait, il y a une acceptée meilleure façon de Calculation:
http://www.evanmiller.org/how-not-to-sort-by-average-rating.html

Vous devrez peut-être combiner « aime » et « commentaires » dans un score unique, assignant votre propre facteur de pondération à chacun, avant de le brancher dans la formule comme la valeur «vote positif».

à partir du lien ci-dessus:

Score = Limite inférieure de Wilson score de l'intervalle de confiance pour un paramètre Bernoulli

Nous avons besoin d'équilibrer la proportion des avis positifs avec l'incertitude d'un petit nombre d'observations. Heureusement, les maths pour cela ont été élaborés en 1927 par Edwin B. Wilson. Ce que nous voulons demander est: Étant donné les évaluations que j'ai, il y a une chance de 95% que la fraction « réelle » des avis positifs est au moins quoi? Wilson donne la réponse . Considérant que d'avis positifs et négatifs (pas échelle de 5 étoiles), la borne inférieure de la proportion des avis positifs est donnée par: enter image description here

(Utiliser moins où il est dit plus/moins pour calculer la partie inférieure lié.) ici est le observé fraction des avis positifs, zα/2 est le (1-α/2) quantile de la distribution normale, et n est le nombre total d'évaluations. La même formule mis en œuvre dans Ruby:

require 'statistics2' 

def ci_lower_bound(pos, n, confidence) 
    if n == 0 
     return 0 
    end 
    z = Statistics2.pnormaldist(1-(1-confidence)/2) 
    phat = 1.0*pos/n 
    (phat + z*z/(2*n) - z * Math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n) 
end 

pos est le nombre d'avis positifs, n est le nombre total de évaluations, et la confiance fait référence au niveau de confiance statistique: prendre 0,95 pour un 95% de chances que votre limite inférieure est correcte, 0,975 pour avoir une chance de 97,5%, etc. Le score z dans cette fonction jamais changements, donc si vous n'avez pas à portée de main un paquet de statistiques ou si performance est un problème vous pouvez toujours coder une valeur ici pour z. (Utilisez 1,96 pour un niveau de confiance de 0,95.)

La même formule que une requête SQL:

SELECT widget_id, ((positive + 1.9208)/(positive + negative) - 
        1.96 * SQRT((positive * negative)/(positive + negative) + 0.9604)/
          (positive + negative))/(1 + 3.8416/(positive + negative)) 
     AS ci_lower_bound FROM widgets WHERE positive + negative > 0 
     ORDER BY ci_lower_bound DESC;