您的位置:首页 > 运维架构

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

2017-07-29 22:34 183 查看
最近有一个项目中要用到热门文章排行榜,经过一番思考和努力最终做出来了,小编今天就给大家分享一下我的实践经验。大家可以参考一下说不定能让你少走弯路。



热门文章最关心的是热门的计算方法,根据实际经验总结跟热门有关的几个因素有:阅读量,展示量,收藏量,转发量,点赞量及评论等。

之前有思考过几个版本的公式,但最后比较满意的是:

热度=(x1*因素1+x2*因素2+...+xn*因素n)*时间冷却系数*发布时长

x1+x2+...+xn=1

 

上面公式提到一个“时间冷却系数”,是源自牛顿冷却定律,这个理解起来也就是一句话:物体的冷却速度,与其当前温度与室温之间的温差成正比。



写成数学公式就是:

 



公式中“*时间冷却系数*发布时长”部分写成数据公式就是: 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)
 

所有排行榜都可能出现“马太效应”,减弱“马太效应”的方法也有很多种,后面会写一篇文章专门介绍这个。

 

最后一个很重要的问题就是防作弊,一般不要公开你的热门计算方法给用户知道。否则用户就很容易地把自己的文章刷成热门文章。另外更重要的一点就是识别各种因素的作弊特点与异常特征。一旦发现对作弊就要对其作出处罚。如果防作弊是要根据实际情况处理的,方法也有很多,这些不一一作介绍了。

完整代码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: