推荐系统实战5:用户倒排索引表的构建

本章涉及系统运行的流程,还是通过Offline和Online两个部分进行分析。

1. Offline

该部分的逻辑是对前面处理存储的物料和用户画像进行离线计算,为每个用户提供一个热门页列表和推荐页列表进行缓存,供online服务获取使用。下文从三个部分进行记录:两个列表的生成和缓存到redis的流程。

1.1 热门页列表生成

所谓热门页, 就是对于每篇文章,会根据它的发布时间,用户对它的行为记录(获得的点赞数,收藏数和阅读数)去计算该文章的热度信息, 然后根据热度值进行排序得到。此处使用的是魔方秀热度公式:

news_hot_value = (news_likes_num * 0.6 + news_collections_num * 0.3 + news_read_num * 0.1) * 10 / (1 + time_hour_diff / 72)

对于每篇文章,根据其点赞数,收藏数和阅读数以及相距时间的间隔计算其热度值,排序后,以zset的形式缓存到redis中,作为每个用户热门列表的初始化状态。(每天)

P.S. 这里在给用户曝光时,会过滤掉用户曝光过的内容,即后续每个用户会有单独的热门页列表。

1.2 推荐页列表

对于每个用户,会根据物料画像和用户画像生成不同的推荐页面。这里对于新用户会启用冷启动处理模式,因此分为两块逻辑:冷启动逻辑和个性化推荐逻辑:

1.2.1 冷启动

冷启动针对新用户,只能根据粗浅的注册信息来获取大类别下的文章,再根据热度信息生成一份冷启动推荐列表。这里分为了四类人群:

if int(user_info.age) < 23 and user_info.gender == "female":
                redis_key = "cold_start_group:{}".format(str(1))
                self.copy_redis_sorted_set(user_info.userid, redis_key)
            elif int(user_info.age) >= 23 and user_info.gender == "female":
                redis_key = "cold_start_group:{}".format(str(2))
                self.copy_redis_sorted_set(user_info.userid, redis_key)
            elif int(user_info.age) < 23 and user_info.gender == "male":
                redis_key = "cold_start_group:{}".format(str(3))
                self.copy_redis_sorted_set(user_info.userid, redis_key)
            elif int(user_info.age) >= 23 and user_info.gender == "male":
                redis_key = "cold_start_group:{}".format(str(4))
                self.copy_redis_sorted_set(user_info.userid, redis_key)

1.2.2 个性化

召回→排序→重排→个性化列表生成

召回的目的是根据用户部分特征,从海量物品库,快速找到小部分用户潜在感兴趣的物品交给精排,重点强调快,精排主要是融入更多特征,使用复杂模型,来做个性化推荐,强调准。 而重排侧,主要是结合精排的结果,再加上各种业务策略,比如去重,插入,打散,多样性保证等,主要是技术产品策略主导或改善用户体验的。这就组成了个性化推荐系统的整个架构。

最终这些列表都会存储到Redis中供online系统使用。

2. Online

Online是为用户在使用APP或者系统的过程中触发的行为提供一系列服务,当用户刚进入系统的时候, 会进入新闻的推荐页面,此时系统会为该用户获取推荐页文章并进行展示,当用户进入热门页, 系统就会为该用户获取热门页列表并进行展示。

2.1 获取推荐页列表

如果前端出现点击推荐页的action(包括下拉),则触发该服务,新用户从冷启动列表中读取推荐列表,同时去除已曝光文章,这就需要建立一个新的曝光列表,并实时更新。

如果是老用户,就从个性化推荐列表中读取,同时也需要去除曝光。

2.2 获取热门页列表

同样,前端出现点击热门页的action或进行下拉刷新时,触发该服务。新用户同样要从冷启动模板中生成热门页列表去曝光后生成最终列表,并更新曝光列表。

如果是老用户,从offline存储好的热门列表中直接读取,去除曝光后生成列表。

        # 一页默认10个item, 但这里候选20条,因为有可能有的在推荐页曝光过
        article_num = 200

P.S.这里虽然已经做了处理,但依然有可能出现去除曝光后不足十条的情况。

(具体内部函数未完待续)

你可能感兴趣的:(redis,数据库,java,推荐系统)