召回模块:召回金字塔

日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)


2.4 召回金字塔

学习目标

  • 目标
    • 知道召回金字塔的作用
  • 应用
    • 应用完成召回金字塔的实现

2.4.1 召回金字塔

2.4.1.1 为什么用召回金字塔

因为考虑到计算资源在数据变动时的滞后性,以及如何满足个别用户快速消费的需求, 我们引入召回金字塔模型, 并为每一位用户维护一组该模型。过程如下

  • 满足公共召回策略帖子构成"金字塔"的底层,满足个性化召回策略帖子构成"金字塔"的中层, 各项召回策略叠加的帖子处在上层,从塔尖到塔底曝光比率逐渐增加。塔尖数据一般会优先进入下一个流程。 用户一次一般只会消费金子塔中的部分数据,因为全局召回按照窗口时间有序进行。

因此在此期间的用户推荐只需重新计算金字塔中的数据,并重新排列,保证金字塔数据的用户最快消费时间< 全局召回时间, 就可以保证用户获取到新的数据,并及时响应了用户最新行为。

2.4.1.2 召回金字塔实现

  • 什么是召回金字塔: 用于存放召回数据的缓存, 一般使用redis/ES实现, 并根据召回策略命中率进行从大到小排序, 将头部数据输送给规则过滤器服务.
  • 召回金字塔作用:
    • 进一步缩小精排序的数据规模, 以便满足性能要求
    • 减轻召回池计算压力, 在全体数据无法实时计算时, 只需将金字塔中的数据进行计算并排序进而返回
  • 召回金字塔机制实现(召回策略未分配权重)

  • 输入:all_data=[[1,23,2], [3,2,54], [1,2,432]]

  • 输出: [2,1,3,23,54,432],并且给每个数据进行权重计算,排序后输出pid

召回金字塔机制实现:

from itertools import chain

def pyramid_array(all_data):
    result = []
    for pid in set(chain(*all_data)):
        v = 0
        for list_ in all_data:
            if pid in list_:
                v += 1
        result.append([pid, v])

    result.sort(key=lambda x: x[1])
    return list(map(lambda x: x[0], result))[::-1]

2.4.1.3 写入缓存数据

  • _get_recomm:中使用
    • r_data = j_data_write(uid, j_data):将数据写入金子塔并返回应该推送给规则过滤器的数据
def j_data_write(uid, j_data):
    """将该用户的所有金字塔数据写入"""
    r = redis.StrictRedis(connection_pool=pool)
    r.set('j_' + str(uid), str(j_data)) 

    # 与当前(即上一次推送给)规则过滤器中数据做去重处理后推给过滤器
    old = r.get('r_' + str(uid)) 
    if not old:
        r_data = j_data[:50] 
    else:
        # 集合做差集
        r_data = list(set(j_data) - set(eval(old)))[:50] 

    r.set('r_'+str(uid), str(r_data))
    return r_data

redis连接配置

REDIS_CONFIG = dict({
    "host":"192.168.19.137",
    "port":"6379",
    "decode_responses":True  
})

pool = redis.ConnectionPool(**REDIS_CONFIG)

2.4.1.4 整体召回模块功能添加

def _get_recomm(IP, uid):
    """推荐全流程"""
    # 1、获取召回数据
    #(1)获得热门召回数据
    hot_data = _get_hot()
    # 获得最近发布召回数据
    last_data = get_last()
    # 获得单位时间内增长速度最快的帖子
    v_data = get_v()
    # 获得基于用户的协同过滤召回数据
    r_data = get_r(uid)
    # 随机召回数据
    random_data = get_random()
    all_data = [hot_data] + [last_data] + [v_data] + [r_data] + [random_data]
    # 进行金字塔规则计算并写入
    # (2)不给召回策略施加任何权重的召回金字塔计算
    j_data = pyramid_array(all_data)
    # 将数据写入金子塔并返回应该推送给规则过滤器的数据
    r_data = j_data_write(uid, j_data)
    # (3)将数据推送给规则规律器做数据内部去重
    # f_data = rfilter(r_data)

    # 2、排序部分
    return v_get_cache(IP)

2.4.2 小结

  • 了解召回金字塔的原理和作用
  • 召回金字塔结构实现以及缓存实现

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章