浏览代码

Merge branch 'feature_2023070413_liqian_add_ad_abtest' into pre-master

liqian 1 年之前
父节点
当前提交
05cdd81fb4
共有 4 个文件被更改,包括 193 次插入113 次删除
  1. 46 21
      config.py
  2. 21 17
      recommend.py
  3. 22 6
      video_rank.py
  4. 104 69
      video_recall.py

+ 46 - 21
config.py

@@ -488,6 +488,7 @@ class BaseConfig(object):
         'u2i_tag_recall':'u2i_tag_recall', #u2i_tag_recall
         'u2u2i_recall':'u2u2i_recall', #u2u2i_recall,
         'return_video_recall': 'return_video_recall',  # return_video_recall
+        'u2i_tag_play_recall': 'u2i_tag_play_recall', # u2i_tag_recall
     }
 
     # category id mapping
@@ -878,7 +879,7 @@ class BaseConfig(object):
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
-        },  # else未开启关怀模式人群多出广告 + 所有广告类型数据
+        },  # 所有广告类型数据 + 优化阈值计算方式 + else未开启关怀模式人群多出广告
         '173-k': {
             'video': {'data': 'videos0:adtype1'},
             'user': {'data': 'user0', 'rule': 'rule2'},
@@ -894,7 +895,7 @@ class BaseConfig(object):
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group', 'return0share1mids'],
-        },  # [else, return0share1mids]非关怀模式人群多出广告 + 所有广告类型数据
+        },  # 所有广告类型数据 + 优化阈值计算方式 + [else, return0share1mids]非关怀模式人群多出广告
 
         # 票圈视频+
         '190-a': {
@@ -934,7 +935,7 @@ class BaseConfig(object):
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
-        },  # 所有广告类型本端视频数据 + 优化1 + 未开启关怀模式人群多出广告
+        },  # 所有广告类型本端视频数据 + 优化阈值计算方式 + 未开启关怀模式人群多出广告
 
         # 票圈视频
         '194-a': {
@@ -960,19 +961,19 @@ class BaseConfig(object):
             'user': {'data': 'user4', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 本端数据 + 优化1
+        },  # 本端数据 + 优化阈值计算方式
         '194-e': {
             'video': {'data': 'videos4'},
             'user': {'data': 'user4', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 所有广告类型本端数据 + 优化1
+        },  # 所有广告类型本端数据 + 优化阈值计算方式
         '194-f': {
             'video': {'data': 'videos4:adtype1'},
             'user': {'data': 'user4', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 模板插屏广告视频本端数据 + 优化1
+        },  # 模板插屏广告视频本端数据 + 优化阈值计算方式
         '194-g': {
             'video': {'data': 'videos4'},
             'user': {'data': 'user4', 'rule': 'rule2'},
@@ -980,7 +981,15 @@ class BaseConfig(object):
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
-        },  # 所有广告类型本端数据 + 优化1 + else非关怀模式人群多出广告
+        },  # 所有广告类型本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告
+        '194-h': {
+            'video': {'data': 'videos4new'},
+            'user': {'data': 'user4new', 'rule': 'rule2'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+            'care_model_status_param': 1,
+            'care_model_ab_mid_group': ['mean_group'],
+        },  # 所有广告类型本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告 + 调整计算公式
 
         # 内容精选
         '195-a': {
@@ -1006,13 +1015,13 @@ class BaseConfig(object):
             'user': {'data': 'user5', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 本端数据 + 优化1
+        },  # 本端数据 + 优化阈值计算方式
         '195-e': {
             'video': {'data': 'videos5'},
             'user': {'data': 'user5', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 所有广告类型本端数据 + 优化1
+        },  # 所有广告类型本端数据 + 优化阈值计算方式
         '195-f': {
             'video': {'data': 'videos5'},
             'user': {'data': 'user5', 'rule': 'rule2'},
@@ -1020,7 +1029,7 @@ class BaseConfig(object):
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
-        },  # 所有广告类型本端数据 + 优化1 + else非关怀模式人群多出广告
+        },  # 所有广告类型本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告
         '195-g': {
             'video': {'data': 'videos5new'},
             'user': {'data': 'user5new', 'rule': 'rule2'},
@@ -1028,7 +1037,7 @@ class BaseConfig(object):
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
-        },  # 所有广告类型本端数据 + 优化1 + else非关怀模式人群多出广告
+        },  # 所有广告类型本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告 + 调整计算公式
 
         # 票圈短视频
         '196-a': {
@@ -1048,13 +1057,13 @@ class BaseConfig(object):
             'user': {'data': 'user6', 'rule': 'rule3'},
             'group_class_key': 'class2',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class2']
-        },  # 本端数据 + 优化1 + 优化2
+        },  # 本端数据 + 优化阈值计算方式 + 优化2
         '196-d': {
             'video': {'data': 'data4:7days'},
             'user': {'data': 'user6', 'rule': 'rule3'},
             'group_class_key': 'class2',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class2']
-        },  # 本端数据 + 优化1 + 优化2 + 优化4
+        },  # 本端数据 + 优化阈值计算方式 + 优化2 + 优化4
         '196-e': {
             'video': {'data': 'videos6'},
             'user': {'data': 'user6', 'rule': 'rule1'},
@@ -1082,25 +1091,33 @@ class BaseConfig(object):
             'user': {'data': 'user0', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 优化1 调整未分组用户的阈值(去除不出广告的用户组)
+        },  # 优化阈值计算方式 调整未分组用户的阈值(去除不出广告的用户组)
         '197-c': {
             'video': {'data': 'data5'},
             'user': {'data': 'user18', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 本端数据 + 优化1
+        },  # 本端数据 + 优化阈值计算方式
         '197-d': {
             'video': {'data': 'data5:7days'},
             'user': {'data': 'user18', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 本端数据 + 优化1 + 优化4
+        },  # 本端数据 + 优化阈值计算方式 + 优化4
         '197-e': {
             'video': {'data': 'videos18'},
             'user': {'data': 'user18', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
         },  # 所有广告类型本端数据 + 优化阈值计算方式
+        '197-f': {
+            'video': {'data': 'data5'},
+            'user': {'data': 'user18', 'rule': 'rule2'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+            'care_model_status_param': 1,
+            'care_model_ab_mid_group': ['mean_group'],
+        },  # 本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告
 
         # 票圈最惊奇
         '198-a': {
@@ -1120,19 +1137,27 @@ class BaseConfig(object):
             'user': {'data': 'user0', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 优化1
+        },  # 优化阈值计算方式
         '198-d': {
             'video': {'data': 'data6'},
             'user': {'data': 'user19', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 本端数据 + 优化1
+        },  # 本端数据 + 优化阈值计算方式
         '198-e': {
             'video': {'data': 'videos19'},
             'user': {'data': 'user19', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
         },  # 所有广告类型本端数据 + 优化阈值计算方式
+        '198-f': {
+            'video': {'data': 'videos19'},
+            'user': {'data': 'user19', 'rule': 'rule2'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+            'care_model_status_param': 1,
+            'care_model_ab_mid_group': ['mean_group'],
+        },  # 所有广告类型本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告
 
         # 票圈足迹
         '242-a': {
@@ -1146,7 +1171,7 @@ class BaseConfig(object):
             'user': {'data': 'user0', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # vlog数据 + 优化1
+        },  # vlog数据 + 优化阈值计算方式
         '242-c': {
             'video': {'data': 'videos22'},
             'user': {'data': 'user22', 'rule': 'rule2'},
@@ -1174,7 +1199,7 @@ class BaseConfig(object):
             'user': {'data': 'user0', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # vlog数据 + 优化1
+        },  # vlog数据 + 优化阈值计算方式
         '243-c': {
             'video': {'data': 'videos3'},
             'user': {'data': 'user3', 'rule': 'rule1'},
@@ -1198,7 +1223,7 @@ class BaseConfig(object):
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
-        },  # vlog数据 + 未开启关怀模式人群多出广告 + 所有广告类型数据
+        },  # vlog所有广告类型数据 + 所有广告类型数据 + 未开启关怀模式人群多出广告
     }
 
     # 用户组有广告时的分享率预测结果存放 redis key 前缀,完整格式:ad:users:group:predict:share:rate:{user_data_key}:{date}

+ 21 - 17
recommend.py

@@ -218,6 +218,7 @@ def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, al
         t = [gevent.spawn(pool_recall.rov_pool_recall_with_region, size, expire_time, ab_code, exp_config)]
         if ab_code==60058:
             t.append(gevent.spawn(pool_recall.get_U2I_reall, mid, exp_config))
+            t.append(gevent.spawn(pool_recall.get_play_reall, mid, exp_config))
         elif  ab_code==60059:
             t.append(gevent.spawn(pool_recall.get_word2vec_item_reall, exp_config))
         elif  ab_code==60061 or ab_code==60063:
@@ -232,6 +233,7 @@ def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, al
              gevent.spawn(pool_recall.flow_pool_recall, size)]
         if ab_code==60058:
             t.append(gevent.spawn(pool_recall.get_U2I_reall, mid, exp_config))
+            t.append(gevent.spawn(pool_recall.get_play_reall, mid, exp_config))
         elif ab_code == 60059:
             t.append(gevent.spawn(pool_recall.get_word2vec_item_reall, exp_config))
         elif ab_code == 60061 or ab_code==60063:
@@ -320,12 +322,15 @@ def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, al
                 'flow_pool_recall': recall_result_list[2]
             }
     data['u2i_recall'] = []
+    data['u2i_play_recall'] = []
     data['w2v_recall'] = []
     data['sim_recall'] = []
     data['u2u2i_recall'] = []
     if ab_code == 60058:
         if len(recall_result_list)>=4:
             data['u2i_recall'] = recall_result_list[3]
+        if len(recall_result_list)>=5:
+            data['u2i_play_recall'] = recall_result_list[4]
     elif ab_code == 60059:
         if len(recall_result_list)>=4:
             data['w2v_recall'] = recall_result_list[3]
@@ -450,9 +455,9 @@ def video_old_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type
         if ab_code ==60054 :
             t.append(gevent.spawn(pool_recall.get_sim_hot_item_reall_filter, exp_config))
         if ab_code == 60055:
-            t.append(gevent.spawn(pool_recall.get_3days_hot_item_reall, exp_config))
+            t.append(gevent.spawn(pool_recall.get_return_video_reall, exp_config))
         if ab_code == 60056:
-            t.append(gevent.spawn(pool_recall.get_hot_item_reall, exp_config))
+            t.append(gevent.spawn(pool_recall.get_U2I_reall, mid , exp_config))
     else:
         t = [gevent.spawn(pool_recall.rov_pool_recall_with_region, size, expire_time, ab_code, exp_config),
              gevent.spawn(pool_recall.flow_pool_recall, size, config_.QUICK_FLOW_POOL_ID),
@@ -460,9 +465,9 @@ def video_old_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type
         if  ab_code == 60054:
             t.append(gevent.spawn(pool_recall.get_sim_hot_item_reall_filter))
         if ab_code == 60055:
-            t.append(gevent.spawn(pool_recall.get_3days_hot_item_reall))
+            t.append(gevent.spawn(pool_recall.get_return_video_reall, exp_config))
         if ab_code == 60056:
-            t.append(gevent.spawn(pool_recall.get_hot_item_reall))
+            t.append(gevent.spawn(pool_recall.get_U2I_reall, mid , exp_config))
 
     gevent.joinall(t)
     recall_result_list = [i.get() for i in t]
@@ -499,17 +504,17 @@ def video_old_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type
                         now_video_ids.add(video_id)
             if len(rov_pool_recall) > 0:
                 recall_result_list[0] = rov_pool_recall
-    # merge hot 3day recall
+    # merge return video
     if ab_code == 60055:
         rov_pool_recall = []
         if len(recall_result_list)>=2:
             region_recall = recall_result_list[0]
-            hot_3_day_recall = []
+            return_video_reall = []
             if app_type in [config_.APP_TYPE['LAO_HAO_KAN_VIDEO'], config_.APP_TYPE['ZUI_JING_QI']]:
-                hot_3_day_recall = recall_result_list[1]
+                return_video_reall, = recall_result_list[1]
             else:
                 if len(recall_result_list)>=4:
-                    hot_3_day_recall = recall_result_list[3]
+                    return_video_reall = recall_result_list[3]
             #print("sim:",sim_recall)
             now_video_ids = set('')
             if len(region_recall)>0:
@@ -518,26 +523,25 @@ def video_old_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type
                     if video_id not in now_video_ids:
                         rov_pool_recall.append(video)
                         now_video_ids.add(video_id)
-            if len(hot_3_day_recall)>0:
-                for video in hot_3_day_recall:
+            if len(return_video_reall)>0:
+                for video in return_video_reall:
                     video_id = video.get('videoId')
-                    #print("sim video_id:", video_id)
                     if video_id not in now_video_ids:
                         rov_pool_recall.append(video)
                         now_video_ids.add(video_id)
             if len(rov_pool_recall)>0:
                 recall_result_list[0] = rov_pool_recall
-    # merge old day recall
+    # merge u2i title recall
     if ab_code == 60056:
         rov_pool_recall = []
         if len(recall_result_list)>=2:
             region_recall = recall_result_list[0]
-            hot_7_day_recall = []
+            u2i_title_recall = []
             if app_type in [config_.APP_TYPE['LAO_HAO_KAN_VIDEO'], config_.APP_TYPE['ZUI_JING_QI']]:
-                hot_7_day_recall = recall_result_list[1]
+                u2i_title_recall = recall_result_list[1]
             else:
                 if len(recall_result_list) >= 3:
-                    hot_7_day_recall = recall_result_list[3]
+                    u2i_title_recall = recall_result_list[3]
             now_video_ids = set('')
             if len(region_recall)>0:
                 for video in region_recall:
@@ -545,8 +549,8 @@ def video_old_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type
                     if video_id not in now_video_ids:
                         rov_pool_recall.append(video)
                         now_video_ids.add(video_id)
-            if len(hot_7_day_recall)>0:
-                for video in hot_7_day_recall:
+            if len(u2i_title_recall)>0:
+                for video in u2i_title_recall:
                     video_id = video.get('videoId')
                     #print("sim video_id:", video_id)
                     if video_id not in now_video_ids:

+ 22 - 6
video_rank.py

@@ -607,15 +607,24 @@ def video_new_rank2(data, size, top_K, flow_pool_P, ab_code, exp_config=None):
     redisObj = RedisHelper()
     vidKeys = []
     recall_list = []
+    #全量的是vlog,票圈精选, 334,60057,
+    # 60054: simrecall,
+    # 60052: 票圈精选,融合排序,60053:空置
+    # 60055: video_reall
+    # 60056: get_U2I_reall
     pre_str = "k_p2:"
-    if ab_code == 60052 or ab_code == 60053  or ab_code==60057:
+    if ab_code==60057:
         pre_str = "k_p2:"
+    elif ab_code == 60052:
+        pre_str = "k_p5:"
+    elif ab_code == 60053:
+        pre_str = "k_p8:"
     elif ab_code == 60054:
         pre_str = "k_p3:"
     elif ab_code == 60055:
         pre_str = "k_p4:"
     elif ab_code == 60056:
-        pre_str = "k_p5:"
+        pre_str = "k_p7:"
     #print("pre_str:", pre_str)
     for recall_item in data['rov_pool_recall']:
         if len(recall_item)<=0:
@@ -916,14 +925,21 @@ def video_sank_pos_rank(data, size, top_K, flow_pool_P, ab_Code='', exp_config=N
     rule_24h_dup_recall_rank = sorted(rule_24h_dup_recall, key=lambda k: k.get('rovScore', 0), reverse=True)
     recall_dict['rov_recall_24h_dup'] = rule_24h_dup_recall_rank
     u2i_recall = []
+    u2i_play_recall = []
     w2v_recall =[]
     sim_recall = []
     u2u2i_recall = []
     return_video_recall = []
+    #print("")
     if ab_Code==60058:
         if len(data['u2i_recall'])>0:
-            u2i_recall = sorted(data['u2i_recall'], key=lambda k: k.get('rovScore', 0), reverse=True)
-        recall_dict['u2i_recall'] = u2i_recall
+            recall_dict['u2i_recall'] = data['u2i_recall']
+        else:
+            recall_dict['u2i_recall'] = u2i_recall
+        if len(data['u2i_play_recall']) > 0:
+            recall_dict['u2i_play_recall'] = data['u2i_play_recall']
+        else:
+            recall_dict['u2i_play_recall'] = u2i_play_recall
     elif ab_Code==60059:
         if len(data['w2v_recall'])>0:
             recall_dict['w2v_recall'] = data['w2v_recall']
@@ -961,7 +977,7 @@ def video_sank_pos_rank(data, size, top_K, flow_pool_P, ab_Code='', exp_config=N
         recall_pos2 = exp_config['recall_pos2']
         recall_pos3 = exp_config['recall_pos3']
         recall_pos4 = exp_config['recall_pos4']
-    #print("recall_config:", recall_list)
+    #print("recall_config:", recall_pos1)
     rov_recall_rank = []
     recall_list = []
     recall_list.append(recall_pos1)
@@ -1012,7 +1028,7 @@ def video_sank_pos_rank(data, size, top_K, flow_pool_P, ab_Code='', exp_config=N
                         break
     #print("rov_recall_rank:", rov_recall_rank)
     if len(rov_recall_rank)<4:
-        rov_doudi_rank = region_h_recall_rank + sim_recall + u2i_recall + u2u2i_recall + w2v_recall +return_video_recall+ region_24h_recall_rank + rule_24h_recall_rank + rule_24h_dup_recall_rank
+        rov_doudi_rank = region_h_recall_rank + sim_recall + u2i_recall + u2u2i_recall + w2v_recall +return_video_recall+u2i_play_recall+ region_24h_recall_rank + rule_24h_recall_rank + rule_24h_dup_recall_rank
         for recall_item in rov_doudi_rank:
             vid = recall_item['videoId']
             if vid in select_ids:

+ 104 - 69
video_recall.py

@@ -2391,25 +2391,21 @@ class PoolRecall(object):
 
     def get_3days_hot_item_reall(self, exp_config=None):
         recall_key = "hot_3day:"
-        #print("recall_key:", recall_key)
         data = self.redis_helper.get_data_from_redis(key_name=recall_key)
-
-        #print(data)
         recall_result = []
         recall_dict  = {}
         video_ids = []
-        if data is not None:
-            json_result = json.loads(data)
-            #print("json_result:", json_result)
-            for per_item in json_result:
-                try:
-                    vid = int(per_item[0])
-                    video_ids.append(vid)
-                    recall_dict[vid] = {'videoId': vid, 'flowPool': '',
-                         'rovScore': per_item[1], 'pushFrom': config_.PUSH_FROM['hot_3_day_recall'],
-                         'abCode': self.ab_code}
-                except Exception as e:
-                    continue
+        if data is not None and data!="":
+            try:
+                json_result = json.loads(data)
+                for per_item in json_result:
+                        vid = int(per_item[0])
+                        video_ids.append(vid)
+                        recall_dict[vid] = {'videoId': vid, 'flowPool': '',
+                             'rovScore': per_item[1], 'pushFrom': config_.PUSH_FROM['hot_3_day_recall'],
+                             'abCode': self.ab_code}
+            except Exception as e:
+                return  recall_result
         #print("vid len:", len(video_ids))
         if len(video_ids)<=0:
             return  recall_result
@@ -2439,23 +2435,20 @@ class PoolRecall(object):
         recall_key = "hot_video:"
         #print("recall_key:", recall_key)
         data = self.redis_helper.get_data_from_redis(key_name=recall_key)
-
-        #print(data)
         recall_result = []
         recall_dict  = {}
         video_ids = []
-        if data is not None:
-            json_result = json.loads(data)
-            # print("json_result:", json_result)
-            for per_item in json_result:
-                try:
+        if data is not None and data!="":
+            try:
+                json_result = json.loads(data)
+                for per_item in json_result:
                     vid = int(per_item[0])
                     video_ids.append(vid)
                     recall_dict[vid] = {'videoId': vid, 'flowPool': '',
-                         'rovScore': per_item[1], 'pushFrom': config_.PUSH_FROM['hot_recall'],
-                         'abCode': self.ab_code}
-                except Exception as e:
-                    continue
+                             'rovScore': per_item[1], 'pushFrom': config_.PUSH_FROM['hot_recall'],
+                             'abCode': self.ab_code}
+            except Exception as e:
+                recall_result
         if len(video_ids)<=0:
             return  recall_result
         recall_num = 20
@@ -2490,18 +2483,17 @@ class PoolRecall(object):
         recall_result = []
         recall_dict = {}
         video_ids = []
-        if data is not None:
-            json_result = json.loads(data)
-            # print("json_result:", json_result)
-            for per_item in json_result:
-                try:
-                    vid = int(per_item[0])
-                    video_ids.append(vid)
-                    recall_dict[vid] = {'videoId': vid, 'flowPool': '',
-                                        'rovScore': per_item[1], 'pushFrom': config_.PUSH_FROM['title_i2i_recall'],
-                                        'abCode': self.ab_code}
-                except Exception as e:
-                    continue
+        if data is not None and data!="":
+            try:
+                json_result = json.loads(data)
+                for per_item in json_result:
+                        vid = int(per_item[0])
+                        video_ids.append(vid)
+                        recall_dict[vid] = {'videoId': vid, 'flowPool': '',
+                                            'rovScore': per_item[1], 'pushFrom': config_.PUSH_FROM['title_i2i_recall'],
+                                            'abCode': self.ab_code}
+            except Exception as e:
+                return recall_result
         if len(video_ids) <= 0:
             return recall_result
         video_ids = video_ids[:50]
@@ -2529,17 +2521,16 @@ class PoolRecall(object):
         recall_dict  = {}
         video_ids = []
         if data is not None and data.strip()!="":
-            json_result = data.strip().split(",")
-            # print("json_result:", json_result)
-            for per_item in json_result:
-                try:
-                    vid = int(per_item)
-                    video_ids.append(vid)
-                    recall_dict[vid] = {'videoId': vid, 'flowPool': '',
-                         'rovScore': 0.0, 'pushFrom': config_.PUSH_FROM['w2v_recall'],
-                         'abCode': self.ab_code}
-                except Exception as e:
-                    continue
+            try:
+                json_result = data.strip().split(",")
+                for per_item in json_result:
+                        vid = int(per_item)
+                        video_ids.append(vid)
+                        recall_dict[vid] = {'videoId': vid, 'flowPool': '',
+                             'rovScore': 0.0, 'pushFrom': config_.PUSH_FROM['w2v_recall'],
+                             'abCode': self.ab_code}
+            except Exception as e:
+                return  recall_result
         if len(video_ids)<=0:
             return  recall_result
         recall_num = 20
@@ -2567,7 +2558,7 @@ class PoolRecall(object):
         recall_key = "test_exp_config_pos"
         # print("recall_key:", recall_key)
         data = self.redis_helper.get_data_from_redis(key_name=recall_key)
-        if data is not None:
+        if data is not None and  data!="":
             try:
                 #print(data)
                 json_result = json.loads(data)
@@ -2581,7 +2572,7 @@ class PoolRecall(object):
     def get_w2v_config(self):
         recall_key = "w2v_exp_config_pos_range"
         data = self.redis_helper.get_data_from_redis(key_name=recall_key)
-        if data is not None:
+        if data is not None and data!="":
             try:
                 #print(data)
                 json_result = json.loads(data)
@@ -2611,7 +2602,7 @@ class PoolRecall(object):
         recall_key = "simrecall_exp_config_range"
         #print("recall_key:", recall_key)
         data = self.redis_helper.get_data_from_redis(key_name=recall_key)
-        if data is not None:
+        if data is not None and data!="":
             try:
                 # print(data)
                 json_result = json.loads(data)
@@ -2637,9 +2628,9 @@ class PoolRecall(object):
             return None
 
     def get_U2I_config(self):
-        recall_key = "u2i_exp_config_pos_range"
+        recall_key = "u2i_exp_config_pos_range_new"
         data = self.redis_helper.get_data_from_redis(key_name=recall_key)
-        if data is not None:
+        if data is not None and data!="":
             try:
                 # print(data)
                 json_result = json.loads(data)
@@ -2739,18 +2730,17 @@ class PoolRecall(object):
         recall_result = []
         recall_dict  = {}
         video_ids = []
-        if data is not None:
-            json_result = json.loads(data)
-            #print("json_result:", json_result)
-            for per_item in json_result:
-                try:
+        if data is not None and data!="":
+            try:
+                json_result = json.loads(data)
+                for per_item in json_result:
                     vid = int(per_item[0])
                     video_ids.append(vid)
                     recall_dict[vid] = {'videoId': vid, 'flowPool': '',
                          'rovScore': float(per_item[1]), 'pushFrom': config_.PUSH_FROM['u2i_tag_recall'],
                          'abCode': self.ab_code}
-                except Exception as e:
-                    continue
+            except Exception as e:
+                return  recall_result
         if len(video_ids)<=0:
             return  recall_result
         recall_num = 20
@@ -2824,7 +2814,7 @@ class PoolRecall(object):
     def get_video_recall_config(self):
         recall_key = "vr_exp_pos_config_range"
         data = self.redis_helper.get_data_from_redis(key_name=recall_key)
-        if data is not None:
+        if data is not None and data!="":
             try:
                 # print(data)
                 json_result = json.loads(data)
@@ -2846,18 +2836,63 @@ class PoolRecall(object):
         recall_result = []
         recall_dict  = {}
         video_ids = []
-        if data is not None:
-            json_result = json.loads(data)
-            #print("json_result:", json_result)
-            for per_item in json_result:
-                try:
+        if data is not None and data!="" :
+            try:
+                json_result = json.loads(data)
+                for per_item in json_result:
                     vid = int(per_item[0])
                     video_ids.append(vid)
                     recall_dict[vid] = {'videoId': vid, 'flowPool': '',
                          'rovScore': float(per_item[1]), 'pushFrom': config_.PUSH_FROM['return_video_recall'],
                          'abCode': self.ab_code}
-                except Exception as e:
-                    continue
+            except Exception as e:
+                return recall_result
+        if len(video_ids)<=0:
+            return  recall_result
+        recall_num = 20
+        try:
+            if exp_config and exp_config['recall_get_num']:
+                recall_num = int(exp_config['recall_get_num'])
+        except:
+            recall_num = 20
+        #print("recall_num:", recall_num)
+        video_ids = video_ids[:recall_num]
+        #print(video_ids)
+        filter_ = FilterVideos(request_id=self.request_id,
+                               app_type=self.app_type, mid=self.mid, uid=self.uid, video_ids=video_ids)
+        filtered_viewed_videos = filter_.filter_videos_status(pool_type='normal')
+        if filtered_viewed_videos is None:
+            return recall_result
+        #print("filtered_viewed_videos:", filtered_viewed_videos)
+        for vid in filtered_viewed_videos:
+            if vid in recall_dict:
+                recall_result.append(recall_dict[vid])
+        #print("u2i recall_result:", recall_result)
+        return recall_result
+
+    def get_play_reall(self, mid, exp_config=None):
+        #recall_key = "hot_video:"
+        if not mid:
+            return  []
+        recall_key = "u2i_play:"+mid
+        #print("recall_key:", recall_key)
+        data = self.redis_helper.get_data_from_redis(key_name=recall_key)
+
+        #print(data)
+        recall_result = []
+        recall_dict  = {}
+        video_ids = []
+        if data is not None and data!="":
+            try:
+                json_result = json.loads(data)
+                for per_item in json_result:
+                    vid = int(per_item[0])
+                    video_ids.append(vid)
+                    recall_dict[vid] = {'videoId': vid, 'flowPool': '',
+                         'rovScore': float(per_item[1]), 'pushFrom': config_.PUSH_FROM['u2i_tag_play_recall'],
+                         'abCode': self.ab_code}
+            except Exception as e:
+                return  recall_result
         if len(video_ids)<=0:
             return  recall_result
         recall_num = 20