热文排行的算法进行了优化
Sat 03 June 2006
热文排行的算法进行了优化
作者: 月光 编程开发
今天打算更改一下我的Blog的文章排行算法。
以前的算法是根据点击数目来排行,有很多不足的地方,比如没有考虑时间因素,没有考虑用户对其的推荐等因素,最近使用抓虾系统的时候,对抓虾的"热文排行"算法产生了兴趣,因此我也打算使用类似的排行来进行我的Blog的文章排行。
其中的积分算法是比较难确定的,我打算以文章浏览次数,评论次数,引用次数以及文章的日期来生成。把用户的评论数目作为推荐次数,文章的发表日期到今天的时间做为时间因素。
1条评论和100次浏览有相同积分。
1条Traceback等于2条评论的积分。评论和引用的增长是线性的。
浏览次数增大,取得的积分以开平方根的方式增长,即数字越大,变化越小。
文章的日期做为负积分,以指数方式增长,越老的文章,会变为越来越大的负数积分。
用数学算法表示即:log_CommNums*100 + log_TrackBackNums*200 + sqr(log_ViewNums)*10 - (date()-Log_PostTime)*(date()-Log_PostTime)
从这个算法中,引用和评论对积分的增加影响最大,时间因素对积分的减少影响最大。以这个算法产生的"热文排行"见左边,其每天会自动更新,我将观察一段时间,看看这个算法的效果如何。
具体的修改方法如下:
在c_system_event.asp中加入下面的函数:
\'*********************************************************\ \' 目的: 重建排行\ \'*********************************************************\ Function BlogReBuild_Toplist()
Dim i\ Dim objRS\ Dim objStream\ Dim objArticle\ Dim strLogUrl
Dim strPrevious\ Set objRS=objConn.Execute(\"SELECT [log_ID],[log_Url],[log_Title] FROM [blog_Article] WHERE [log_Level]>1 ORDER BY log_CommNums*100 + log_TrackBackNums*200 + sqr(log_ViewNums)*10 - (date()-Log_PostTime)*(date()-Log_PostTime) DESC\")
If (Not objRS.bof) And (Not objRS.eof) Then\ For i=1 to ZC_PREVIOUS_COUNT\ strLogUrl=objRS(\"log_Url\")\ If IsNull(strLogUrl) Or IsEmpty(strLogUrl) Or strLogUrl=\"\" Then\ strLogUrl=objRS(\"log_ID\")\ End If\ strLogUrl=ZC_BLOG_HOST & ZC_STATIC_DIRECTORY & \"/\" & strLogUrl & \".\" & ZC_STATIC_TYPE\ strPrevious=strPrevious & \"\<li>\<a href=\"\"\"& strLogUrl & \"\"\">\" & objRS(\"log_Title\") & \"\</a>\</li>\"\ objRS.MoveNext\ If objRS.eof Then Exit For\ Next\ End If\ objRS.close
strPrevious=TransferHTML(strPrevious,\"[no-asp]\")
Set objStream = Server.CreateObject(\"ADODB.Stream\")\ With objStream\ .Type = adTypeText\ .Mode = adModeReadWrite\ .Open\ .Charset = \"utf-8\"\ .Position = objStream.Size\ .WriteText = strPrevious\ .SaveToFile BlogPath & \"/include/toplist.asp\",adSaveCreateOverWrite\ .Close\ End With\ Set objStream = Nothing
BlogReBuild_Toplist=True
End Function\ \'*********************************************************
然后在MakeBlogReBuild函数的BlogReBuild_Categorys后面加上一行BlogReBuild_Toplist。
修改c_html_js.asp,在f=\"TRACKBACKS\"后面增加\ ElseIf f=\"toplist\" Then\ f=\"TOPLIST\"
修改single.html模板文件,在合适的位置增加下面几行。\ \<div class=\"function\" id=\"divTopList\">\ \<h3>热文排行\</h3>\ \<ul>\ \<script language=\"JavaScript\" src=\"\<#ZC_BLOG_HOST#>c_html_js.asp?include=toplist\" type=\"text/javascript\">\</script>\ \</ul>\ \</div>
最后,重建索引,重建文件,就完成了。
具体效果参见本页左边的"热文排行"栏目。
更新:在Z-BLOG 1.7下的修改方法
前面修改代码不变,之后,修改TEMPLATE\default.html模板,在适当位置加入以下语句:
\<div class=\"function\" id=\"divTopList\">\ \<h3>热文排行\</h3>\ \<ul>\ \<#CACHE_INCLUDE_TOPLIST#>\ \</ul>\ \</div>
修改TEMPLATE\single.html模板,在适当位置加入以下语句:
\<div class=\"function\" id=\"divTopList\">\ \<h3>热文排行\</h3>\ \<ul id=\"ulToplist\">\ \<script language=\"JavaScript\" type=\"text/javascript\">strBatchInculde+=\"ulToplist=toplist,\"\</script>\ \</ul>\ \</div>
最后重建索引即可。
参考文章:抓虾指数的热文排行的产生
来源:http://www.zhuaxia.com/blog/?p=20
抓虾的热门文章是大家"顶"上来的。对于每篇文章,每个人有且仅有一票(包括我们虾米自己也一样,只有一票)。推荐出来的文章,按下面的规则排列顺序,希望能够兼顾文章的新鲜(按时间)和价值(按票数)。
1、两天之内推荐的文章,优先于超过两天的;
2、同样是两天之内推荐的文章,票数高的优先;
3、同样是两天之内,且同样票数的文章,最近被推荐过的优先。
也就是说,假如一篇文章在两天内无人继续推荐,估计大家对它的兴趣就不大了,或者说它有点"过时"了,它就应该被排在后边。
"两天"的窗口期是暂时拟定的,以后也许会调整。另外,每个人的那一票,以后的权重可能会不一样(比如,如果小虾推荐的文章总是被大家认可,那末小虾以后的推荐会更有分量。)总的想法,还是希望平衡文章的新鲜和价值。以后会加分类,搜索,和过滤功能,让大家更方便地看到自己喜爱的文章。\

::: {#article_dig style="text-align: right"} []{#note521}顶一下 ▲}([]{#sdig521
) 踩一下 ▼}([]{#sdown521
) :::
::: {.previous_content} « 上一篇 Google打不开的解决方法 :::
::: {.next_content} 下一篇 » 无花的蔷薇 :::
相关文章
Category: 月光博客2006