【发布时间】:2021-09-15 13:42:47
【问题描述】:
我有一张电影表和一张评论表
在我的应用中,我想展示任何类型的前 10 部电影。
我显然不能仅按评分对电影进行排序,因为有些电影只有 1 个 5 星评价,因此只会向用户推荐不相关的电影。
目前我从 DB 收到按评论排序的该类型的前 100 部电影,按服务器上的评分排序此列表,然后才显示前 10。
这有点工作,但这种解决方案在例如的情况下是不切实际的。评论轰炸,此外,前10名的目的是推荐最相关的电影。
我的想法是在电影表中添加相关性列,但我不知道如何计算它:
- (5 星评论数量 * 5)+(4 星评论数量 * 4)等等 - 否
- (5 星评论数量 * 1)+(4 星评论数量 * 0.8)+ ... +(0 星评论数量 * 0.1) - 否
- 评论总数/平均 - 否
- ((5 星评论数量 * 5 ) + (4 星评论数量 * 4 ) 等等) / 总评论数量 - mb,我不确定 0 是多少
此外,评分中的评分不是实数。用户只能给出 5、4.5、4 等分数审查。但是用户可以给电影评分 5、4.9、4.8 ... 0.1 的情况呢?
那么,如何更好地执行这个操作呢?
[Upd] 我认为不是除法。我们应该将averagerating 和reviews 与movies 相乘以计算相关性(averagerating 和reviews 已经在每次插入/删除/更新时自动更新)。我们也应该尝试标准化产品。
在这种情况下,有 100 条评论的 5 和 averagerating 的 5 的电影不会击败有 averagerating 3.8 但有 57k 条评论的电影,并且评论轰炸的问题也将得到解决。
谁能证明我的猜测?
【问题讨论】:
-
您可以将所有评分相加,然后除以该电影的评分总数,即平均评分。您所说的收视率不是实数是什么意思? 4.5 在我看来是一个实数
-
@Etienne 在我看来,它不会正常工作。如果您建议
select sum(rating) group by movie_id,然后将其除以reviews和movies(平均和评论会在每次插入/删除/更新时自动更新),那么您会出现这样的情况:电影的评论为((50 *5)+(40*4)+(60*3)+(50*2)+(10*1))/(50+40+60+50+10) 将与带有评论的电影具有相同的相关性((500*5)+(400*4)+(600*3)+(500*2)+(100*1))/(500+400+600+500+100)。什么不是真的。第一部电影被评为 210 次,第二部被评为 2100 次 -
@Etienne 真实/非真实怎么样,我的意思是可能的评论数量是离散的所以集合是有限的。我的错。在 5, 4.9, 4.8 ... 0.1 的情况下,它也是有限的,但很难计算每个成员,而且集合可以是无限的 - 实数,我的情况是什么,但即使在这种情况下,这个公式也应该适用
-
@Etienne 回到我的第一条评论,这种方法并不能解决零问题。无论有多少用户将电影评分为 0,所有零都将被忽略
-
如果您询问如何根据评分数量和评分值定义可靠/相关评分,那么这是一个统计问题,您需要询问统计论坛。如果您已经定义了逻辑但想知道如何对其进行编码,请将该逻辑添加到您的问题中
标签: sql math weighted-average relevance