Kaynağa Gözat

position recall

baichongyang 3 yıl önce
ebeveyn
işleme
962c982853
3 değiştirilmiş dosya ile 53 ekleme ve 3 silme
  1. 6 0
      config.py
  2. 46 2
      recommend.py
  3. 1 1
      video_recall.py

+ 6 - 0
config.py

@@ -13,6 +13,7 @@ class BaseConfig(object):
     AB_CODE = {
     AB_CODE = {
         'initial': 10000,  # 初始
         'initial': 10000,  # 初始
         'w_h_rate': 10001,  # 视频宽高比实验(每组的前两个视频调整为横屏视频)
         'w_h_rate': 10001,  # 视频宽高比实验(每组的前两个视频调整为横屏视频)
+        'position_insert': 10002  # 按位置插入
     }
     }
 
 
     # pushFrom
     # pushFrom
@@ -22,6 +23,7 @@ class BaseConfig(object):
         'top': 'op_manual',  # 置顶
         'top': 'op_manual',  # 置顶
         'bottom': 'bottom_strategy',  # 一层兜底
         'bottom': 'bottom_strategy',  # 一层兜底
         'bottom_last': 'bottom_strategy_last',  # 二层兜底
         'bottom_last': 'bottom_strategy_last',  # 二层兜底
