青青子衿, 悠悠我心, 但为君故, 沉吟至今
« Google打不开的解决方法无花的蔷薇 »

热文排行的算法进行了优化

  今天打算更改一下我的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、同样是两天之内,且同样票数的文章,最近被推荐过的优先。

  也就是说,假如一篇文章在两天内无人继续推荐,估计大家对它的兴趣就不大了,或者说它有点“过时”了,它就应该被排在后边。

  “两天”的窗口期是暂时拟定的,以后也许会调整。另外,每个人的那一票,以后的权重可能会不一样(比如,如果小虾推荐的文章总是被大家认可,那末小虾以后的推荐会更有分量。)总的想法,还是希望平衡文章的新鲜和价值。以后会加分类,搜索,和过滤功能,让大家更方便地看到自己喜爱的文章。
 



  除非注明,月光博客文章均为原创,转载请以链接形式标明本文地址

  本文地址:http://www.williamlong.info/archives/521.html
  • 文章排行:
  • 1.williamlong
  • 同时还需要修改 c_html_js.asp 文件的。
  • 2006/12/10 23:32:34   支持(16)反对(6) 回复
  • 3.seehots
  • 这个显示不出来,还一个文章排行的插件也是显示不出来,那个是.js文件没有,我都怀疑是不是我的主题不对了
  • 2006/12/11 13:32:59   支持(11)反对(5) 回复
  • 4.williamlong
  • 以上的代码只能在Access数据库中运行,不能在SQL Server中运行。SQL Server需要再单独写代码。
  • 2006/8/11 19:07:36   支持(8)反对(4) 回复
  • 5.williamlong
  • Z-blog1.7不用修改c_html_js.asp文件。
  • 2007/6/26 20:20:50   支持(12)反对(8) 回复
  • 6.dodol
  • 如果使用的是http://www.williamlong.info/archives/521/521/就不行了
    产生的链接是http://www.williamlong.info/archives/521.html这种啊!
    麻烦改进一下哦!
  • 2007/6/28 9:34:49   支持(8)反对(4) 回复
  • 7.今天
  • 是呀!我的是Z-Blog Plus 1.5 Build 60326
  • 2006/6/4 20:07:36   支持(9)反对(6) 回复
  • 8.今天
  • 就是没看见MakeBlogReBuild函数这个是文件名吗?但是我没有找到呀?
  • 2006/6/4 20:19:36   支持(7)反对(4) 回复
  • 9.williamlong
  • 原版的话你在c_system_event.asp里搜索一下,不可能没有这个函数的。
  • 2006/6/4 20:22:01   支持(7)反对(4) 回复
  • 10.seehots
  • 仔细看了下,我没找到 :c_html_js.asp里的f="TRACKBACKS"
  • 2006/12/11 23:17:44   支持(12)反对(9) 回复
  • 11.华晨兴
  • 我也用Z-blog.感觉后台生存文件有点慢.我只用到1.5版.
  • 2007/10/24 0:15:18   支持(7)反对(4) 回复
  • 12.yangyhoo
  • 请问36楼的问题应该怎么解决,谢谢!
  • 2007/11/6 22:36:14   支持(5)反对(2) 回复
  • 13.仁兰设计
  • 谢谢你!呀!这就是我以前问过你的问题呢?????????
    哈!太棒了。。。。。好晚了?回家了88
  • 2006/6/3 20:30:09   支持(6)反对(4) 回复
  • 14.仁兰设计
  • 对了!我的是Z-Blog Plus 1.5 Build 60326
    可以改吗?站长??????????????????
  • 2006/6/3 20:31:51   支持(4)反对(2) 回复
  • 15.williamlong
  • 这个程序是通用的,Z-Blog 1.4以上的版本按照我的方法都可以使用。邮件变为[AT]是为了防止垃圾邮件。
  • 2006/6/3 20:45:40   支持(8)反对(6) 回复
  • 18.jones.c
  • 又出了新问题。就是在开启了自定义的目录名后。这个生成的热文排行会有url错误的情况。。。查看代码是因为指定了默认的目录名导致。不知道要怎么修改。

    strLogUrl=ZC_BLOG_HOST & ZC_STATIC_DIRECTORY & "/" & strLogUrl & "." & ZC_STATIC_TYPE

    他是定义了这个url格式为blog的域名+默认目录+文章算定义的名字+网页自定义的后缀名。

    但是如果是在后台自定义了静态页面和自定义目录后,再用这个热文就会出错。。不知道要怎么修改。望大家帮帮忙。
  • 2007/7/14 20:04:32   支持(8)反对(6) 回复
  • 19.广木
  • 想问一下,看了好多用这个BLOG的用户网站,发现首页的PR都满高的.但是内页好多就没有PR了.为什么会这样了.查看很久前的帖子也是如此.这样会影响内页的索引吗.
  • 2006/6/14 11:54:01   支持(14)反对(13) 回复
  • 20.蓝色
  • sqr函数在sql数据库的查询语句中显示不可识别

    Microsoft OLE DB Provider for SQL Server 错误 '80040e14'

    'sqr' 不是可以识别的 函数名。
  • 2006/8/11 16:19:26   支持(7)反对(6) 回复
  • 23.williamlong
  • 随便放在MakeBlogReBuild函数里面就可以。
  • 2006/6/4 18:39:47   支持(6)反对(6) 回复
  • 24.windlike

  • 楼主热文排序的算法思想真的很不错. 长见识了!
  • 2006/10/16 9:25:58   支持(6)反对(6) 回复
  • 26.seehots
  • <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>

    请问下,调用有问题,该怎么修改?
    你的调用是:<script language="JavaScript" src="http://www.williamlong.info/c_html_js.asp?include=toplist" type="text/javascript"></script>
    我的用http://www.seehots.com/blog/include/toplist.asp能打开,说明include里有这个文件,但是js调用的时候缺怎么也显示不出来,不知道是什么原因,有空请回答下,谢谢
  • 2006/12/10 23:27:42   支持(5)反对(5) 回复
  • 27.职责
  • 用找个方法在1.7版本的ZBLOG中怎么也不成功,请主人给点修改意见吧,谢谢
  • 2007/3/7 10:33:35   支持(7)反对(7) 回复
  • 28.williamlong
  • 已经在文章中更新了1.7版本的Z-BLOG的修改方法。
  • 2007/6/25 23:42:34   支持(7)反对(7) 回复
  • 29.IYOOYO
  • 修改c_html_js.asp,在f="TRACKBACKS"后面增加
    ElseIf f="toplist" Then
    f="TOPLIST"

    在Zblog 1.7 下c_html_js.asp找不到f="TRACKBACKS"
    那该怎么办呢?
  • 2007/6/26 18:50:14   支持(7)反对(7) 回复
  • 31.seehots
  • 修改c_html_js.asp,在f="TRACKBACKS"后面增加
    ElseIf f="toplist" Then
    f="TOPLIST"
    这个吗?
    我也改了
  • 2006/12/11 9:06:49   支持(5)反对(7) 回复
  • 32.仁兰设计
  • 月光:[email protected][AT]呀?
  • 2006/6/3 20:33:27   支持(5)反对(8) 回复
  • 33.DBY
  • 然后在MakeBlogReBuild函数的BlogReBuild_Categorys后面加上一行BlogReBuild_Toplist。
    这个不知道在那里改的呀???????????????????
  • 2006/6/4 14:22:30   支持(7)反对(10) 回复
  • 34.ieqiang
  • 真希望好心人williamlong 能够在百忙之中抽点时间出来改下以适合1.7版本的ZBLOG。。毕竟c_html_js.asp文件现在已和以前的版本不同了,所以不知该如何改,好希望能用上这个。。再次谢谢!!
  • 2007/2/27 12:25:03   支持(6)反对(9) 回复
  • 35.今天
  • MakeBlogReBuild函数这个是文件名吗?但是我没有找到呀?
    到底是什么呀???
  • 2006/6/4 19:20:39   支持(8)反对(12) 回复
  • 36.长空
  • William可不可以把你的blog程序和插件共享一下嘛。
  • 2007/6/25 23:02:52   支持(6)反对(10) 回复
  • 37.williamlong
  • 我察看了一下,在1.4和1.5里都有,可能你用的不是原版的Z-Blog。
  • 2006/6/4 19:54:45   支持(3)反对(9) 回复
  • 38.hanhao
  • 月光你好,能帮忙写个sql版本使用的教材吗,我的是1.7的,按照密的方法改成sql的了
  • 2007/2/9 22:55:00   支持(5)反对(13) 回复

发表评论:

 请勿发送垃圾信息、广告、推广信息或链接,这样的信息将会被直接删除。

订阅博客

  • 订阅我的博客:订阅我的博客
  • 关注新浪微博:关注新浪微博
  • 关注腾讯微博:关注腾讯微博
  • 关注认证空间:关注QQ空间
  • 通过电子邮件订阅
  • 通过QQ邮件订阅

站内搜索

热文排行


月度排行

本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享. 转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议.
This site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License.