对于项目,我需要根据特定对象上的事件对某些对象进行排名。但要排名的对象并不相同。
一些背景知识:该应用程序是一个类似社交网络的文档管理系统。有很多用户可以上传/发布文档'各种类型(视频,外部文章 - 例如,在相关博客上发现 - ,在系统内写的文章等)。但是,用户到用户的消息也应该出现在Feed中,以及系统消息等。
要稍微分解一下,让我们假设这三个对象应该出现在新闻提要中,按病毒性排序/排序,这取决于事件。
对每个对象的排名很重要的一些参数:
为了使其更难,创建对象的日期非常重要,以及发生事件的日期和相关性。再加上复杂性:几乎所有东西都是相对的;例如。文档的视图数量需要将其定义为“病毒”和“病毒”。因此,它出现在新闻Feed中取决于平均观看次数。同样适用于评论,但是对于评论,发布新评论之间的发布日期和时间也很重要....(哦,如果它不清楚,排名总是相对于用户,而不是系统 - 宽)。
我的第一个想法是为每个对象定义最大分数(Sm
),定义对象何时到达Sm
并计算实际分数(Sa
)。 IE浏览器。系统消息的Sm
为100,用户/组消息为80,文档的Sm
为60.这意味着如果每个对象中的一个在完全相同的时间创建,则没有其他参数(注释等)可用,系统消息将首先列出,用户消息将在下一个,最后,但并非最不重要的是,文档。
因此,对于每种类型的对象,我都在寻找类似的公式:
S(a) = S(m) * {calculations here}
对于系统消息,我猜不难,因为它只有两个影响Sa
(日期和重要性级别)的参数。所以它的得分公式看起来像(I
是数字导入级别):
S(a) = S(m) * I * (1 / (now() - date_posted())
让我们假设通知的I = 10且公告I = 20,昨天发布的通知和2天前发布的公告的分数将是:
Notice: S(a) = 100 * 10 * (1 / 1) = 1000
Announcement: S(a) = 100 * 20 * (1 / 2) = 1000
现在有了这些文件,我真的在那个文件上打破了......
我已考虑以下参数:
V(o) = number of views
V(a) = average number of views
C(o) = total number of comments
C(a) = average number of comments on this type of object
C(u) = number of comments by the user
SH(o) = total number of shares of this object
SH(a) average number of views of this type of object
SH(u) = has the user shared the document (1 = no, 2 = yes)
T = number of enlisted tags
我找到了一个简单的例子,说明了Facebook如何计算病毒性和病毒性。 here。他们使用以下公式:
Rank = Affinity * Weight * Decay
如果我将其转换为我的用例,亲和力将是对上面列出的参数进行计算的结果,权重将是基于总观看次数和共享划分的分数 - 最大值改变通过平均观看次数和份额,衰减将是一个复杂的计算,基于所发射的事件与创建对象的日期的相关性。
我试一试:
Affinity = C(u) * SH(u) * T * SH(u)
Weight = S(m) * (V(o) / V(a)) * (SH(o) / SH(a)) * (C(o) / C(a))
Decay = (1 / (now() - date_created())) * (1 / (now() - date-of-last-comment())
这会给我一些排名,但它缺少一些东西:
所以现在我被困了......
为了达到目的,我的问题是: