召回模塊:召回金字塔

日萌社

人工智能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 小結

  • 瞭解召回金字塔的原理和作用
  • 召回金字塔結構實現以及緩存實現

 

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