爱收集资源网

网站评论排名的两种评价方式是怎样的?

网络整理 2024-02-12 20:05

目前好多网站采用的评论排行主要有两种,即绝对好评数(好评除以差评)和好评率(好评/总评)。这两种评价方法 都存在很明显的缺陷,以下为例子:

首先是A与B比较,A的绝对好评数是550-450=100,B的绝对好评数是60-40=20,从绝对好评数比较,A的排行应当在B的上面;A的好评率为550/(450+550)=55%,B的好评率为60/(40+60)=60%,从好评率来说B的排行要比A的排行好。

再来比较下C与D,从好评率出发,C的好评率为100%,而D的好评率为9/(1+9)=90%,单纯从数据上看D的排行要比C的排行落后。对于评论排行上述的方式是否是我们所须要的呢?这样的估算能够更好的彰显评论价值?正确的排行算法应当是如何的?

我们先做如下设定:

如果你熟悉统计学,可能早已看下来了,p服从一种统计分布,叫做“两项分布”(binomial distribution)。

p越大,就代表这个项目的好评比列越高,越应当排在后面。但是,p的可信性,取决于有多少人投票,如果样本太小,p就不可信。由于p服从”两项分布”,因此我们可以估算出p的置信区间。所谓“置信区间”,就是说,以某个机率而言,p会落在的那种区间。比如,某个产品的好评率是 80%,但是这个值不一定可信。根据统计学,我们只能说,有 95% 的掌握可以推断,好评率在 75% 到 85% 之间,即置信区间是[75%, 85%]。

通过前面的剖析,我们就可以推测出,如果要给一个评论进行排行,就须要考虑一下内容:

这样做的原理是,置信区间的宽窄与样本的数目有关。比如,

这两个项目的赞成票比列都是 80%

B的置信区间的下限值(75%)会比A(70%)大,所以B应当排在A后面。置信区间的实质,就是进行可信度的修正,弥补样本量过小的影响。如果样本多,就说明比较可信,不需要很大的修正,所以置信区间会比较窄,下限值会比较大;如果样本少,就说明不一定可信,必须进行较大的修正,所以置信区间会比较宽,下限值会比较小。

正态区间

二项分布的置信区间有多种估算公式,最常见的是“正态区间”(Normal approximation interval),教科书里几乎都是这些技巧。但是,它只适用于样本较多的情况(np > 5 且 n (1 – p) > 5)快手热门算法,对于小样本,它的准确性很差。

要了解正态区间前须要先把握一些正态分布的知识。

上图最右边的0%、90%、95%为置信水平。即数据录入[a,b]区间内的机率。与此对应的1.28$\sigma$、1.64$\sigma$、1.96$\sigma$,其中\sigma为标准差,1.28、1.64、1.96为z-score(标准分位)。在正态分布中,不同的置信水平对应的z值是固定的,如下为常见的90%、95%和99%对应的z值。

你可以通过搜索z-score table搜索到详尽的Z值对应置信水平的表格,如下图:

正态区间[a,b]的估算方式:

其中:

$$SE=\frac{S}{\sqrt{n}}$$

威尔逊区间

1927年,美国数学家 Edwin Bidwell Wilson 提出了一个修正公式,被称为,很好地解决了小样本的准确性问题。Reddit 目前使用的是评论算法就是基于威尔逊得分区间 (Wilson score interval)。具体代码片断可从开放的源代码中找到,将其转化成Python代码后:

from math import sqrt
 
def _confidence(ups, downs):
    n = ups + downs
 
    if n == 0:
        return 0
 
    z = 1.0 #1.0 = 85%, 1.6 = 95%
    phat = float(ups) / n
    return (phat+z*z/(2*n)-z*sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n)
def confidence(ups, downs):
    if ups + downs == 0:
        return 0
    else:
        return _confidence(ups, downs)

威尔逊得分区间具体公式如下:

$$\frac{\hat{p}+\frac{1}{2n}z^2 \pm z\sqrt{\frac{\hat{p}(1-\hat{p})}{n}+\frac{z^2}{4n^2}}}{1+\frac{1}{n}z^2}$$

其中:

可以公式听到,当n的值足够大时,这个下限值会趋于$\hat{p}$。如果n十分小(投票人甚少),这个下限值会大大大于$\hat{p}$。实际上,起到了减少“好评率”的作用,使得该评论的得分变小、排名回升。

