def update_a_u_map(reaction_list, a_u_map, insert_rate=0.001): """ 根据一段时间的交互记录,更新文章tag到用户tag之间的映射权重值 :param reaction_list: :param a_u_map: :param insert_rate: :return: """ for reaction in reaction_list: # process article tags reaction_a_id = reaction.reaction_a_id article = DAO_utils.get_article_by_id(reaction_a_id) article_tags = article.atags # get user tags reaction_user_id = reaction.reaction_user_id user = DAO_utils.get_user_by_id(reaction_user_id) utag_vec = user.user_tag_score_vec reaction_type = reaction.reaction_type reaction_date = reaction.reaction_date for atag_key in article_tags: # 采用稀释的方式改变映射权值 atag_value = article_tags[atag_key] # 文章本身的tag权值,用于衡量该篇文章的属性,0~1之间的值。 # 首先稀释原有的权值 a_u_inst = a_u_map[atag_key] for ukey in a_u_inst: a_u_inst[ukey] *= (1 - insert_rate) # 然后insert用户的tags for utag_key in utag_vec: if utag_key in a_u_inst: a_u_inst[utag_key] += utag_vec[utag_key] * insert_rate * atag_value else: a_u_inst[utag_key] = utag_vec[utag_key] * insert_rate * atag_value return a_u_map