日萌社
人工智能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 小結
- 瞭解召回金字塔的原理和作用
- 召回金字塔結構實現以及緩存實現