我在网站上有一些页面,我必须根据“人气”/“活动”创建排序
我必须使用的参数是:
- 页面浏览量
- 在页面上发表的评论(底部有一个表格,用户可以发表评论)
- 点击“喜欢”图标
流行度公式有什么标准吗?(如果不是意见也很好)
(一开始我想到的是浏览量+10*评论+10*赞)
我在网站上有一些页面,我必须根据“人气”/“活动”创建排序
我必须使用的参数是:
流行度公式有什么标准吗?(如果不是意见也很好)
(一开始我想到的是浏览量+10*评论+10*赞)
实际上有一种公认的最佳计算方法:
http ://www.evanmiller.org/how-not-to-sort-by-average-rating.html
您可能需要将“喜欢”和“评论”组合成一个分数,为每个分数分配您自己的权重因子,然后将其作为“正面投票”值插入公式。
从上面的链接:
分数 = 伯努利参数的威尔逊分数置信区间的下限
我们需要平衡正面评价的比例与少量观察的不确定性。幸运的是,Edwin B. Wilson 于 1927 年计算出了这方面的数学。我们要问的是:鉴于我的评分,有 95% 的可能性是正面评分的“真实”部分至少是什么?威尔逊给出了答案。仅考虑正面和负面评级(即不是 5 星等级),正面评级比例的下限由下式给出:
(在表示加/减的地方使用减来计算下限。)这
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 -score 在这个函数中永远不会改变,所以如果你手边没有统计数据包或者如果性能是一个问题,你总是可以在这里硬编码一个值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;
你可以做YouTube所做的事情- 只需按每个类别的最大数量对其进行排序。例如 - 查看最多、评论最多、最喜欢。在每个类别中,不同的页面可能首先出现,尽管排名可能是相关的。如果您只需要一个排名,那么您将不得不提出某种公式,最好通过分析您已经拥有的一堆数据并确定应该计算为好/坏的数据,然后向后工作以适应适合您决定的方程式。
您甚至可以尝试一种机器学习方法来“学习”在您的示例公式中组合每个数字的良好权重是什么。手动进行也可能不会太难。
对此没有标准公式(怎么可能?)
你所拥有的看起来像是一个相当正常的解决方案,并且可能会很好用。当然,您应该使用 10 来找到适合您需要的值。
根据您的要求,您可能还需要添加时间因素(即每周 -X 点),以便旧页面变得不那么受欢迎。或者,您可以将“页面浏览量”更改为“上个月的页面浏览量”。同样,这取决于您的需求,它可能不相关。
我用,
(C*comments + L*likeit)*100/views
根据您对每个属性的重视程度,您必须使用 C 和 L。我使用 C=1 和 L=1。
这为您提供了产生积极行动的视图百分比,使具有较高百分比的项目最“流行”。我喜欢这个,因为它可以让较新的项目一开始很受欢迎,首先出现并获得更多的浏览量,因此在稳定之前变得不那么受欢迎(或更多)。
无论如何,我希望它有所帮助。PS:如果没有“* 100”,它的工作原理是一样的,但我喜欢百分比。
我更看重评论,而不是“就像内容邀请讨论一样”。如果只是陈述事实,那么评论和类似数量的平等配给似乎还可以(尽管我认为 10 有点太多了......)
访问是否考虑到用户以某种方式花费的时间?您也可以使用它,因为 2 秒的视图意味着不到 3 分钟的视图。
Anentropic 的答案的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;
}
}