威尔逊得分区并不关心一个评论的投票数,而关心好评数和投票总量或取样大小的相对关系!

上图是依据威尔逊得分区估算下来的值:一个评论有1个好评,没有差评,它的支持率是100%,但是因为数据量过小,系统还是会把它放在顶部。 但若果,它有10个好评,1个差评,系统可能会有足够的信息把他放在一个有着40个好评,20个差评的评论之前。因为我们基本确认当它有了40个好评的时侯,它收到的差评会多于20个。最好的一点是,一旦这个算法出错了(算法有15%的失效机率),它会很快领到更多的数据,因为它被排到了后面。

威尔逊得分区间不仅仅用于评论排行,它还适用于以下情境:

说了那么多,再来瞧瞧威尔逊得分区间的缺点,从前面的剖析中也很容易发觉问题,即排行榜前列总是这些票数最多的项目,新项目或则小众的项目,很难有出头机会。

另外被成为当代故事会的知乎回答的答复其实也是采用的威尔逊得分。

IMDB

IMDB.COM是目前互联网上最为权威、系统、全面的影片资料网站,里面包括了几乎所有的影片,以及1982 年以后的电视剧集。 它所特有的影片评分系统受到影迷的欢迎,注册的用户可以给任何一部电影打分并加以评析,而网站又会按照电影所得平均分、选票的数量等估算得出电影的加权平均分并借此进行TOP250(最佳250部电影)和Bottom100(最差100部电影)的排名。

如果是你,你会怎么进行排序?哪些维度会被你考虑在内?

以上两个诱因都是正相关,如何确定那个权重更高?比如:

如何估算能够确定哪部影片更好看?有的人可能觉得是A,有的人可能觉得B,作为平台怎样确定那个更好?

IMDB排行算法采用的是贝叶斯定理确定的其分值。在了解贝叶斯定理前,我们想要来理清一些概念。

什么是机率?

抛一枚硬币正面向下的机率是多少?

频率学派:事件A在独立重复试验中发生的频度趋向极限p,那么这个极限就是该风波的机率。理论基础:事件本身具有某种客观的随机性。

不能重复试验的场景下的机率又是哪些?

比如:苏州明天下午的机率是?

贝叶斯学派:把机率解释为对不确定的主管置信度,描述观察者知识状态在新的观测发生后怎样更新。理论基础:同一件事情对于知情者而言就是「确定风波」,对于不知情者而言就是「随机事件」,随机性并不始于风波本身是否发生,而只是描述观察者对该风波的知识状态。

平均数定理

在赌城里或听到有趣的人类行为。当投色子的人连续赢了几把的时侯,有些赌徒都会觉得他“手很顺”,打赌他就会继续赢。其他人说,根据“平均数定理”他接下来要输了,这样输赢能够平衡。从你的角度你觉得他会赢还是会输。

在解答上述问题前,我们先来看一个物理题,抛硬币,连续三次向下快手热门算法,下一次抛硬币还是正面机率是多少?

概率学派:只要我们认可硬币是均匀的(正负机率各半),且为独立同分布,则推论一直是50%。

贝叶斯学派:问题转换,你拿一个硬币,扔一百次,每当连扔出三个正面时你就把下一次抛掷的结果记出来,最后你的结果里正反面各占多少?下一次抛掷是正面的机率对不同的抛掷次数 n、连续出现正面的次数 k 和单次抛掷出现正面的机率 p 作图。“扔一百次,观察连扔出三个正面后下一次的结果” 对应着 n=100,k=3,p=0.5,所以下一次是正面的机率约为 0.46。

贝叶斯定理

贝叶斯定理是关于随机事件A和B的条件机率的一则定律。

$$P(A|B) = \frac{P(A)P(B|A)}{P(B)}$$

其中A以及B为随机风波,且P(B)不为零。P(A|B)是指在风波B发生的情况下风波A发生的机率。基于上式可推倒出:

$$P(B)=P(A,B)+P(A^C,B)=P(B|A)P(A)+P(B|A^C)P(A^C)$$

IMDB排行公式

$$WR=\frac{v}{v+m}R+\frac{m}{v+m}C$$

其中:

针对该公式的剖析:

