【问题标题】:Formula for popularity? (based on "like it", "comments", "views")人气公式? (基于“喜欢”、“评论”、“意见”)
【发布时间】:2010-06-09 07:13:12
【问题描述】:

我在网站上有一些页面,我必须根据“人气”/“活动”创建排序

我必须使用的参数是:

  • 页面浏览量
  • 页面制作的cmets(底部有一个表格,用户可以制作cmets)
  • 对“喜欢”图标的点击次数

对于流行度公式有什么标准吗? (如果不是意见也很好)

(一开始我想到的是views + 10*cmets + 10*likeit)

【问题讨论】:

  • 您如何评估正面 cmets 与负面 cmets? “likeits”应该和 cmets 一样重要吗?
  • 我们不评估正面与负面的 cmets。 “likeits”是否应该与 cmets 一样重要,这是我要扔掉的东西。我很灵活。 (也许“最活跃”比“最流行”更好)

标签: algorithm formula popularity


【解决方案1】:

实际上有一种公认的最佳计算方法:
http://www.evanmiller.org/how-not-to-sort-by-average-rating.html

您可能需要将 'likes' 和 'cmets' 组合成一个分数,为每个分数分配您自己的权重因子,然后将其作为 'positive vote' 值插入公式。

来自上面的链接:

分数 = 威尔逊分数置信区间的下限 伯努利参数

我们需要平衡正面评价的比例与 少数观测的不确定性。幸运的是, Edwin B. Wilson 于 1927 年提出了这个数学公式。我们想要什么 要问的是:鉴于我的收视率,有 95% 的机会 正面评价的“真实”部分至少是什么? Wilson 给出了 回答。仅考虑正面和负面评级(即不是 5星等级),正面评级比例的下限 是(谁)给的:

(在表示加/减的地方使用减来计算下限。) 这里观察到的正面评价分数,zα/2(1-α/2) 标准正态分布的分位数,n 是 评分总数。在 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 是好评数,n 是总评分 评级,置信度是指统计置信度: 选择 0.95 有 95% 的机会你的下限是正确的,0.975 有 97.5% 的机会,等等。这个函数中的 z 分数从不 更改,因此如果您手边没有统计数据包,或者如果 性能是一个问题,您始终可以在此处为z 硬编码一个值。 (对于 0.95 的置信水平,使用 1.96。)

与 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;

【讨论】:

    【解决方案2】:

    对此没有标准公式(怎么会有?)

    您所拥有的看起来是一个相当正常的解决方案,并且可能会运作良好。当然,您应该使用 10 来寻找适合您需要的值。

    根据您的要求,您可能还需要添加时间因素(即每周 -X 点),以便旧页面变得不那么受欢迎。或者,您可以将“页面浏览量”更改为“上个月的页面浏览量”。同样,这取决于您的需求,可能不相关。

    【讨论】:

      【解决方案3】:

      您可以执行 YouTube 所做的事情 - 只需按每个类别的最大数量对其进行排序。例如 - 查看最多、评论最多、最喜欢。在每个类别中,不同的页面可能首先出现,尽管排名可能是相关的。如果您只需要一个排名,那么您将不得不提出某种公式,最好通过分析您已经拥有的一堆数据并确定应该计算为好/坏的数据,然后向后工作以适应适合您决定的方程式。

      您甚至可以尝试使用机器学习方法来“了解”在您的示例公式中组合这些数字的最佳权重是什么。手动完成也可能不会太难。

      【讨论】:

      • 感谢您的建议,您提出的选项已经是结果列表中的选项。最后的“整体人气”是我想要在这里得到的。
      【解决方案4】:

      我用过,

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

      您必须在哪里使用 C 和 L,具体取决于您对每个属性的重视程度。 我使用 C=1 和 L=1。

      这为您提供了产生积极行动的视图百分比,使项目与 较高的百分比最“流行”。 我喜欢这样,因为它可以让新商品一开始很受欢迎,首先出现并获得更多观看次数,从而在稳定之前变得不那么受欢迎(或更多)。

      无论如何, 我希望它有帮助。 PS:如果没有“*100”,它的工作原理是一样的,但我喜欢百分比。

      【讨论】:

      • 真的很好。我喜欢这是多么有效和简单。
      【解决方案5】:

      我更看重 cmets,而不是“喜欢它的内容是否会引起讨论”。如果只是陈述事实,那么 cmets 之类的数量似乎还可以(虽然 10 有点太多了,我认为...)

      访问是否考虑到用户以某种方式花费的时间?您也可以使用它,因为 2 秒的视图意味着不到 3 分钟的视图。

      【讨论】:

        【解决方案6】:

        Anentropic's answer 的 Java 代码:

        public static double getRank(double thumbsUp, double thumbsDown) {
          double totalVotes = thumbsUp + thumbsDown;
        
          if (totalVotes > 0) {
            return ((thumbsUp + 1.9208) / totalVotes - 
              1.96 * Math.sqrt((thumbsUp * thumbsDown) / totalVotes + 0.9604) / 
              totalVotes) / (1 + (3.8416 / totalVotes));
          } else {
            return 0;
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2013-05-26
          • 2016-03-24
          • 2013-11-05
          • 1970-01-01
          • 1970-01-01
          • 2020-10-07
          • 1970-01-01
          • 1970-01-01
          • 2018-04-14
          相关资源
          最近更新 更多