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

我需要一种算法,允许我根据页面的视图和注释计数为我网站的站点地图确定一个合适的
<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
    
已邀请:
您提到在SQL查询中执行此操作,因此我将提供示例。 如果您有一张桌子/视图
Pages
,就像这样
Pages
-----
page_id:int
views:int  - indexed
comments:int - indexed
然后你可以通过写作订购它们
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)))
我故意在观点和评论之间选择不平等的权重。与观点/评论保持相同权重可能产生的一个问题是排名变成了一个自我实现的预言 - 页面在列表的顶部返回,因此它被更频繁地访问,因此得到更多的点,所以它是在列表的停止处显示,并且它被更频繁地访问,并且它获得了更多的分数....更多地重视评论反映了这些需要付出实际努力并表现出真正的兴趣。 上面的公式将根据所有时间统计数据为您提供排名。因此,在去年收集的与去年积累的另一篇文章相同数量的观点/评论的文章将被赋予相同的优先权。重复公式可能是有意义的,每次指定一系列日期,并且有利于具有更高活动的页面,例如,
  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)
这将确保“热门”页面的优先级高于最近没有看到太多动作的类似评分页面。除了今天的分数之外的所有值都可以通过预定的存储过程保存在表中,以便数据库不必聚合许多注释/查看统计信息。只有今天的统计数据是“实时”计算的。更进一步,可以通过每天运行的存储过程来计算和存储历史数据的排名公式本身。 编辑:要获得从0.1到1.0的严格范围,您可以像这样动机化公式。但我强调 - 这只会增加开销并且是不必要的 - 优先级的绝对值并不重要 - 只有它们与其他网址的相对值。搜索引擎使用这些来回答问题,URL A比URL B更重要/相关吗?它通过比较它们的优先级 - 哪一个是最大的 - 而不是它们的绝对值来做到这一点。 // unnormalized - x是某个页面ID    un(x)= 0.3 * log(views(x)+10)/ log(10 + maxViews())+            0.7 *日志(注释(X)10)/日志(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.
    
Priority = W1 * views / maxViewsOfAllArticles + W2 * comments / maxCommentsOfAllArticles
W1 + W2 = 1 虽然恕我直言,只需使用
0.5*log_10(10+views)/log_10(10+maxViews) + 0.5*log_10(10+comments)/log_10(10+maxComments)
    
你在这里寻找的不是算法,而是公式。 不幸的是,你还没有真正指定你想要的细节,所以我们无法为你提供这个公式。 相反,让我们一起试着解决问题。 你有两个传入的参数,viewCount和commentCount。您想要返回单个数字,优先级。到现在为止还挺好。 你说优先级应该介于0和1之间,但这并不重要。如果我们想出一个我们喜欢的公式,但得到0到N之间的值,我们可以将结果除以N--所以这个约束并不真正相关。 现在,我们需要决定的第一件事是评论与观点的相对权重。 如果页面A有100个评论和10个视图,而页面B有10个评论和100个视图,哪个应该具有更高的优先级?或者,它应该是相同的优先事项吗?您需要确定什么是正确的优先权定义。 例如,如果您决定评论的价值比观看次数高5倍,那么我们可以从类似的公式开始
 Priority = 5 * Comments + Views
显然,这可以推广到
Priority = A * Comments + B * Views
其中A和B是相对权重。 但是,有时我们希望我们的权重是指数而不是线性的,比如
 Priority = Comment ^ A + Views ^ B
这将给出与早期公式非常不同的曲线。 同样的,
 Priority = Comment ^ A * Views ^ B
如果权重相等,将为具有20条评论和20条观看的页面提供更高的价值,而不是具有1条评论和40条观看的页面。 所以,总结一下: 你真的应该制作一个包含Views和Comments的样本值的电子表格,然后使用各种公式,直到得到一个你希望得到的分布。 我们不能为你做,因为我们不知道你想如何评估事物。     
我知道已经有一段时间了,但是我遇到了类似的问题并且有不同的解决方案。 如果您想要对某些内容进行排名,并且您正在使用多个因素来执行该排名,那么您正在执行一项称为多标准决策分析的操作。 (MCDA)。请参阅:http://en.wikipedia.org/wiki/Multi-criteria_decision_analysis 有几种方法可以解决这个问题。在您的情况下,您的标准具有不同的“单位”。一个是以评论为单位,另一个是以观点为单位。此外,您可能希望根据您提出的任何业务规则对这些标准给予不同的权重。 在这种情况下,最好的解决方案是称为加权产品模型。请参阅:http://en.wikipedia.org/wiki/Weighted_product_model 要点是你采取每个标准并将其转换为百分比(如先前建议的那样),然后你取这个百分比并将其提高到X的幂,其中X是0到1之间的数字。这个数字代表你的体重。您的总重量应加起来一个。 最后,您将每个结果组合在一起以得出排名。如果等级大于1,则分子页面的分级高于分母页面。 通过执行以下操作,将每个页面与其他每个页面进行比较: p1C =第1页评论 p1V =第1页视图 p2C =第2页评论 p2V =第2页的浏览量 wC =评论权重 wV =查看重量 rank =(p1C / p2C)^(wC)*(p1V / p2V)^(wV) 最终结果是根据其排名的页面排序列表。 我通过对实现IComparable的对象集合执行排序,在C#中实现了这一点。     
几个海报在没有概念澄清的情况下基本上提倡的是,您使用线性回归来确定网页视图的加权函数和评论计数以确定优先级。 这种技术很容易为您的问题实现,本维基百科关于线性回归模型的文章对此基本概念进行了详细描述。 如何将其应用于您的问题的快速摘要是: 确定最适合所有网站网页的查看和评论计数数据的行的参数,即使用线性回归。 使用行参数派生视图/计数参数的优先级函数。 如果您不想从头开始从基本数学公式(使用Web,Numerical Recipes等)实现基本线性回归的代码示例,则不应该难以跟踪。此外,任何一般的数学软件包,如Matlab,R等,都带有线性回归函数。     
最天真的方法如下: 让
v[i]
页面的视图
i
c[i]
页面的注释数量
i
,然后定义页面i的相对视图权重
r_v(i) = v[i]/(sum_j v[j])
其中
sum_j v[j]
是所有页面上
v[.]
的总和。同样,定义页面i的相对评论权重
r_c(i) = c[i]/(sum_j c[j]).
现在你想要一些常数参数p:0&lt; p&lt; 1表示观点对评论的重要性:p = 0表示只有评论是重要的,p = 1表示只有观点是重要的,而p = 0.5给出相同的权重。 然后将优先级设置为
p*r_v(i) + (1-p)*r_c(i)
这可能过于简单了,但可能是最好的起点。     

要回复问题请先登录注册