Quellcode durchsuchen

Merge branch 'feature_2023060711_liqian_add_ad_abtest_195-f' into pre-master

liqian vor 2 Jahren
Ursprung
Commit
445d9f2aa7
4 geänderte Dateien mit 309 neuen und 81 gelöschten Zeilen
  1. 9 0
      config.py
  2. 38 21
      recommend.py
  3. 122 50
      video_rank.py
  4. 140 10
      video_recall.py

+ 9 - 0
config.py

@@ -470,6 +470,7 @@ class BaseConfig(object):
         'hot_3_day_recall': 'hot_3_day_recall',  # 3天召回
         'hot_recall': 'hot_recall',  # hot召回
         'w2v_recall': 'w2v_recall', #word2vec
+        'u2i_tag_recall':'u2i_tag_recall', #u2i_tag_recall
     }
 
     # category id mapping
@@ -971,6 +972,14 @@ class BaseConfig(object):
             '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'},
+            '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',
+        },  # 所有广告类型本端数据 + 优化1 + else非关怀模式人群多出广告
 
         # 票圈短视频
         '196-a': {

+ 38 - 21
recommend.py

@@ -176,6 +176,7 @@ def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, al
     pool.close()
     pool.join()
     '''
+
     recall_result_list = []
     pool_recall = PoolRecall(request_id=request_id,
                              app_type=app_type, mid=mid, uid=uid, ab_code=ab_code,
@@ -195,20 +196,32 @@ def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, al
     # 地域分组实验
     # if ab_code in [code for _, code in config_.AB_CODE['region_rank_by_h'].items()]:
 
+    # load test config
+    exp_config = None
+
+    if ab_code == 60058:
+        exp_config = pool_recall.get_U2I_config()
+    elif ab_code == 60059:
+        exp_config = pool_recall.get_w2v_config()
+    elif ab_code == 60060:
+        exp_config = pool_recall.get_test_config()
+    elif ab_code == 60061:
+        exp_config = pool_recall.get_simrecall_config()
+    #print("exp_config:", exp_config)
     if app_type in [config_.APP_TYPE['LAO_HAO_KAN_VIDEO'], config_.APP_TYPE['ZUI_JING_QI']]:
-        t = [gevent.spawn(pool_recall.rov_pool_recall_with_region, size, expire_time)]
+        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_hot_item_reall))
+            t.append(gevent.spawn(pool_recall.get_U2I_reall, mid))
         elif  ab_code==60059:
             t.append(gevent.spawn(pool_recall.get_word2vec_item_reall))
         elif  ab_code==60061:
             t.append(gevent.spawn(pool_recall.get_sim_hot_item_reall_filter))
     else:
-        t = [gevent.spawn(pool_recall.rov_pool_recall_with_region, size, expire_time),
+        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),
              gevent.spawn(pool_recall.flow_pool_recall, size)]
         if ab_code==60058:
-            t.append(gevent.spawn(pool_recall.get_hot_item_reall))
+            t.append(gevent.spawn(pool_recall.get_U2I_reall, mid))
         elif ab_code == 60059:
             t.append(gevent.spawn(pool_recall.get_word2vec_item_reall))
         elif ab_code == 60061:
@@ -296,9 +309,9 @@ def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, al
 
     if ab_code == 60058:
         if len(recall_result_list)>=4:
-            data['hot_recall'] = recall_result_list[3]
+            data['u2i_recall'] = recall_result_list[3]
         else:
-            data['hot_recall'] = []
+            data['u2i_recall'] = []
     elif ab_code == 60059:
         if len(recall_result_list)>=4:
             data['w2v_recall'] = recall_result_list[3]
@@ -314,17 +327,10 @@ def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, al
     #else:
     #print("data['hot_recall']", data['hot_recall'])
     if ab_code == 60058 or ab_code == 60059 or ab_code == 60060 or ab_code == 60061 :
-        test_config = None
-        if ab_code == 60058:
-            test_config =pool_recall.get_hotrecall_config()
-        elif ab_code == 60059:
-            test_config = pool_recall.get_w2v_config()
-        elif ab_code == 60060:
-            test_config = pool_recall.get_test_config()
-        elif ab_code == 60061:
-            test_config = pool_recall.get_simrecall_config()
-        #print("test config:",test_config)
-        rank_result = video_sanke_rank(data=data, size=size, top_K=top_K, flow_pool_P=float(flow_pool_P), ab_Code=ab_code, exp_config=test_config)
+        rank_result, flow_num = video_sanke_rank(data=data, size=size, top_K=top_K, flow_pool_P=float(flow_pool_P), ab_Code=ab_code, exp_config=exp_config)
+        result['flow_num'] = flow_num
+        if rank_result:
+            result['rank_num'] = len(rank_result)
     else:
         rank_result = video_rank(data=data, size=size, top_K=top_K, flow_pool_P=float(flow_pool_P))
 
@@ -414,8 +420,17 @@ def video_old_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type
                              client_info=client_info, rule_key=rule_key, data_key=data_key, no_op_flag=no_op_flag,
                              params=params, rule_key_30day=rule_key_30day, shield_config=shield_config, video_id= video_id)
 
+    exp_config = None
+    if ab_code == 60052:
+        exp_config = pool_recall.get_flow_exp_7_config()
+    elif ab_code == 60053:
+        exp_config = pool_recall.get_flow_exp_8_config()
+    elif ab_code == 60057:
+        exp_config = pool_recall.get_flow_exp_6_config()
+    #print("exp_config:", exp_config)
+
     if app_type in [config_.APP_TYPE['LAO_HAO_KAN_VIDEO'], config_.APP_TYPE['ZUI_JING_QI']]:
-        t = [gevent.spawn(pool_recall.rov_pool_recall_with_region, size, expire_time)]
+        t = [gevent.spawn(pool_recall.rov_pool_recall_with_region, size, expire_time, ab_code, exp_config)]
         if ab_code ==60054:
             t.append(gevent.spawn(pool_recall.get_sim_hot_item_reall_filter))
         if ab_code == 60055:
@@ -423,7 +438,7 @@ def video_old_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type
         if ab_code == 60056:
             t.append(gevent.spawn(pool_recall.get_hot_item_reall))
     else:
-        t = [gevent.spawn(pool_recall.rov_pool_recall_with_region, size, expire_time),
+        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),
              gevent.spawn(pool_recall.flow_pool_recall, size)]
         if  ab_code == 60054:
@@ -564,10 +579,12 @@ def video_old_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type
             }
     #if ab_code=="ab_new_test":
     #print("before data:", data)
-    rank_result = video_new_rank2(data=data, size=size, top_K=top_K, flow_pool_P=float(flow_pool_P), ab_code=ab_code)
+    rank_result, flow_num  = video_new_rank2(data=data, size=size, top_K=top_K, flow_pool_P=float(flow_pool_P), ab_code=ab_code, exp_config=exp_config)
     #print(rank_result)
-
+    if rank_result:
+        result['rank_num'] = len(rank_result)
     result['rankResult'] = rank_result
+    result['flow_num'] = flow_num
     result['rankTime'] = (time.time() - start_rank) * 1000
 
 

+ 122 - 50
video_rank.py

@@ -592,7 +592,7 @@ def video_rank_with_old_video(rank_result, old_video_recall, size, top_K, old_vi
     return new_rank_result[:size]
 
 
-def video_new_rank2(data, size, top_K, flow_pool_P, ab_code):
+def video_new_rank2(data, size, top_K, flow_pool_P, ab_code, exp_config=None):
     """
         视频分发排序
         :param data: 各路召回的视频 type-dict {'rov_pool_recall': [], 'flow_pool_recall': []}
@@ -602,7 +602,7 @@ def video_new_rank2(data, size, top_K, flow_pool_P, ab_code):
         :return: rank_result
         """
     if not data['rov_pool_recall'] and not data['flow_pool_recall']:
-        return []
+        return [], 0
 
     redisObj = RedisHelper()
     vidKeys = []
@@ -654,27 +654,61 @@ def video_new_rank2(data, size, top_K, flow_pool_P, ab_code):
         rank_result.extend(flow_recall_rank[:top_K])
         flow_recall_rank = flow_recall_rank[top_K:]
         # 按概率 p 及score排序获取 size - k 个视频
-    i = 0
-    while i < size - top_K:
-        # 随机生成[0, 1)浮点数
-        rand = random.random()
-        # log_.info('rand: {}'.format(rand))
-        if rand < flow_pool_P:
-            if flow_recall_rank:
-                rank_result.append(flow_recall_rank[0])
-                flow_recall_rank.remove(flow_recall_rank[0])
-            else:
-                rank_result.extend(rov_recall_rank[:size - top_K - i])
-                return rank_result[:size]
+    flow_num = 0
+    flowConfig = 0
+    if exp_config and exp_config['flowConfig']:
+        flowConfig = exp_config['flowConfig']
+    if flowConfig == 1 and len(rov_recall_rank) > 0:
+        for recall_item in rank_result:
+            flow_recall_name = recall_item.get("flowPool", '')
+            flow_num = flow_num + 1
+        all_recall_rank = rov_recall_rank + flow_recall_rank
+        if flow_num > 0:
+            rank_result.extend(all_recall_rank[:size - top_K])
+            return rank_result, flow_num
         else:
-            if rov_recall_rank:
-                rank_result.append(rov_recall_rank[0])
-                rov_recall_rank.remove(rov_recall_rank[0])
+            i = 0
+            while i < size - top_K:
+                # 随机生成[0, 1)浮点数
+                rand = random.random()
+                # log_.info('rand: {}'.format(rand))
+                if rand < flow_pool_P:
+                    if flow_recall_rank:
+                        rank_result.append(flow_recall_rank[0])
+                        flow_recall_rank.remove(flow_recall_rank[0])
+                    else:
+                        rank_result.extend(rov_recall_rank[:size - top_K - i])
+                        return rank_result[:size], flow_num
+                else:
+                    if rov_recall_rank:
+                        rank_result.append(rov_recall_rank[0])
+                        rov_recall_rank.remove(rov_recall_rank[0])
+                    else:
+                        rank_result.extend(flow_recall_rank[:size - top_K - i])
+                        return rank_result[:size], flow_num
+                i += 1
+    else:
+        i = 0
+        while i < size - top_K:
+            # 随机生成[0, 1)浮点数
+            rand = random.random()
+            # log_.info('rand: {}'.format(rand))
+            if rand < flow_pool_P:
+                if flow_recall_rank:
+                    rank_result.append(flow_recall_rank[0])
+                    flow_recall_rank.remove(flow_recall_rank[0])
+                else:
+                    rank_result.extend(rov_recall_rank[:size - top_K - i])
+                    return rank_result[:size], flow_num
             else:
-                rank_result.extend(flow_recall_rank[:size - top_K - i])
-                return rank_result[:size]
-        i += 1
-    return rank_result[:size]
+                if rov_recall_rank:
+                    rank_result.append(rov_recall_rank[0])
+                    rov_recall_rank.remove(rov_recall_rank[0])
+                else:
+                    rank_result.extend(flow_recall_rank[:size - top_K - i])
+                    return rank_result[:size], flow_num
+            i += 1
+        return rank_result[:size], flow_num
 
 def video_sanke_rank(data, size, top_K, flow_pool_P, ab_Code='', exp_config=None):
     """
@@ -686,8 +720,10 @@ def video_sanke_rank(data, size, top_K, flow_pool_P, ab_Code='', exp_config=None
     :return: rank_result
     """
     if not data['rov_pool_recall'] and not data['flow_pool_recall'] \
-            and not data['hot_rcall'] and not data['hot_rcall']:
-        return []
+            and not data['u2i_recall'] and not data['u2i_recall'] \
+            and not data['w2v_recall'] and not data['w2v_recall'] \
+            and not data['sim_recall'] and not data['sim_recall']:
+        return [], 0
     # 地域分组小时级规则更新数据
     recall_dict = {}
     region_h_recall = [item for item in data['rov_pool_recall']
@@ -714,9 +750,9 @@ def video_sanke_rank(data, size, top_K, flow_pool_P, ab_Code='', exp_config=None
     w2v_recall =[]
     sim_recall = []
     if ab_Code==60058:
-        if len(data['hot_recall'])>0:
-            hot_recall = sorted(data['hot_recall'], key=lambda k: k.get('rovScore', 0), reverse=True)
-        recall_dict['hot_recall'] = hot_recall
+        if len(data['u2i_recall'])>0:
+            hot_recall = sorted(data['u2i_recall'], key=lambda k: k.get('rovScore', 0), reverse=True)
+        recall_dict['u2i_recall'] = hot_recall
     elif ab_Code==60059:
         if len(data['w2v_recall'])>0:
             recall_dict['w2v_recall'] = data['w2v_recall']
@@ -729,9 +765,9 @@ def video_sanke_rank(data, size, top_K, flow_pool_P, ab_Code='', exp_config=None
             recall_dict['sim_recall'] = sim_recall
 
     recall_list = [('rov_recall_region_h',1, 1),('rov_recall_region_h',0.5, 1),('rov_recall_region_24h',1,1),
-                   ('hot_recall',0.5,1), ('w2v_recall',0.5,1),('rov_recall_24h',1,1), ('rov_recall_24h_dup',0.5,1)]
-    if exp_config is not  None:
-        recall_list = exp_config
+                   ('u2i_recall',0.5,1), ('w2v_recall',0.5,1),('rov_recall_24h',1,1), ('rov_recall_24h_dup',0.5,1)]
+    if exp_config  and exp_config['recall_list']:
+        recall_list = exp_config['recall_list']
     #print("recall_config:", recall_list)
     rov_recall_rank = []
     select_ids = set('')
@@ -779,29 +815,65 @@ def video_sanke_rank(data, size, top_K, flow_pool_P, ab_Code='', exp_config=None
     else:
         rank_result.extend(flow_recall_rank[:top_K])
         flow_recall_rank = flow_recall_rank[top_K:]
-
-    # 按概率 p 及score排序获取 size - k 个视频
-    i = 0
-    while i < size - top_K:
-        # 随机生成[0, 1)浮点数
-        rand = random.random()
-        # log_.info('rand: {}'.format(rand))
-        if rand < flow_pool_P:
-            if flow_recall_rank:
-                rank_result.append(flow_recall_rank[0])
-                flow_recall_rank.remove(flow_recall_rank[0])
+    flow_num = 0
+    flowConfig =0
+    if exp_config and exp_config['flowConfig']:
+        flowConfig = exp_config['flowConfig']
+    if flowConfig == 1 and len(rov_recall_rank) > 0:
+        rank_result.extend(rov_recall_rank[:top_K])
+        for recall_item in rank_result:
+            flow_recall_name = recall_item.get("flowPool", '')
+            if flow_recall_name is not None and flow_recall_name.find("#") > -1:
+                flow_num = flow_num + 1
+            all_recall_rank = rov_recall_rank + flow_recall_rank
+            if flow_num > 0:
+                rank_result.extend(all_recall_rank[:size - top_K])
+                return rank_result[:size], flow_num
             else:
-                rank_result.extend(rov_recall_rank[:size - top_K - i])
-                return rank_result[:size]
-        else:
-            if rov_recall_rank:
-                rank_result.append(rov_recall_rank[0])
-                rov_recall_rank.remove(rov_recall_rank[0])
+                # 按概率 p 及score排序获取 size - k 个视频
+                i = 0
+                while i < size - top_K:
+                    # 随机生成[0, 1)浮点数
+                    rand = random.random()
+                    # log_.info('rand: {}'.format(rand))
+                    if rand < flow_pool_P:
+                        if flow_recall_rank:
+                            rank_result.append(flow_recall_rank[0])
+                            flow_recall_rank.remove(flow_recall_rank[0])
+                        else:
+                            rank_result.extend(rov_recall_rank[:size - top_K - i])
+                            return rank_result[:size], flow_num
+                    else:
+                        if rov_recall_rank:
+                            rank_result.append(rov_recall_rank[0])
+                            rov_recall_rank.remove(rov_recall_rank[0])
+                        else:
+                            rank_result.extend(flow_recall_rank[:size - top_K - i])
+                            return rank_result[:size], flow_num
+                    i += 1
+    else:
+        # 按概率 p 及score排序获取 size - k 个视频
+        i = 0
+        while i < size - top_K:
+            # 随机生成[0, 1)浮点数
+            rand = random.random()
+            # log_.info('rand: {}'.format(rand))
+            if rand < flow_pool_P:
+                if flow_recall_rank:
+                    rank_result.append(flow_recall_rank[0])
+                    flow_recall_rank.remove(flow_recall_rank[0])
+                else:
+                    rank_result.extend(rov_recall_rank[:size - top_K - i])
+                    return rank_result[:size], flow_num
             else:
-                rank_result.extend(flow_recall_rank[:size - top_K - i])
-                return rank_result[:size]
-        i += 1
-    return rank_result[:size]
+                if rov_recall_rank:
+                    rank_result.append(rov_recall_rank[0])
+                    rov_recall_rank.remove(rov_recall_rank[0])
+                else:
+                    rank_result.extend(flow_recall_rank[:size - top_K - i])
+                    return rank_result[:size],flow_num
+            i += 1
+    return rank_result[:size], flow_num
 
 
 

+ 140 - 10
video_recall.py

@@ -1210,7 +1210,7 @@ class PoolRecall(object):
             idx = 0
         return key_name, last_region_dup_key, idx
 
-    def rov_pool_recall_with_region_process(self, size=4, expire_time=24*3600):
+    def rov_pool_recall_with_region_process(self, size=4, expire_time=24*3600, ab_code=None, exp_config=None):
         """
         地域分组召回视频
         :param size: 获取视频个数
@@ -1274,13 +1274,24 @@ class PoolRecall(object):
         # 将已获取到的视频按顺序去重合并
         now_video_ids = []
         recall_result = []
+        recall_num = size
+        if ab_code and exp_config:
+            if ab_code==60058 or ab_code==60059 or ab_code == 60060 \
+                    or ab_code == 60061 or ab_code==60052 \
+                    or ab_code==60053 or ab_code==60057 :
+                try:
+                    recall_num = int(exp_config['recall_num'])
+                except:
+                    recall_num = size
+        if recall_num<size:
+            recall_num = size
         for region_result in region_recall_result_list:
             for video in region_result:
                 video_id = video.get('videoId')
                 if video_id not in now_video_ids:
                     recall_result.append(video)
                     now_video_ids.append(video_id)
-                    if len(recall_result) >= size:
+                    if len(recall_result) >= recall_num:
                         break
                     else:
                         continue
@@ -1308,12 +1319,14 @@ class PoolRecall(object):
         #     'operation': 'rov_pool_recall_with_region',
         #     'executeTime': (time.time() - start_time) * 1000
         # })
-        return recall_result[:size]
+        #print("recall_num:", recall_num)
+        #print("recall_result:", recall_result[:recall_num])
+        return recall_result[:recall_num]
 
-    def rov_pool_recall_with_region(self, size=4, expire_time=24*3600):
+    def rov_pool_recall_with_region(self, size=4, expire_time=24*3600, ab_code=None, exp_config=None):
         """召回池召回视频"""
         # 获取召回池中视频
-        videos = self.rov_pool_recall_with_region_process(size=size, expire_time=expire_time)
+        videos = self.rov_pool_recall_with_region_process(size=size, expire_time=expire_time, ab_code=ab_code, exp_config=exp_config)
         # 对在流量池中存在的视频添加标记字段
         result = []
         for item in videos:
@@ -2524,7 +2537,7 @@ class PoolRecall(object):
 
 
     def get_test_config(self):
-        recall_key = "test_config"
+        recall_key = "test_exp_config"
         # print("recall_key:", recall_key)
         data = self.redis_helper.get_data_from_redis(key_name=recall_key)
         if data is not None:
@@ -2539,7 +2552,7 @@ class PoolRecall(object):
             return None
 
     def get_w2v_config(self):
-        recall_key = "w2v_config"
+        recall_key = "w2v_exp_config"
         data = self.redis_helper.get_data_from_redis(key_name=recall_key)
         if data is not None:
             try:
@@ -2553,7 +2566,21 @@ class PoolRecall(object):
             return None
 
     def get_hotrecall_config(self):
-        recall_key = "ht_config"
+        recall_key = "ht_exp_config"
+        data = self.redis_helper.get_data_from_redis(key_name=recall_key)
+        if data is not None:
+            try:
+                # print(data)
+                json_result = json.loads(data)
+                # print(json_result)
+                return json_result
+            except Exception as e:
+                return None
+        else:
+            return None
+
+    def get_U2I_config(self):
+        recall_key = "u2i_exp_config"
         data = self.redis_helper.get_data_from_redis(key_name=recall_key)
         if data is not None:
             try:
@@ -2567,7 +2594,55 @@ class PoolRecall(object):
             return None
 
     def get_simrecall_config(self):
-        recall_key = "simrecall_config"
+        recall_key = "simrecall_exp_config"
+        data = self.redis_helper.get_data_from_redis(key_name=recall_key)
+        if data is not None:
+            try:
+                # print(data)
+                json_result = json.loads(data)
+                # print(json_result)
+                return json_result
+            except Exception as e:
+                return None
+        else:
+            return None
+
+    def get_hotrecall_flow_config(self):
+        recall_key = "ht_flow_config:"
+        data = self.redis_helper.get_data_from_redis(key_name=recall_key)
+        return data
+
+    def get_w2v_flow_config(self):
+        recall_key = "w2v_flow_config:"
+        data = self.redis_helper.get_data_from_redis(key_name=recall_key)
+        return data
+
+    def get_flow_config(self):
+        recall_key = "flow_config:"
+        data = self.redis_helper.get_data_from_redis(key_name=recall_key)
+        return data
+
+    def get_simrecall_flow_config(self):
+        recall_key = "simrecall_flow_config:"
+        data = self.redis_helper.get_data_from_redis(key_name=recall_key)
+        return data
+
+    def get_flow_exp_7_config(self):
+        recall_key = "exp7_exp_config"
+        data = self.redis_helper.get_data_from_redis(key_name=recall_key)
+        if data is not None:
+            try:
+                # print(data)
+                json_result = json.loads(data)
+                # print(json_result)
+                return json_result
+            except Exception as e:
+                return None
+        else:
+            return None
+
+    def get_flow_exp_8_config(self):
+        recall_key = "exp8_exp_config"
         data = self.redis_helper.get_data_from_redis(key_name=recall_key)
         if data is not None:
             try:
@@ -2578,4 +2653,59 @@ class PoolRecall(object):
             except Exception as e:
                 return None
         else:
-            return None
+            return None
+
+    def get_flow_exp_6_config(self):
+        recall_key = "exp6_exp_config"
+        data = self.redis_helper.get_data_from_redis(key_name=recall_key)
+        if data is not None:
+            try:
+                # print(data)
+                json_result = json.loads(data)
+                # print(json_result)
+                return json_result
+            except Exception as e:
+                return None
+        else:
+            return None
+
+
+    def get_U2I_reall(self, mid):
+        #recall_key = "hot_video:"
+        if not mid:
+            return  []
+        recall_key = "u2i:"+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:
+            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': float(per_item[1]), 'pushFrom': config_.PUSH_FROM['u2i_tag_recall'],
+                         'abCode': self.ab_code}
+                except Exception as e:
+                    continue
+        if len(video_ids)<=0:
+            return  recall_result
+        video_ids = video_ids[:50]
+        #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(pool_type='rov')
+        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