satan 通过 Google 阅读器发送给您的内容:
之前看到阮一峰的文章的排名算法,突然想到之前看的社交网络中facebook的创始人因为失恋,而恶意搞他们学校的女生时,用的排名算法正就是其中的一种。其实在看后这些简单的数学公式之后,觉得并不是什么高深的知识,就是平时所学的东西,只是连我们平时都不知道怎么用。
最近做一个系统,也要为用户推送文章,也正是用了其中的一种的算法。不过,后面我们发现,对于频繁更新的feed源,他们的文章始终排在前面【因为考虑了时间】,比如CSDN的系统,每隔几分钟就有一篇博文,然后我同学说,推送的文章的全都是CSDN的,而且几乎都是代码,代码,这样不好吧。我也开始想用什么方法,去解决这个问题,但是又不能太特殊。【channel_id是推送文章的源id号】
起初,最原始的想法就是限制每个feed源的推送数量,但是我觉得这样推频繁更新的Feed源太不公平了,因为对于一个频繁更新的源,可能总是只有前面几篇文章被推送给用户,不公平啊。然后自然又想到了另一个方法,就是对于每一个feed的文章排序【这样就可以随即调整该feed里的文章的顺序了】,然后再限制每一个feed的推送数量。但是总是感觉这些方法,有点麻烦,而且没有随机性。
这时,想到了之前的一篇博文,然后就借助抖动的思想,给了这些文章排名加入了抖动。效果果然比较好,效果如下
这样一看,对于每一个有更新的feed,我们都能公平给它机会展示他们的新作,而且对于产生的排名看,没有人工的干预和特殊处理。
当然,我觉得抖动这种思想应该可以更加的发挥好,但我只是设计了简单的随机函数,希望你能设计好的随机函数。
当然,这里的随即函数有以下要求:因为文章的排名算法,我们有赞的功能,所以,按理说,这些赞过的文章应该排名靠前,所以我们在加入抖动的贡献值,不能超过赞一次的分数。比如在我们的系统中,我们赞一次,对文章的贡献的是1分,所以,在抖动时,我们的最大贡献值不能超过1分。
下面是随机函数:
import random def random_desc(start, high): while True: if random.randint(0, 100) % 3 == 0: start += random.random() else: start -= random.random() if start > high: continue yield start
你会发现,我们对同一个feed里文章用此函数进行抖动后,会有以下现象,我们允许局部递增,这时对于同一个feed源里的文章就不是严格意义上的按时间排序,也就是说,他们都有被推送在前面的可能;但是,对于同一个feed整体来说,我们需要它递减【贡献的分数是负数】,这样我们就可以限制同一个feed里推送文章的数量。
当然,这些小技巧其实不是什么大思想,也没有解决什么大问题,但是我觉得这种抖动的思想确实不错。
可从此处完成的操作:
- 使用 Google 阅读器订阅白杨 baiyang
- 开始使用 Google 阅读器,轻松地与您喜爱的所有网站保持同步更新
没有评论:
发表评论