统计热门文章的算法
作者:canque 来源:canque博客 发布时间:2008-03-16 15:40:00
临近下班的时候,突然想到统计热门文章的问题。以前我所知道的热门文章统计,基本有这么几种:
按点击数排序 该方法最大的问题在于热门的文章会越来越热门,最终失去热门文章的意义。
按点击和时间排序 即找出某时间段内,点击数靠前的文章。这种方法的问题是好的文章可能会太早地下去,而某些并不好的文章却因为某时间段文章少而成为热门。
这些都不是我们所期望的。
下面我们开始设计一个热门文章的算法。先设一些参数:R-文章得分数,H-文章点击数,D-文章发布的天数
第一天:
我们假设用户每点击文章一次就是为该文章投了一票,那么当有100个用户点击某文章时,该文章的得分是100分。用类似的办法算出所有文章的分数。那么分数最靠前的就是热门文章。
公式:
R(1)=H(1)
第二天:
由于昨天的热门文章已经显示在页面的显著位置,它更容易被点击。所以不能再单纯的按点击数计算,应该引入一个因数K,K随时间增加而减小。于是第二天的计算公式为:
R(2)=R(1)+K(D(2))*H(2)
……
依次类推
第N天(N是一个有限值,比如100,因为超过100天的文章即使再好也不应该成为热门)
R(N)=R(N-1)+K(D(N))*H(N)
问题转换为设计一个合适的K。一般来说,K的确定应该参考网站性质、更新频率、以及网站的交互程度等。这是我设计的一个K
K(N)=cos((D(N)*PI)/(N*2))/sqrt(D(N)+1)
于是我们的公式为(千万不要被这些字母唬住,只是一些小学数学而已^_^)
R(N)=R(N-1)+cos((D(N)*PI)/(N*2))/sqrt(D(N)+1)*H(N)
细心的朋友会发现,其实这种方法并不完善,主要是这种点击评分的思想不合理。因为访客很多时候点击前其实并不了解文章内容,他们甚至经常会点到自己不喜欢的文章。为了解决这个问题,我们还需要引入另外的参数——投票数。投票数就是文章看完后的评价,尽量简单,最好就是一个好或者不好,也可以有个评分。总之,不要强迫用户去使用键盘。假设文章的投票数为V。因为V是用户的反馈信息,更能代表文章的好坏程度,因此在热门文章的计算上应该具有较高的权重。
最终公式:
R(N)=R(N-1)+cos((D(N)*PI)/(N*2))/sqrt(D(N)+1)*(0.3*H(N)+0.7*V(N))
最后补充一下,由于计算涉及到浮点数、余弦和开方,所以稍显复杂,在实际计算中完全可以用近似值代替。如果你有什么好的想法或者思路,也请告诉我,谢谢。


猜你喜欢
- <html> <head> <title>获取ACCESS数据库表名 -&
- 自动上次ymPrompt组件发布,自己就曾发现在IE8下遮罩的半透明滤镜有时无效的问题,后来也有网友提出过这个问题,但自己一直也没有太多关注
- 今天在一个QQ群中看到有人在问一个进度条的实现方式,当时因为工作时间,需求相对也比较紧,只是简单的说了一下可以通过CSS的边框属性和背景属性
- 一个ASP文件通常包含HTML标签,有时和一个HTML文件非常类似。然而,ASP文件(除了包含HTML标签外),还可以包括服务器的脚本程序,
- XHTML规范中有一条标准就是“每个XHTML标签都有一个结束标记”。那么对于HTML中原来不带结束标记的元素,则在该结束前加上“/”来关闭
- 大家一定使用过 phpmyadmin 里面的数据库导入,导出功能,非常方便。但是在实际应用中,我发现如下几个问题: 1、数据库超过一定尺寸,
- 我们都知道ACCESS是ASP的亲密伙伴。因为两种最简单的东西碰在一起总能迸发出火花。然而,当我们过滤不严格的时候经常出现日文字符,这个时候
- 数据库优化是一项很复杂的工作,因为这最终需要对系统优化的很好理解才行。尽管对系统或应用系统的了解不多的情况下优化效果还不错,但是如果想优化的
- ASP实例代码,利用SQL语句动态创建Access表。留作参考,对在线升级数据库有用处.<% nowtime = now()
- 在本文中,我将说明如何用SQL Server的工具来优化数据库索引的使用,本文还涉及到有关索引的一般性知识。 关于索引的常识 影响到数据
- 在项目开发中,经常出现这样的需求。在新增或修改一个主表数据时,对应的从表也要进行同步,此时我们是怎么操作的了?典型的方法就是对于主表的各数据
- z-blog摘要图文混排,在月光的博客早已有介绍,但是他的图文混排是基于一篇文章只定义一个Tag的情况,对于我这样习惯多tag的博客,再更改
- <!--#include file="strcheck.asp"--> <% '笔者在写程序的
- 将数据库中的信息存储至XML文件中:save.asp<!-- #include file="adovbs
- 把下面SQL里的SELECT单独执行,没有问题,但是用来CREATE VIEW 就报错了.CREATE OR REPLA
- 一. 建库,建表,加约束. 1.1建库 代码如下:use master go if exists (select * from sysdat
- 最近,W3C的一项公告称,在W3C与XHTML2的合同于今年年底到期后将不会续签。这意味着W3C停止了对XHTML2的开发,转而大力支持HT
- 微软现在已经进入了ASP.NET 2.0和Visual Web Developer 2005发布版最
- MySQL目前不支持列的Default 为函数的形式,如达到你某列的默认值为当前更新日期与时间的功能,你可以使用TIMESTAMP列类型下面
- 事情开始得很简单。MegaWare公司市场部门想要一个新的网站来发布文档,开发团队觉得使用SQL Server 2000数据库作为文档存储仓