`
wbj0110
  • 浏览: 1598235 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论
阅读更多

与文章新闻类排名不同的事,评论类的算法可能发表时间没有什么关系。

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

  • 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的排名落后。对于评论排名上述的方法是否是我们所需要的呢?这样的计算才能更好的体现评论价值?正确的排名算法应该是怎样的?

我们先做如下设定:

  1. 每个用户的投票都是独立事件。
  2. 用户只有两个选择,要么投好评,要么投差评。
  3. 如果投票总人数为n,其中好评为k,那么好评率p就等于k/n。

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

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

通过上面的分析,我们就可以推断出,如果要给一个评论进行排名,就需要考虑一下内容:

  1. 计算每个评论的”好评率”
  2. 计算每个”好评率”的置信区间(以 95% 的概率)。
  3. 根据置信区间的下限值,进行排名。这个值越大,排名就越高。

这样做的原理是,置信区间的宽窄与样本的数量有关。比如,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

分享到:
评论

相关推荐

    基于用户投票的排名算法.pdf

    基于用户投票的排名算法是一种将信息按照重要性依次排列的方法,该算法广泛应用于互联网中的各种平台,例如 Delicious、Hacker News 和 Reddit 等。这些平台都使用了基于用户投票的排名算法来对信息进行排名,帮助...

    hot-ranking:Reddit 热门排名算法

    Reddit 热门排名算法 基于 reddit 热门排名算法计算和 item 的分数。 对于科学背后的阅读 安装 npm install hot-ranking 用法 hot(upvotes, downvotes, date) // Load library var hot = require("hot-ranking"); ...

    测量给定数据集相关性的算法类似于Reddit

    标题提到“测量给定数据集相关性的算法类似于Reddit”,这可能指的是Reddit使用的热点排名算法,它涉及到对用户行为数据的分析,以确定内容的相关性和流行度。 Reddit是一个社交新闻网站,它的热点排名算法基于用户...

    从豆瓣电影评分算法说起.pdf

    5. 推荐阅读:文档提到了阮一峰博客中的系列文章,如《基于用户投票的排名算法》,这些文章涉及了不同网站使用用户投票进行排名的算法,包括Delicious、Hacker News、Reddit、StackOverflow等。这些算法的探讨,对于...

    go-rate: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机器人,用于汇总以西班牙语或英语撰写的新闻报道。 它使用定制的算法对单词和句子进行排名

    summary.py脚本,该脚本将自定义算法应用于文本字符串,并提取排名最高的句子和单词。 bot.py机器人,用于检查subreddit的最新提交内容。 它管理已处理提交的列表,以避免重复。要求该项目使用以下Python

    Reddit:Reddit克隆

    Reddit是一个社交新闻网站,用户可以提交链接、文本帖子,并对其他用户的帖子进行投票,这些投票决定了帖子在页面上的排名。它还包含子论坛(称为Subreddits),涵盖了各种主题,用户可以根据兴趣订阅。 克隆Reddit...

    Algorithm-go-rate.zip

    2. **时间衰减**:为了避免旧帖子长期占据高排名,Reddit算法引入了时间因素。随着时间的推移,帖子的得分会逐渐降低,使得新发布的帖子有更多机会出现在前列。这在算法实现中通常通过一个衰减函数来体现,如指数...

    Reddit Search-crx插件

    值得注意的是,由于这款插件是基于Google搜索的,因此其搜索效果受制于Google的搜索算法和Reddit的排名机制。有时,可能需要结合其他搜索工具或直接访问Reddit网站来获取最全面的信息。同时,为了保护用户隐私,...

    算法工程师的三观测试.pdf

    通过 Reddit 上的一个讨论,问题的焦点变成了“什么才是最能提升模型性能的方法呢”。讨论的结果显示,大多数人认为数据是提升模型性能的最重要因素。 数据的重要性 讨论中,大多数人认为数据是提升模型性能的最...

    reddit_product_search

    我们可以根据用户的喜好、评分、评论数量等因素对产品进行排名。Python的`pandas`库非常适合处理这样的数据,而机器学习库如`scikit-learn`则可以用于构建推荐算法。 总的来说,"reddit_product_search"项目涵盖了...

    feeds流优质内容排序机制

    文档介绍了基于用户投票的排名算法,该算法通过计算赞成票与反对票的绝对差值(z=|赞成票-反对票|),并将发表时间(t)结合考虑,来给文章打分。具体来说,赞成票多于反对票时,y值为1;两者相等时,y值为0;否则,...

    搜索引擎优化.pdf

    同时,SEO专家需要密切关注搜索引擎的算法变化,以适应其排名策略。 提交网站到搜索引擎和目录也是优化过程的一部分。选择高质量的目录进行提交,避免使用自动化工具,因为这些工具可能被视为作弊行为,可能导致...

    karma_farm:CS371m 秋季 2014 的 Android 应用程序

    业力农场 在 Mike Scott 教授的监督下为 CS371m(2014 年秋季)开发的 ... 通过使用我们开发的算法,我们按“业力潜力”对每条评论进行排名,并允许用户回复评论。 后端 REST API 的代码可以在 [here] ( ) 中找到。

    Groundhog:众包搜索结果挖掘

    想想谷歌的reddit。 每个搜索查询都会成为讨论。 其他像你一样想知道同样事情的人可以贡献他们的发现、他们的见解和他们的React。 特定于您的搜索。 结果按 Google 自己的网页排名和用户投票的组合进行排名。 结果...

    社交网络的用户与内容评估.docx

    例如,微博的高转发数和Facebook的虚假点赞问题暴露了单纯依赖用户关注数的局限性,而基于用户评分的内容筛选机制在Reddit、Hacker News和Quora等平台上表现出较好的效果。 尽管存在虚假用户、恶意推广和恶意软件等...

    decide-topics:直接民主互动发现系统

    先前的分析表明此问题是由接口产生的: 请愿书显示在分页列表中,该分页列表按非最佳排名算法Hot score进行排序。 该方法旨在对Reddit上的新闻条目进行排名,这些新闻通常会Swift下降,而在线请愿则需要更长的可见...

    竞争性编程

    9. **在线评测系统**:如Codeforces、LeetCode、HackerRank等在线平台提供了实时的评测和排名,是学习和练习竞争性编程的好地方。通过参加这些比赛,可以提升编程技巧,增强解决问题的能力。 10. **团队合作与交流*...

    javascript-articles-monthly:JavaScript 文章精选月刊

    2019年1月之前的月刊内容同步自 ,他们通过分享数、阅读时间以及自定义的机器学习算法为文章进行排名。整体筛选比例大约为 0.8%。 从2019年1月起,月刊不再同步其统计结果,而是整合包含 reddit、DEV、inDepthDev、...

Global site tag (gtag.js) - Google Analytics