推荐系统学习笔记(九)曝光过滤 Bloom Filter
曝光过滤
如果用户看过某个物品,则系统不再把该物品曝光给该用户,这个思想称之为曝光过滤。
基本流程如下:
- 对于每个用户,记录已经曝光给他的物品。(小红书只召回1个月以内的笔记,因此只需要记录每个用户最近1个月的曝光历史)
- 对于每个召回的物品,判断它是否已经给该用户曝光过,排除掉曾经曝光过的物品。
- ⼀位⽤户看过 𝑛 个物品,本次召回 𝑟 个物品,如果暴⼒对⽐,需要 𝑂 (𝑛𝑟) 的时间
Bloom Filter
判断一个物品🆔是否在已曝光的物品集合中
- 如果判断为no,那么该物品一定不在集合中;
- 如果判断为yes,那么该物品很可能在集合中(可能误伤,错误判断未曝光物品为已曝光,将其过滤掉)。
参考文献:Burton H. Bloom. Space/time trade-offs in hash coding with allowable errors. Communications of the ACM , 1970.
具体流程如下:
- Bloom Filter 把物品集合表征为一个 m 维的二进制向量;
- 每个用户有一个曝光物品的集合,表征为一个向量,需要 m bit的存储空间
- Bloom filter 有 k 个哈希函数,每个哈希函数把物品ID映射成介于 0 和 m-1 之间的整数;
- 已曝光物品ID通过哈希函数映射进了二进制向量中对应的位置,如果该位置为0则调整为1,若为1无需调整;
- 对于召回的物品ID,通过哈希函数映射,若对应位置全为1,则说明该物品已曝光,否则未曝光。
若曝光物品集合⼤⼩为 𝑛,⼆进制向量维度为 𝑚,使⽤ 𝑘 个哈希函数
那么 Bloom filter 误伤的概率为:
设定可容忍的误伤概率为 𝛿,那么最优参数为:

💡注意:Bloom filter 只⽀持添加物品,不⽀持删除物品。从集合中移除物品,无法消除它对向量的影响。每天都需要从物品集合中移除年龄⼤于 1 个⽉的物品。