+        'position_insert': 'position_insert'  # 按位置插入
     }
     }
     # category id mapping
     # category id mapping
     CATEGORY = {
     CATEGORY = {
@@ -65,6 +67,10 @@ class BaseConfig(object):
     # 生效中的置顶视频列表 redis key
     # 生效中的置顶视频列表 redis key
     TOP_VIDEO_LIST_KEY_NAME = 'com.weiqu.video.top.item.score.area'
     TOP_VIDEO_LIST_KEY_NAME = 'com.weiqu.video.top.item.score.area'
 
 
+    # 按位置排序redis存储key
+    RECALL_POSITION1_KEY_NAME = 'com.weiqu.video.recall.hot.apptype.h.item.score.position.1'
+    RECALL_POSITION2_KEY_NAME = 'com.weiqu.video.recall.hot.apptype.h.item.score.position.2'
+
     # rov召回池更新时间
     # rov召回池更新时间
     ROV_UPDATE_H = 6
     ROV_UPDATE_H = 6
     ROV_UPDATE_MINUTE = 30
     ROV_UPDATE_MINUTE = 30

+ 46 - 2
recommend.py

@@ -3,17 +3,54 @@ import multiprocessing
 import traceback
 import traceback
 
 
 from datetime import datetime
 from datetime import datetime
+
+import config
 from log import Log
 from log import Log
 from config import set_config
 from config import set_config
 from video_recall import PoolRecall
 from video_recall import PoolRecall
 from video_rank import video_rank, bottom_strategy, video_rank_by_w_h_rate
 from video_rank import video_rank, bottom_strategy, video_rank_by_w_h_rate
 from db_helper import RedisHelper
 from db_helper import RedisHelper
 import gevent
 import gevent
+from utils import FilterVideos
+import ast
 
 
 log_ = Log()
 log_ = Log()
 config_ = set_config()
 config_ = set_config()
 
 
 
 
+def video_position_recommend(mid, uid, size, app_type, algo_type, client_info, videos):
+    # videos = video_recommend(mid=mid, uid=uid, size=size, app_type=app_type,
+    #                          algo_type=algo_type, client_info=client_info)
+    redis_helper = RedisHelper()
+    pos1_vids = redis_helper.get_data_from_redis(config.BaseConfig.RECALL_POSITION1_KEY_NAME)
+    pos2_vids = redis_helper.get_data_from_redis(config.BaseConfig.RECALL_POSITION2_KEY_NAME)
+    if pos1_vids is not None:
+        pos1_vids = ast.literal_eval(pos1_vids)
+    if pos2_vids is not None:
+        pos2_vids = ast.literal_eval(pos2_vids)
+
+    pos1_vids = [int(i) for i in pos1_vids]
+    pos2_vids = [int(i) for i in pos2_vids]
+
+    filter_1 = FilterVideos(app_type=app_type, video_ids=pos1_vids, mid=mid, uid=uid)
+    filter_2 = FilterVideos(app_type=app_type, video_ids=pos2_vids, mid=mid, uid=uid)
+    t = [gevent.spawn(filter_1.filter_videos), gevent.spawn(filter_2.filter_videos)]
+    gevent.joinall(t)
+    filted_list = [i.get() for i in t]
+
+    pos1_vids = filted_list[0]
+    pos2_vids = filted_list[1]
+
+    if pos1_vids is not None and len(pos1_vids) >0 :
+        videos.insert(0, {'videoId': int(pos1_vids[0]), 'rovScore': 100,
+                          'pushFrom': config_.PUSH_FROM['position_insert'], 'abCode': config_.AB_CODE['position_insert']})
+    if pos2_vids is not None and len(pos2_vids) >0 :
+        videos.insert(1, {'videoId': int(pos2_vids[0]), 'rovScore': 100,
+                          'pushFrom': config_.PUSH_FROM['position_insert'], 'abCode': config_.AB_CODE['position_insert']})
+
+    return videos[:10]
+
+
 def video_recommend(mid, uid, size, app_type, algo_type, client_info):
 def video_recommend(mid, uid, size, app_type, algo_type, client_info):
     """
     """
     首页线上推荐逻辑
     首页线上推荐逻辑
@@ -47,7 +84,7 @@ def video_recommend(mid, uid, size, app_type, algo_type, client_info):
     recall_result_list = []
     recall_result_list = []
     pool_recall = PoolRecall(app_type=app_type, mid=mid, uid=uid, ab_code=ab_code, client_info=client_info)
     pool_recall = PoolRecall(app_type=app_type, mid=mid, uid=uid, ab_code=ab_code, client_info=client_info)
     _, last_rov_recall_key, _ = pool_recall.get_video_last_idx()
     _, last_rov_recall_key, _ = pool_recall.get_video_last_idx()
-    t = [gevent.spawn(pool_recall.rov_pool_recall, size), gevent.spawn(pool_recall.flow_pool_recall, size) ]
+    t = [gevent.spawn(pool_recall.rov_pool_recall, size), gevent.spawn(pool_recall.flow_pool_recall, size)]
     gevent.joinall(t)
     gevent.joinall(t)
     recall_result_list = [i.get() for i in t]
     recall_result_list = [i.get() for i in t]
 
 
@@ -83,6 +120,13 @@ def video_recommend(mid, uid, size, app_type, algo_type, client_info):
         rank_result = video_rank_by_w_h_rate(videos=videos)
         rank_result = video_rank_by_w_h_rate(videos=videos)
         log_.info('app_type: {}, mid: {}, uid: {}, rank_result: {}, execute time = {}ms'.format(
         log_.info('app_type: {}, mid: {}, uid: {}, rank_result: {}, execute time = {}ms'.format(
             app_type, mid, uid, rank_result, (end_rank - start_rank) * 1000))
             app_type, mid, uid, rank_result, (end_rank - start_rank) * 1000))
+    #按position位置排序
+    if app_type == config_.APP_TYPE['SHORT_VIDEO']:
+        rank_result = video_position_recommend(mid, uid, size, app_type, algo_type, client_info, rank_result)
+        print('===========================')
+        print(rank_result)
+        log_.info('app_type: {}, mid: {}, uid: {}, rank_result: {}, execute time = {}ms'.format(
+            app_type, mid, uid, rank_result, (end_rank - start_rank) * 1000))
 
 
     # ####### redis数据刷新
     # ####### redis数据刷新
     # log_.info('====== update redis')
     # log_.info('====== update redis')
@@ -92,7 +136,7 @@ def video_recommend(mid, uid, size, app_type, algo_type, client_info):
     preview_video_ids = [int(item['videoId']) for item in rank_result]
     preview_video_ids = [int(item['videoId']) for item in rank_result]
     if preview_video_ids:
     if preview_video_ids:
         # log_.error('key_name = {} \n values = {}'.format(preview_key_name, tuple(preview_video_ids)))
         # log_.error('key_name = {} \n values = {}'.format(preview_key_name, tuple(preview_video_ids)))
-        redis_helper.add_data_with_set(key_name=preview_key_name, values=tuple(preview_video_ids), expire_time=30*60)
+        redis_helper.add_data_with_set(key_name=preview_key_name, values=tuple(preview_video_ids), expire_time=30 * 60)
         log_.info('preview redis update success!')
         log_.info('preview redis update success!')
 
 
     # 将此次获取的ROV召回池config_.K末位视频id同步刷新到Redis中,方便下次快速定位到召回位置,过期时间为1天
     # 将此次获取的ROV召回池config_.K末位视频id同步刷新到Redis中,方便下次快速定位到召回位置,过期时间为1天

+ 1 - 1
video_recall.py

@@ -11,7 +11,7 @@ import gevent
 log_ = Log()
 log_ = Log()
 config_ = set_config()
 config_ = set_config()
 
 
-    
+
 class PoolRecall(object):
 class PoolRecall(object):
     """召回"""
     """召回"""
     def __init__(self, app_type, client_info=None, mid='', uid='', ab_code=''):
     def __init__(self, app_type, client_info=None, mid='', uid='', ab_code=''):