热门文章排行榜topn推荐实例

最近有一个项目中要用到热门文章排行榜,经过一番思考和努力最终做出来了,小编今天就给大家分享一下我的实践经验。大家可以参考一下说不定能让你少走弯路。
热门文章排行榜topn推荐实例_第1张图片
热门文章最关心的是热门的计算方法,根据实际经验总结跟热门有关的几个因素有:阅读量,展示量,收藏量,转发量,点赞量及评论等。
之前有思考过几个版本的公式,但最后比较满意的是:
热度=(x1*因素1+x2*因素2+...+xn*因素n)*时间冷却系数*发布时长
x1+x2+...+xn=1
 
上面公式提到一个“时间冷却系数”,是源自牛顿冷却定律,这个理解起来也就是一句话:物体的冷却速度,与其当前温度与室温之间的温差成正比。
热门文章排行榜topn推荐实例_第2张图片
写成数学公式就是:
 
热门文章排行榜topn推荐实例
公式中“*时间冷却系数*发布时长”部分写成数据公式就是: exp(-(冷却系数) x 间隔的小时数)
 
其中,"冷却系数"是一个你自己决定的值。如果假定一篇新文章的初始分数是100分,24小时之后"冷却"为1分,那么可以计算得到"冷却系数"约等于0.192。如果你想放慢"热文排名"的更新率,"冷却系数"就取一个较小的值,否则就取一个较大的值。
 
要注意的一点就是热门是跟时间有很大关系的,所以统计数据我都是取最近一时间段的来统计。
下面我就用 阅读量与评论量两个因素来做个例子给大家参考,在实际应用中你可能要考有因素有很多个
01 def updateHotArticle():
02     #获取阅读统计   
03     viewDic = getViewData()
04      
05     hotDic={}
06     try:
07         db = MySQLdb.connect(mysql_host, mysql_user, mysql_pwd, mysql_db, charset = "utf8")
08         cursor = db.cursor()
09          
10         for id in viewDic:
11             
12             sql="""SELECT id,TIMESTAMPDIFF(HOUR,publishTime,NOW()) as hours,commentNum from article where id='"""+id+"""' ;"""
13             cursor.execute(sql)
14             results = cursor.fetchone()
15             hours=results[1]
16             commentNum=results[2]
17              
18             hot = (0.3 * viewDic[id+ (1 - 0.3* commentNum) * math.exp(-0.192 * hours)
19             hotDic[id]=hot
20              
21         db.close()       
22     except Exception, e:
23         print Exception, e
24      
25     hotDic= sorted(hotDic.iteritems(), key=lambda d:d[1], reverse = True)[:topn]
26     saveHot(hotDic)
 
所有排行榜都可能出现“马太效应”,减弱“马太效应”的方法也有很多种,后面会写一篇文章专门介绍这个。
 
最后一个很重要的问题就是防作弊,一般不要公开你的热门计算方法给用户知道。否则用户就很容易地把自己的文章刷成热门文章。另外更重要的一点就是识别各种因素的作弊特点与异常特征。一旦发现对作弊就要对其作出处罚。如果防作弊是要根据实际情况处理的,方法也有很多,这些不一一作介绍了。

完整代码下载

你可能感兴趣的:(推荐系统)