1、算法思想
1.1、理解算法过程
- 我们在写算法的时候要先理解我们的对象和之间的关系,我这里举例供求信息和用户设置标签,两者关系是,系统会根据用户设置的标签来匹配与其相似度较高的,同时用户发布的供求信息的标签也会影响系统推荐的供求信息,这里还需要涉及到权重问题。
(1)我们应该采用什么计算方式来计算,我这里采用简单 交集 / 并集 计算相似度的计算方法。
(2)还需要考虑以下三大方面的影响因素 :
- 个人标签设置(A:时间衰减度,B:相似度计算)
- 发布供求标签(C:时间衰减度,D:相似度计算,E:商机类型占比)
- 其他因素(F:供求发布时间衰减度,G:移除自己发布的供求,H:企业认证/个人认证/VIP特权/权重等)
(3)以下是相关计算:
- A/C/F:时间衰减度 = 更新时间戳 / 当前时间 * β(β为一个设置的稳定参数,根据数据分析去设置)
- B/D:相似度计算如下:另外还有其他的 相似度计算方法
假设 A = 某条供求与用户标签的相似度
假设 B = 某条供求与用户发布供求的标签相似度
假设 C = 某条供求标签与用户标签交集总数
假设 D = 某条供求标签与用户标签并集总数
假设 X = 某条供求标签与用户发布供求的标签交集总数
假设 Y = 某条供求标签与用户发布供求的标签并集总数公式1:某条供求的相似度 = A * 占比 + B * 占比
公式2:A = C / D * 出现概率(默认是1,因为用户无重复标签)
公式3:B = X / Y * 出现概率
- E:用户发布商机类型占比是根据自己业务需求去加的,不是必须项。
假设A = 用户发布的出售类型商机数量
假设B = 用户发布的求购类型商机数量用户发布出售类型商机占比 C = A / ( A + B )
用户发布求购类型商机占比 D = B / ( A + B )
那么用户需求则正好相反,推荐的出售商机占比为 D,推荐的求购商机占比为 C。
另外如果用户未发不过商机和求购则按照 1:1
如果用户发布的全是求购则推给他的 出售:求购 = 9 : 1(这里的9:1自行设置)
- G:将个人发布的供求 排除 在推荐列表中,供求数据采用 缓存存储 ,
- H:这里的其他参数也是需要平衡后才能加入进行相似度计算的。
(4)采用 自定义分页 筛选后再进行 数据库查询 。
1.2、实操分步解析
1、将数据库供求列表存储到 Redis 中,可以用 hash 存储,如下图:
- 保存的时候注意这里的域key是 对应供求的ID ,值则是 供求的数据 ,里面的field最好是用到的才存进去,不然数据量大的话取出来的速度也会降低,影响首页内容输出速率。
我们要注意的是每次 发布一条供求 或者 审核通过 时候将该条 保存到redis 中,这样就不用全部导入了
2、需要分 游客 和 用户 两种登录情况的推荐。正常情况下,游客就按照数据库的排序就行了。
3、需要将 自己发布的供求 移除 推荐列表
4、封装统一的 计算相似度的方法,这样便于用,同时要考虑 用户未设置标签或未发布一条供求的情况
5、封装对应的 分页方法,我在下面也会提供我封装的方法。
2、代码实现
2.1、获取推荐列表的方法(我是封装成服务类方法)
/**
* 推荐算法返回商机
* @p