""" @author: luojunhui """ from applications.match_alg.recall import recall_videos from applications.log import logging def jac_score(d1, d2): """ 通过交并集来判断 :param d1: :param d2: :return: """ f1_keys = set(d1["key_words"]) f2_keys = set(d2["key_words"]) keys_union = f1_keys | f2_keys keys_intersection = f1_keys & f2_keys f1_search_keys = set(d1["search_keys"]) f2_search_keys = set(d2["search_keys"]) search_keys_union = f1_search_keys | f2_search_keys search_keys_intersection = f1_search_keys & f2_search_keys f1_extra_keys = set(d1["extra_keys"]) f2_extra_keys = set(d2["extra_keys"]) extra_keys_union = f1_extra_keys | f2_extra_keys extra_keys_intersection = f1_extra_keys & f2_extra_keys score_1 = len(keys_intersection) / len(keys_union) score_2 = len(search_keys_intersection) / len(search_keys_union) score_3 = len(extra_keys_intersection) / len(extra_keys_union) return score_1 * 0.4 + score_2 * 0.4 + score_3 * 0.2, d2['video_id'] async def best_choice(params_obj, trace_id, search_videos): """ 计算,返回出最合适的 video_id :return: video_id """ pq_list, search_list = await recall_videos(trace_id=trace_id, s_videos=search_videos) def best_video_id(target_list): """ :param target_list: :return: """ score_list = [] for video_obj in target_list: try: score, video_id = jac_score(d1=params_obj, d2=video_obj) score_list.append((video_id, score)) except Exception as e: print(e) sorted_list = sorted(score_list, key=lambda x: x[1], reverse=True) return sorted_list[0] if sorted_list else (0, 0) if search_list: logging( code="1003", info="Return Best Search Video", data=search_list, trace_id=trace_id ) return search_list[0] # return best_video_id(search_list)[0] # best_search_tuple = best_video_id(search_list) # if best_search_tuple[1] > 0: # logging( # code="1003", # info="search_score---{}".format(best_search_tuple[1]), # trace_id=trace_id # ) # return best_search_tuple[0] # else: # best_pq_tuple = best_video_id(pq_list) # if best_pq_tuple[1] > 0: # logging( # code="1003", # info="pq_score---{}".format(best_pq_tuple[1]), # trace_id=trace_id # ) # return best_pq_tuple[0] # else: # return None else: best_pq_tuple = best_video_id(pq_list) if best_pq_tuple[1] > 0: logging( code="1003", info="pq_score---{}".format(best_pq_tuple[1]), trace_id=trace_id ) return best_pq_tuple[0] else: return None