11

我需要一种算法,允许我根据页面的浏览量和评论数确定我网站站点地图的适当<priority>字段。

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

该算法将接受两个参数,viewCountcommentCount,并将返回优先级值。例如:

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
4

6 回答 6

12

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

如果你有一个 table/view 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 的相对值。搜索引擎使用这些来回答问题,URL A 是否比 URL B 更重要/相关?它通过比较它们的优先级——哪个是最大的——而不是它们的绝对值来做到这一点。

// 未标准化 - 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)定义为最小值,即(上式中views(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.
于 2010-06-01T23:06:31.440 回答
4

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)

于 2010-05-31T17:07:32.397 回答
4

您在这里寻找的不是算法,而是公式。

不幸的是,您还没有真正指定您想要的详细信息,因此我们无法为您提供公式。

相反,让我们尝试一起解决这个问题。

您有两个传入参数,viewCount 和 commentCount。您想返回一个数字,Priority。到现在为止还挺好。

你说优先级应该在 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 的示例值制作一个电子表格,然后使用各种公式,直到你得到一个具有你希望的分布的公式。

我们不能为你做这件事,因为我们不知道你想如何评价事物。

于 2010-06-04T22:07:45.637 回答
2

我知道自从有人问这个问题以来已经有一段时间了,但是我遇到了类似的问题并且有不同的解决方案。

当您想要一种方法来对某事物进行排名时,并且您使用多个因素来执行该排名时,您正在做一些称为多标准决策分析的事情。(MCDA)。见:http ://en.wikipedia.org/wiki/Multi-criteria_decision_analysis

有几种方法可以处理这个问题。在您的情况下,您的标准有不同的“单位”。一种是以评论为单位的,另一种是以意见为单位的。此外,您可能希望根据您提出的任何业务规则对这些标准赋予不同的权重。

在这种情况下,最好的解决方案是一种称为加权产品模型的方法。见:http ://en.wikipedia.org/wiki/Weighted_product_model

要点是您将每个标准转化为百分比(如前所述),然后将该百分比提高到 X 的幂,其中 X 是介于 0 和 1 之间的数字。这个数字代表你的体重。您的总重量应加起来为 1。

最后,您将每个结果相乘以得出排名。如果排名大于 1,则分子页面的排名高于分母页面。

通过执行以下操作,将每个页面与其他所有页面进行比较:

  • p1C = 第 1 页评论
  • p1V = 第 1 页视图
  • p2C = 第 2 页评论
  • p2V = 第 2 页浏览量
  • wC = 评论权重
  • wV = 查看权重

排名 = (p1C/p2C)^(wC) * (p1V/p2V)^(wV)

最终结果是根据排名的页面排序列表。

我在 C# 中通过对实现 IComparable 的对象集合执行排序来实现这一点。

于 2011-01-20T21:25:10.293 回答
1

几位发帖人在没有概念澄清的情况下基本上主张的是,您使用线性回归来确定网页浏览量和评论计数的加权函数来确定优先级。

对于您的问题,这种技术很容易实现,基本概念在这篇关于线性回归模型的维基百科文章中得到了很好的描述。

如何将其应用于您的问题的快速总结是:

  1. 确定最适合您网站所有网页的查看和评论计数数据的行的参数,即使用线性回归。
  2. 使用行参数为视图/计数参数派生优先级函数。

如果您不想从基本数学公式(使用网络、数字食谱等)从头开始实现基本线性回归的代码示例,则应该不难找到它。此外,任何通用数学软件包,如 Matlab、R 等,都带有线性回归函数。

于 2010-06-06T03:14:45.957 回答
0

最天真的方法如下:

v[i]页面的浏览量,页面ic[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 < p < 1,它表示意见对评论的重要性:p = 0 表示只有评论是重要的,p = 1 表示只有意见是重要的,p = 0.5 给予相同的权重。

然后设置优先级为

p*r_v(i) + (1-p)*r_c(i)

这可能过于简单,但它可能是最好的起点。

于 2010-06-04T18:48:17.680 回答