|  | @@ -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
 | 
	
		
			
				|  |  | +    # 地域分组小时级更新24h规则更新数据
 | 
	
		
			
				|  |  | +    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
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # 相对24h规则更新数据
 | 
	
		
			
				|  |  | +    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
 | 
	
		
			
				|  |  | +    # 相对24h规则筛选后剩余更新数据
 | 
	
		
			
				|  |  | +    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
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    #rov_recall_rank = region_h_recall_rank + region_24h_recall_rank + \
 | 
	
		
			
				|  |  | +    #                  rule_24h_recall_rank + rule_24h_dup_recall_rank
 | 
	
		
			
				|  |  | +    # 流量池
 | 
	
		
			
				|  |  | +    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)
 | 
	
		
			
				|  |  | +    # log_.info('remove_duplicate finished! rov_recall_rank = {}, flow_recall_rank = {}'.format(
 | 
	
		
			
				|  |  | +    #     rov_recall_rank, flow_recall_rank))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # rank_result = relevant_recall_rank
 | 
	
		
			
				|  |  | +    rank_result = []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # 从ROV召回池中获取top k
 | 
	
		
			
				|  |  | +    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:]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # 按概率 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]
 | 
	
		
			
				|  |  | +        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},
 |