【问题标题】:Algorithm To Select Most Popular Places from Database从数据库中选择最受欢迎地点的算法
【发布时间】:2010-04-25 02:48:35
【问题描述】:

我们有一个包含地点数据库的网站。对于每个地方,我们的用户都可以采取我们记录的以下操作之一:

  1. VIEW - 查看它的个人资料
  2. 评分 - 以 1-5 星的等级对其进行评分
  3. 审查 - 审查它
  4. 已完成 - 标记他们去过那里
  5. 愿望清单 - 标记他们想去那里
  6. 最喜欢的 - 标记这是他们的最爱之一

在我们的地点数据库表中,每个地点都包含执行上述每个操作的次数以及用户给出的平均评分。

  • 观看次数
  • 收视率
  • avg_rating
  • 已完成
  • 愿望清单
  • 最喜欢的

我们希望能够使用上述信息生成排名靠前的位置列表。理想情况下,我们希望能够使用相对简单的 SQL 查询来生成此列表,而无需做任何繁琐的工作来计算额外的字段或相互堆叠排名位置。话虽如此,由于我们只有大约 50,000 个名额,因此我们可以运行一个每晚的 cron 作业来计算一些字段,例如不同类别的排名,如果这会对我们的顶级名额的总体结果产生有意义的影响。

如果您能就我们应该如何考虑将最佳位置冒泡到顶部提出一些建议,我们应该更加重视哪些标准,并给出这些信息,我将不胜感激 - 建议 MySQL 查询需要看起来像什么以选择前 10 名。

需要注意的一点是,此时我们不太关心某个地方的热门程度——这意味着查看汇总信息就可以了,并且不需要对最近的数据进行更重的加权。

提前感谢您的帮助和建议!

【问题讨论】:

  • 没有人能告诉你如何做到这一点——这是你必须做出的决定,它决定了排名。你为什么不直接挑选一些东西并对其进行改进,直到你喜欢结果?例如,为什么不严格按照评分对它们进行排名?
  • @WhirlWind - 我知道最终的决定将是我们的,但我希望能获得一些高层次的想法和​​外部观点,了解其他人认为应该更高评价的标准及其背后的原因。此外,我知道有些人对这类问题深思熟虑,并会重视他们对适当解决方案的投入。

标签: algorithm mysql popularity


【解决方案1】:

【讨论】:

  • 该死...+1 非常非常有趣
  • @Paul - 我喜欢这个建议,读起来很有趣。关于如何将其转换为 MySQL 查询或一些 Perl 代码的任何想法?另外,你以前用过这个并且成功了吗?谢谢你的好建议!
【解决方案2】:

最喜欢的确切公式需要来自您,我们称之为 f(x)。
对于实际实现,我将添加一个我会计算的流行度得分字段,正如您在每行使用 f(x) 的夜间 cron 作业中所说的那样。

那么这只是一个简单的“从表顺序中选择地名”的情况。

好的 - 让我们试一试 Popularity_score = (FAVORITE * 3 + COMPLETED * 2 + WISHLIST) * RATING * VIEW / AVG_VIEWS_OF_ALL_PROFILES

【讨论】:

  • @Romain - 我希望能更具体地了解 f(x) 的外观。有什么想法吗?我有我的,但我也喜欢一些外部视角。
  • @Russell C - 我给了它一个刺
  • @Roman - 谢谢!我很想更好地理解你为什么选择某些权重等的逻辑。另外,你认为这将如何与堆栈在每个维度上对所有内容进行排名并计算出所有类别中每个位置的平均排名进行比较,这是一个想法我们一直在玩弄?一种方法相对于另一种方法的优缺点?再次感谢!
  • @Russell C. 如果这是您最喜欢的地方,那么您可能已经花时间去那里了,而且它是您去过的所有地方中您最喜欢的地方(排名 3)如果您去过那里然后你去那里已经足够重要了。 (等级 2)如果它在您的愿望清单中,那么它对您来说还不够重要。 (排名 1)
  • @Roman - 感谢您的解释。我已经稍微调整了算法,但通常它似乎运行良好。再次感谢您的建议。
【解决方案3】:

我对如何称量没有意见。

也就是说,为什么不在位置表中添加一个流行度列呢?突然之间,您的 SQL 查询变得异常简单。

当然,棘手的部分是弄清楚如何以及何时更新该值。但由于您保存了所有活动数据,因此您始终可以从日志条目中重新生成流行度值。

这样,您可以获得对“最受欢迎”位置的快速查询,如果您想更改计算流行度的方式,您可以随意这样做。

如果您够聪明,或许可以设计出一个足够简单的公式,以便实时跟踪受欢迎程度。例如,如果我们只关心平均评分,您可以只使用三个变量来修改平均评分:当前平均评分、对象被评分的次数和新评分值。

当然,当您开始混合对象被查看、评论、收藏等的次数时,事情会变得更加复杂......但您可能会发现您可以设计一种计算成本足够低的方法,您可以进行更新几乎每个动作的整体人气值。

【讨论】:

  • @Timdev - 这也是我的想法。我希望得到一些关于更具体的可能是什么样子的输入。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 2021-02-20
  • 2013-05-06
  • 1970-01-01
  • 2020-10-04
相关资源
最近更新 更多