- 页面的访问量 - 在页面上发表的评论(底部有一个表单,用户可以发表评论) - 点击“喜欢”图标的次数
是否有什么公式可以用于计算热度?(如果没有,也可以提供意见)
(最初,我考虑使用浏览量+ 10 * 评论数+ 10 * 喜欢数)
实际上,有一种公认的最佳方式来计算这个值:
http://www.evanmiller.org/how-not-to-sort-by-average-rating.html
在将它作为“正面投票”值输入到公式中之前,您可能需要将“喜欢”和“评论”组合成单个分数,并为每个分数分配自己的加权因子。
从上面的链接中:
得分 = 伯努利参数的 Wilson 分数置信区间的下限
我们需要平衡正面评级比例和少数观察数据的不确定性。幸运的是,这个问题的数学计算早在1927年就由 Edwin B. Wilson 解决了。我们想要问的是:假设我已经有了这些评级,那么“真实”的正面评级比例至少是多少? 威尔逊给出了答案。只考虑正面和负面评级(即不使用5星级范围),正面评级比例的下限如下所示:
(在 plus/minus 处使用减号来计算下限。)这里的
p̂
是观察到的正面评级比例,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;
我使用,
(C*comments + L*likeit)*100/views
根据您对每个属性的重视程度,您必须使用C和L。我使用C=1和L=1。
这将为您提供生成积极操作的观看百分比,使具有更高百分比的项目成为最受欢迎的。我喜欢这个方法,因为它使新项目首先非常受欢迎,首先显示并获得更多的观看次数,从而变得不那么受欢迎(或更受欢迎),直到稳定下来。
无论如何,希望对您有所帮助。 PS:如果没有“*100”,它也可以正常工作,但我喜欢百分比。
您甚至可以尝试机器学习方法来“学习”组合每个数字的良好加权,就像您的示例公式一样。手动完成也可能不太困难。
这方面没有标准公式(怎么可能有呢?)
你所拥有的看起来像是一个相当正常的解决方案,可能会很好地发挥作用。当然,你应该尝试调整10的值以找到适合你需求的数值。
根据你的需求,你可能还想添加时间因素(即每周-X点数),以使旧页面变得不那么受欢迎。或者,你可以将“页面浏览次数”更改为“上月页面浏览量”。同样,这取决于你的需求,可能并不相关。
如果内容引发讨论,我更看重评论而不是“喜欢”。如果只是陈述事实,评论和点赞数量的比例应该相等(虽然我认为10有点太多了...)
访问次数是否考虑了用户花费的时间?您也可以使用这个指标,因为2秒的浏览量比3分钟的浏览量少。
Java代码{{link1:Anentropic的答案}}:
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;
}
}