与文章新闻类排名不同的事,评论类的算法可能发表时间没有什么关系。
目前很多网站采用的评论排名主要有两种,即绝对好评数(好评减去差评)和好评率(好评/总评)。这两种评价方式 都存在很明显的缺陷,以下为事例:
- A:好评550; 差评450
- B:好评60;差评40
- C:好评1;差评0
- D:好评9,差评1
首先是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的排名落后。对于评论排名上述的方法是否是我们所需要的呢?这样的计算才能更好的体现评论价值?正确的排名算法应该是怎样的?
我们先做如下设定:
- 每个用户的投票都是独立事件。
- 用户只有两个选择,要么投好评,要么投差评。
- 如果投票总人数为n,其中好评为k,那么好评率p就等于k/n。
如果你熟悉统计学,可能已经看出来了,p服从一种统计分布,叫做“两项分布”(binomial distribution)。
p越大,就代表这个项目的好评比例越高,越应该排在前面。但是,p的可信性,取决于有多少人投票,如果样本太小,p就不可信。由于p服从”两项分布”,因此我们可以计算出p的置信区间。所谓“置信区间”,就是说,以某个概率而言,p会落在的那个区间。比如,某个产品的好评率是 80%,但是这个值不一定可信。根据统计学,我们只能说,有 95% 的把握可以断定,好评率在 75% 到 85% 之间,即置信区间是[75%, 85%]。
通过上面的分析,我们就可以推断出,如果要给一个评论进行排名,就需要考虑一下内容:
- 计算每个评论的”好评率”
- 计算每个”好评率”的置信区间(以 95% 的概率)。
- 根据置信区间的下限值,进行排名。这个值越大,排名就越高。
这样做的原理是,置信区间的宽窄与样本的数量有关。比如,A有 8 张赞成票,2张反对票;B有 80 张赞成票,20张反对票。这两个项目的赞成票比例都是 80%,但是B的置信区间(假定[75%, 85%])会比A(假定[70%, 90%])窄得多,因此B的置信区间的下限值(75%)会比A(70%)大,所以B应该排在A前面。
置信区间的实质,就是进行可信度的修正,弥补样本量过小的影响。如果样本多,就说明比较可信,不需要很大的修正,所以置信区间会比较窄,下限值会比较大;如果样本少,就说明不一定可信,必须进行较大的修正,所以置信区间会比较宽,下限值会比较小。
二项分布的置信区间有多种计算公式,最常见的是“正态区间”(Normal approximation interval),教科书里几乎都是这种方法。但是,它只适用于样本较多的情况(np > 5 且 n (1 − p) > 5),对于小样本,它的准确性很差。
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)
使用到的威尔逊得分区间具体公式如下:
其中
- p 是好评率
- n 是总投票数
- Z (1-α/2) 表示对应某个置信水平的z统计量,这是一个常数,可以通过查表得到。一般情况下,在 95% 的置信水平下,z统计量的值为1.96。
可以公式看到,当n的值足够大时,这个下限值会趋向。如果n非常小(投票人很少),这个下限值会大大小于
。实际上,起到了降低”好评率”的作用,使得该评论的得分变小、排名下降。
威尔逊得分区并不关心一个评论的投票数,而关心好评数和投票总数或采样大小的相对关系!
上图是根据威尔逊得分区计算出来的值:一个评论有1个好评,没有差评,它的支持率是100%,但是由于数据量过小,系统还是会把它放到底部。 但如果,它有10个好评,1个差评,系统可能会有足够的信息把他放到一个有着40个好评,20个差评的评论之前。因为我们基本确认当它有了40个好评的时候,它收到的差评会少于20个。最好的一点是,一旦这个算法出错了(算法有15%的失效概率),它会很快拿到更多的数据,因为它被排到了前面。
威尔逊得分区间不仅仅用于评论排名,它还试用于以下情景:
- 垃圾邮件检测:看到这个内容并将它标记成垃圾邮件的百分比有多少?
- 创建精华列表:看到这个内容并将它加星标件的百分比有多少?
- 创建最受欢应列表:看到这个内容并将它转发给朋友的百分比有多少?
参考文章:
http://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval#Wilson_score_interval
http://blog.reddit.com/2009/10/reddits-new-comment-sorting-system.html
http://www.evanmiller.org/how-not-to-sort-by-average-rating.html
相关推荐
Reddit 热门排名算法 基于 reddit 热门排名算法计算和 item 的分数。 对于科学背后的阅读 安装 npm install hot-ranking 用法 hot(upvotes, downvotes, date) // Load library var hot = require("hot-ranking"); ...
相对 Reddit 评论 通过添加衡量相对精彩程度的颜色编码徽章来发现很棒的 Reddit 评论 介绍 Reddit评论线程很难阅读。 相对 Reddit 通过在每个评论的分数旁边添加一个颜色编码的徽章,可以很容易地在一个线程中发现...
排名算法安装$ go get github.com/alextanhongpin/go-rate跑func main () { upvotes := 1000 downvotes := 10 score := rate . Wilson ( upvotes , downvotes ) // or createdAt := time . Now () score := rate . ...
reddit-fetch获取评论一个简单的程序来获取reddit帖子的顶级评论当您有类似的线程时很有用, 什么是对python有帮助的最佳资源? 你最喜欢的专辑是什么? 然后,将仅列出您可以保存的所有内容的名称。跑步克隆存储库...
测量给定数据集相关性的算法,类似于Reddit
将图片添加到reddit评论 这是在测试阶段。请发表评论,我可以如何提高:) 也欢迎图标 支持语言:English
reddit is fun yeppy caye!
这是reddit官方网站源代码。 标签:reddit
Reddit评论网络分析 从2017年11月开始对reddit评论进行网络分析,重点是机器人账户。 依存关系 Python 2.7.13,BeautifulSoup,urllib2,随机,时间,re,os,json,numpy,pandas,matplotlib,zen 评论数据集信息 ...
Reddit产品数据集
Reddit刮板 这是一个用Python编写的相当简单的多线程reddit注释抓取器和解析器。 我不建议在任何环境中(尤其是在生产环境中)未经修改地使用此代码。 立足于MetaReddit和AutoModerator。 这已通过Python 2.6.9...
保存您正在查看的当前reddit页面的缓存副本,以便在被删除的情况下保留注释。 保存您正在查看的当前reddit页面的...如果以后删除评论,则可以直接缓存该页面的副本,以查看任何未经编辑或删除的评论。 支持语言:English
这是目前发布过的最好 Reddit App
reddit_crawlers, 将尝试制作有趣的reddit爬虫,提供一些洞察力 reddit_crawlers将尝试制作有趣的reddit爬虫,提供一些洞察力使用 python praw库对于着色 bot: 我们使用以下 python 附加软件包:...
一种更优雅的解决方法,让reddit的评论树崩溃。 通过单击您希望折叠的评论列来折叠评论及其所有回复。不再陷入庞大的评论链的中间,只需选择最外面的列即可折叠整个顶级评论。注意-此扩展名仅与old.reddit.com兼容。...
使用遗传 算法为 reddit 上的 meme 生成字符串_JavaScript_代码_下载
在阅读Reddit中的评论时,厌倦了打开每个链接?这个扩展在一个窗口内弹出打开链接来帮助你更多的Reddit。 借助此轻量级扩展,可以享受更好的Reddit体验,从而节省了在新标签页中加载评论链接的时间。 轻松跟踪/ r / ...
折叠reddit评论树的更优雅的解决方案 通过单击您希望折叠的评论列来折叠评论及其所有回复。 不再陷于庞大的评论链的中间,只需选择最外面的列即可折叠整个顶级评论。 注意-此扩展名仅与old.reddit.com兼容。 您可以...
Redditscraper 一种通过python从reddit抓取评论和发布数据的方法