这样做拉近了不同影片之间投票人数的差别,使得投票人数较少的影片也有可能排行前列。值得注意的是,虽然好多电影在资料系统中得分很高,但因为无法达到TOP所要求的最低投票数而未能出席排名。

IMDB影片排行算法的缺陷:

贝叶斯平均

把这个公式写成更通常的方式:

$$\bar{x}=\frac{C\times m+\sum_{i=1}^{n}x_i}{n+C}$$

其中:

这种算法被称为“贝叶斯平均”(Bayesian average)。因为某种程度上,它借鉴了“贝叶斯推断”(Bayesian inference)的思想:既然不知道投票结果,那就先恐怕一个值,然后不断用新的信息修正,使得它越来越接近正确的值。

在这个公式中,m(总体平均分)是“先验概率”,每一次新的投票都是一个调整因子,使总体平均分不断向该项目的真实投票结果紧靠。投票人数越多,该项目的”贝叶斯平均”就越接近算术平均,对排行的影响就越小。因此,这种方式可以给一些投票人数较少的项目,以相对公正的排行。

“贝叶斯平均”也有缺点,主要问题是它假定用户的投票是正态分布。比如,电影A有 10 个听众评分,5个为四星,5个为一星;电影B也有 10 个听众评分,都给了三星。这两部影片的平均得分(无论是算术平均,还是贝叶斯平均)都是三星,但是影片A可能比影片B更值得看。

解决这个问题的思路是,假定每位用户的投票都是独立风波,每次投票只有n个选项可以选择,那么这就服从“多项分布”(Multinomial distribution),就可以结合贝叶斯定理,计算该分布的期望值。由于这涉及复杂的统计学知识,这里就不深入了。

问题:豆瓣的TOP 250排序?

StackOverflow

Stack Overflow是一个专门针对程序员的问答网站,它能解决代码开发中遇见的好多问题。StackOverflow的排序共分为两类,1个是问题排序,1个是答案排序。这里主要介绍的是关于热门问题的排序。

在剖析问题前可以先考虑下,如果是你来做这个排行算法须要考虑什么诱因?

StackOverflow在开始设计热门排序规则时考虑的诱因:

在2008年8月23日的时侯,StackOverflow的创始人Jeff Atwood以前公布了一个热门问题的排行算法(链接):具体为:

$$\frac{(\log_{10}Qviews)\times 4+\frac{Qanswers\times Qscore}{5}+sum(Ascores)}{((Qage+1)-(\frac{Qage-Qupdated}{2}))^{1.5}} = \frac{(\log_{10}Qviews)\times 4+\frac{Qanswers\times Qscore}{5}+sum(Ascores)}{(1+\frac{Qage}{2}+\frac{Qupdated}{2})^{1.5}}$$

Qviews(问题的浏览次数) log(Qviews)*4

某个问题的浏览次数越多,就代表越受关注,得分也就越高。这里使用了以 10为底的对数,用意是当访问量越来越大,它对得分的影响将不断变小。

Qscore(问题得分)和 Qanswers(回答的数目) (Qanswers * Qscore)/5

Qscore(问题得分)= 赞成票-反对票。如果某个问题越遭到好评,排名自然应当越靠前。Qanswers 表示回答的数目,代表有多少人参与这个问题。这个值越大,得分将成倍放大。这里须要注意的是,如果无人回答,Qanswers 就等于0,这时 Qscore 再高也没用,意味着再好的问题,也必须有人回答,否则进不了热点问题排行榜。

Ascores(回答得分) sum(Ascores)

一般来说,”回答”比”问题”更有意义。这一项的得分越高,就代表回答的质量越高。但是简单加总的设计还不够全面。这里有两个问题。首先,一个正确的回答胜于一百个无用的回答,但是,简单加总会引起,1个得分为 100 的回答与 100 个得分为 1 的回答,总得分相同。其次,由于得分会出现负值,因此这些非常差的回答,会拉低正确回答的得分。

快手热门算法_快手热门算法机制_快手热门计算公式

Qage(距离问题发表的时间)和 Qupdated(距离最后一个回答的时间) ((Qage+1) – ((Qage – Qupdated)/2)) ^ 1.5

Qage 和 Qupdated 的单位都是小时。如果一个问题的存在时间越久,或者距离上一次回答的时间越久,Qage 和 Qupdated 的值就相应减小。也就是说,随着时间流逝,这两个值就会越变越大,导致分母减小,因此总得分会越来越小。

