|
@@ -676,6 +676,123 @@ def video_new_rank2(data, size, top_K, flow_pool_P, ab_code):
|
|
|
i += 1
|
|
|
return rank_result[:size]
|
|
|
|
|
|
+def video_sanke_rank(data, size, top_K, flow_pool_P, ab_Code=''):
|
|
|
+ """
|
|
|
+ 视频分发排序
|
|
|
+ :param data: 各路召回的视频 type-dict {'rov_pool_recall': [], 'flow_pool_recall': []}
|
|
|
+ :param size: 请求数
|
|
|
+ :param top_K: 保证topK为召回池视频 type-int
|
|
|
+ :param flow_pool_P: size-top_K视频为流量池视频的概率 type-float
|
|
|
+ :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 []
|
|
|
+
|
|
|
+ recall_dict = {}
|
|
|
+ region_h_recall = [item for item in data['rov_pool_recall']
|
|
|
+ if item.get('pushFrom') == config_.PUSH_FROM['rov_recall_region_h']]
|
|
|
+ region_h_recall_rank = sorted(region_h_recall, key=lambda k: k.get('rovScore', 0), reverse=True)
|
|
|
+ recall_dict['rov_recall_region_h'] = region_h_recall_rank
|
|
|
+
|
|
|
+ region_24h_recall = [item for item in data['rov_pool_recall']
|
|
|
+ if item.get('pushFrom') == config_.PUSH_FROM['rov_recall_region_24h']]
|
|
|
+ region_24h_recall_rank = sorted(region_24h_recall, key=lambda k: k.get('rovScore', 0), reverse=True)
|
|
|
+ recall_dict['rov_recall_region_24h'] = region_24h_recall_rank
|
|
|
+
|
|
|
+
|
|
|
+ rule_24h_recall = [item for item in data['rov_pool_recall']
|
|
|
+ if item.get('pushFrom') == config_.PUSH_FROM['rov_recall_24h']]
|
|
|
+ rule_24h_recall_rank = sorted(rule_24h_recall, key=lambda k: k.get('rovScore', 0), reverse=True)
|
|
|
+ recall_dict['rov_recall_24h'] = rule_24h_recall_rank
|
|
|
+
|
|
|
+ rule_24h_dup_recall = [item for item in data['rov_pool_recall']
|
|
|
+ if item.get('pushFrom') == config_.PUSH_FROM['rov_recall_24h_dup']]
|
|
|
+ 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
|
|
|
+ hot_recall = []
|
|
|
+ w2v_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
|
|
|
+ elif ab_Code=='60059':
|
|
|
+ if len(data['w2v_recall']>0):
|
|
|
+ w2v_recall = sorted(data['w2v_recall'], key=lambda k: k.get('rovScore', 0), reverse=True)
|
|
|
+ recall_dict['w2v_recall'] = w2v_recall
|
|
|
+
|
|
|
+ recall_list = [('rov_recall_region_h',1, 1),('hot_recall',0.5,1), ('w2v_recall',0.5,1),
|
|
|
+ ('rov_recall_region_h',0.5, 1),('rov_recall_region_24h',1,1),
|
|
|
+ ('rov_recall_24h',1,1), ('rov_recall_24h_dup',0.5,1)]
|
|
|
+ rov_recall_rank = []
|
|
|
+ select_ids = set('')
|
|
|
+ for i in range(3):
|
|
|
+ if len(rov_recall_rank)>8:
|
|
|
+ break
|
|
|
+ for per_recall_item in recall_list:
|
|
|
+ per_recall_name = per_recall_item[0]
|
|
|
+ per_recall_freq = per_recall_item[1]
|
|
|
+ per_limt_num = per_recall_item[2]
|
|
|
+ rand_num = random.random()
|
|
|
+ if rand_num<per_recall_freq and per_recall_name in recall_dict:
|
|
|
+ per_recall = recall_dict[per_recall_name]
|
|
|
+ cur_recall_num = 0
|
|
|
+ for recall_item in per_recall:
|
|
|
+ vid = recall_item['videoId']
|
|
|
+ if vid in select_ids:
|
|
|
+ continue
|
|
|
+ rov_recall_rank.append(recall_item)
|
|
|
+ select_ids.add(vid)
|
|
|
+ cur_recall_num+=1
|
|
|
+ if cur_recall_num>=per_limt_num:
|
|
|
+ break
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ flow_recall_rank = sorted(data['flow_pool_recall'], key=lambda k: k.get('rovScore', 0), reverse=True)
|
|
|
+
|
|
|
+ rov_recall_rank, flow_recall_rank = remove_duplicate(rov_recall=rov_recall_rank, flow_recall=flow_recall_rank,
|
|
|
+ top_K=top_K)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ rank_result = []
|
|
|
+
|
|
|
+
|
|
|
+ if len(rov_recall_rank) > 0:
|
|
|
+ rank_result.extend(rov_recall_rank[:top_K])
|
|
|
+ rov_recall_rank = rov_recall_rank[top_K:]
|
|
|
+ else:
|
|
|
+ rank_result.extend(flow_recall_rank[:top_K])
|
|
|
+ flow_recall_rank = flow_recall_rank[top_K:]
|
|
|
+
|
|
|
+
|
|
|
+ i = 0
|
|
|
+ while i < size - top_K:
|
|
|
+
|
|
|
+ rand = random.random()
|
|
|
+
|
|
|
+ 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]
|
|
|
+ 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]
|
|
|
+ i += 1
|
|
|
+ return rank_result[:size]
|
|
|
+
|
|
|
+
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
d_test = [{'videoId': 10028734, 'rovScore': 99.977, 'pushFrom': 'recall_pool', 'abCode': 10000},
|