背景
相似品类的商品易扎堆。显然的,如果商品的各特征相似,其获得的推荐分数也容易相近,而满目的同款肯定不是用户期望的结果。
对用户的偏好捕捉太强。用户心理层面,对于隐私或者偏好被完美捕捉这件事是敏感的,过于精准的结果不但容易导致用户的反感,也容易限制用户潜力的转化。
产生的错误容易被放大。对于几乎没有什么使用痕迹的用户,很容易出现对仅有特征的放大,从而就容易产生错误推荐。
问题定义
打散程度。究竟是让相同类目的尽可能分隔开,还是只要间隔一定距离就可以满足要求?
打散依据的维度。是按照一种属性分开就可以,还是存在多种需要考虑分开的因素?
打散的性能。作为经常调用的一种接口,性能的优化当然是越多越好。
解决方案
将他们按序装到桶里(通常是HashMap):

简单直接,容易实现
打散效果好,虽然排序可能导致元素在列的开头和结尾偶然相邻,但是在末尾之前,最多相邻元素为2,不影响体验
性能比较稳定,不易受输入结构影响
末尾打散失效,容易出现扎堆
对原序的尊重性不算强,即使有推荐系数非常低的对象也强制出现在前面
只能考虑一种维度的分类,无法综合考虑别的因素
权重分配法



实现同样简单直接
综合考虑了不同因素的打散,可以通过调整权重系数,轻易调整对打散的倾向程度
通过对权重计算函数的修改,可以很轻松的融入别的考量,如想更尊重原排序,也可以将原序加入权重计算
因为权重计算的累积效应,本算法仍然容易末尾失效
最后对整体排序,性能为O(n logn),相对有优化空间
窗口滑动法

综合考量


如果平常使用的场景,单一维度打散的话,采用按列打散是完全可以的
如果追求性能且原排列分布已经较为稀疏了,选择小单位的滑动窗口更佳
如果要引入多维度,则权重分配法就必不可少了
选用实例
商品列表长度约为2000,用户获取一次消息时的对象条数有限,一般只有一两位数
打散的要求:既要分开同一用户发布的,也要分开同一类目的商品,并且前者优先于后者,最好系数还可以调整
用户id极多(每个用户都可能发布商品),而商品类目极为有限
总结





