基于视图/注释计算页面重要性的算法

sta*_*ker 11 language-agnostic algorithm math ranking sitemap.xml

我需要一种算法,允许我根据页面的视图和注释计数<priority>为我的网站的站点地图确定一个合适的字段.

对于那些不熟悉站点地图的人,优先级字段用于表示页面相对于同一网站上其他页面的重要性.它必须是介于0和1之间的十进制数.

该算法将接受两个参数,viewCount并且commentCount,将返回的优先级.例如:

GetPriority(100000, 100000); // Damn, a lot of views/comments! The returned value will be very close to 1, for example 0.995
GetPriority(3, 2); // Ok not many users are interested in this page, so for example it will return 0.082
Run Code Online (Sandbox Code Playgroud)

mdm*_*dma 12

您提到在SQL查询中执行此操作,因此我将提供示例.

如果你有一个表/视图Pages,就像这样

Pages
-----
page_id:int
views:int  - indexed
comments:int - indexed
Run Code Online (Sandbox Code Playgroud)

然后你可以通过写作订购它们

SELECT * FROM Pages
ORDER BY 
    (0.3+LOG10(10+views)/LOG10(10+(SELECT MAX(views) FROM Pages))) +       
    (0.7+LOG10(10+comments)/LOG10(10+(SELECT MAX(comments) FROM Pages)))
Run Code Online (Sandbox Code Playgroud)

我故意在观点和评论之间选择不平等的权重.与观点/评论保持相同权重可能产生的一个问题是排名变成了一个自我实现的预言 - 页面在列表的顶部返回,因此它被更频繁地访问,因此得到更多的点,所以它是在列表的停止处显示,并且它被更频繁地访问,并且它获得了更多的分数....更多地重视评论反映了这些需要付出实际努力并表现出真正的兴趣.

上面的公式将根据所有时间统计数据为您提供排名.因此,在去年收集的与去年积累的另一篇文章相同数量的观点/评论的文章将被赋予相同的优先权.重复公式可能是有意义的,每次指定一系列日期,并且有利于具有更高活动的页面,例如

  0.3*(score for views/comments today) - live data
  0.3*(score for views/comments in the last week)
  0.25*(score for views/comments in the last month)
  0.15*(score for all views/comments, all time)
Run Code Online (Sandbox Code Playgroud)

这将确保"热门"页面的优先级高于最近没有看到太多动作的类似评分页面.除了今天的分数之外的所有值都可以通过预定的存储过程保存在表中,以便数据库不必聚合许多注释/查看统计信息.只有今天的统计数据是"实时"计算的.更进一步,可以通过每天运行的存储过程来计算和存储历史数据的排名公式本身.

编辑:要获得从0.1到1.0的严格范围,您可以像这样动机化公式.但我强调 - 这只会增加开销并且是不必要的 - 优先级的绝对值并不重要 - 只有它们与其他网址的相对值.搜索引擎使用这些来回答问题,URL A比URL B更重要/相关吗?它通过比较它们的优先级 - 哪一个是最大的 - 而不是它们的绝对值来做到这一点.

// unnormalized - x是某个页面ID un(x)= 0.3*log(views(x)+10)/ log(10 + maxViews())+ 0.7*log(comments(x)+10)/ log(10 + maxComments())//原始公式(现在是伪代码)

最大值为1.0,最小值将从1.0开始,并随着更多视图/注释向下移动.

我们将un(0)定义为最小值,即(其中view(x)和comments(x)在上面的公式中均为0)

要获得从0.1到1.0的规范化公式,然后计算n(x),即页面的规范化优先级 x

                  (1.0-un(x)) * (un(0)-0.1)
  n(x) = un(x) -  -------------------------    when un(0) != 1.0
                          1.0-un(0)

       = 0.1 otherwise.
Run Code Online (Sandbox Code Playgroud)

  • 请在实践中尝试配方.所以不是学习数学的地方.如果你看到两页没有得到你想要的相对优先级,那么我们可以调查一下,因为可能有你没有提到的细节.否则,我认为这将完成你想要的工作. (3认同)