此算法目前是否还继续使用或则是否改变不得而知。将其转化成Python代码为:

import time, math
def hot(Qviews, Qanswers, Qscore, Ascore, date_ask, date_active):
    Qage = round((time.time() - date_ask) / 3600)
    Qupdated = round((time.time() - date_active) / 3600)
    return (math.log10(Qviews) * 4 + Qanswers * Qscore / 5 + Ascore) / (pow((Qage + 1) - (Qage - Qupdated) / 2, 1.5))

Stack Overflow 热点问题的排行,与参与度(Qviews 和 Qanswers)和质量(Qscore 和 Ascores)成正比,与时间(Qage 和 Qupdated)成反比。以下为个人思索点:

为什么不使用“声望值”?

提问的目的是获得正确的答案,而不是谁参与了此问题。声望值列入容易引起,在没有威望认识加入的情况下,问题未能步入热门榜。

浏览量与分值的关系 log(Qviews)*4

这类对浏览量做了一次对数处理,主要目标应当是避免浏览量较大的问答占着榜单不动,抑制马太效应。这里再对结果*4,应该是因为10为第的对数抑制疗效太大了,乘4稍为加强权重的影响。

针对此部份内容,我觉得可以简化为:

$$ \log_{10}{x}=\log_{b}{x}\Rightarrow b=\sqrt[4]{10}=1.78$$

即将底数从10改为1.78,或者以2为底。

答案数和投票数与分值关系 $\frac{Qanswers\times Qscore}{5}$

这里的将答案的分值与答案数相加,我个人觉得是不适宜。问题是否热门与回答数目正相关?与答案的分值正相关?这里将分数乘以5,我的推测是答案数、投票分的权重,考虑到问题答案数目普遍较少,猜想是想投票分的影响。

是否合理?

我建议的更改方案是:Qstatus * Qupvote:

答案投票数与分值关系 sum(Ascore)

是否合理?

以上问题那个更好?从现有的公式中最好的可能是A和B,实际上更高的其实应当是AC?

建议优化方案:Ascore只取投票数为正(Ascore>0)的答案,取每位分值平方和的开方(Square root of sum of squares):$\sqrt{x_1^2+x_2^2+…+x_n^2}$

提问时间与最后解答时间与分值关系 $(1+\frac{Qage}{2}+\frac{Qupdated}{2})^{1.5}$

如何理解影响关系?

总体评价:Stack Overflow的排序算法特别的狭小,还有好多优化空间。

SegmentFault

SegmentFault 参考了Stack Overflow的热门算法设置了自己的排序算法,具体排序算法如下:

热门文章

对于热门文章,使用了如下公式:

$$\frac{\lg(views)*4+recommendScore+collectScore+\ln(articleComments)}{(1+\frac{age}{2}+\frac{update}{2})^i}$$

其中

热门问答

对于热门问答,使用了如下公式:

$$\frac{\lg(views)*4+\frac{sum(Qanswers * answerScores + Qscore)}{5}+ln(commentScore)}{(1+\frac{age}{2}+\frac{update}{2})^i}$$

热门问答的估算参考了 Stack Overflow 对于回答数目和问题得票数的处理。同时,结合我们的实际,将评论的得票数也做为一个诱因加入估算。

其余的变量涵义和文章算法相同。

日/周/月热门

首先要明晰各种不同热门内容的目的。

所以,该如何做呢?对于同一内容,上面的估算公式均可简化为:$\frac{s}{t^i}$

可以看出,其热度和创建时间成反比,那么这个正比的值最终就由重力因子 i 来影响。

日热门为了突出新热内容、过滤时间过久的热门内容,需要减小重力因子,尽可能排除 24 小时之外的热门内容;周热门和月热门则须要按时间要求依次逐步降小 i 值。

关于指数 i 值的选取,采取了计算:绘制出一定范围内时间和文章热度的指数函数的图,然后依照需求选购满足自己条件的指数值。如下图:

多次市值测试,最终分别将日、周、月的 i 值选定为 1.0、0.5、0.3。

参考链接:

相关文章:机器学习算法之决策树分类推荐算法之矩阵分解机器学习之距离与相似度估算时间序列异常检查算法综述深度学习之BP神经网络

快手热门算法