推荐召回--基于内容的召回:Content Based
- 1. 前言
- 2. 构建画像
- 3. 内容召回的算法
1. 前言
在之前总结过协同过滤的召回通路后,今天我们来总结下召回策略中的重头戏:基于内容的召回通路,也即我们常说的基于标签的召回。这里就要涉及两个一直很流行的词汇:用户画像User Profile和物品画像Item Profile。
说回推荐系统,它的使命就是,要在用户(User)和物品(Item)之间建立连接。那么用户画像和物品画像是否是推荐系统的“银弹”呢?答案肯定不是,但也不能说用户画像一无是处。
用户画像只是推荐系统构建过程中的一个副产品,而不是推荐系统的目的。归根结底,用户画像是给机器看的,而不是给用户看的,所以越酷炫的用户画像越没什么用。在使用机器学习、深度学习时,用户画像的维度、数量、量化等,这些往往是不可解释的。所以,不要把用户画像看的那么重要,但是,实际工作中,推荐系统的召回侧,标签化的内容召回,效果往往会比其他策略要好很多,而标签化的迭代往往是一个长期持久的过程。
为何一定要做好内容的推荐呢?这是因为,通常一个推荐系统往往从基于内容开始成长。推荐最开始的时候,内容数据很好获得,不需要有用户数据就可以做出推荐系统。内容数据是基础,只要深入挖掘,就可以挖掘出一些很有用的信息给推荐系统用。
然后,当最初的推荐结果反馈给用户后,用户的行为数据可以作为协同过滤等其他召回通路的数据输入源。
那么,今天我们就来聊聊基于内容的推荐召回。
2. 构建画像
现在我们来一起聊聊如何构建画像,拿用户画像来说,有两个关键因素:维度、量化。对于维度来说,比如性别、年龄、价格等,我们在处理数据时,要铭记一点,这些数据是让机器去学习的,不一定让人类能够理解,后续我会总结在模型构建时,相关数据格式的处理。
说说量化,在实际的生产系统中,画像每个维度的量化,应该交给机器,而且以目标为导向,以结果来反向优化才有意义。
那么如何构建画像呢?常见的有三种方法:
- 查户口:直接使用最原始的数据作为画像的内容,如:性别、年龄、区域、兴趣爱好等等,在经过数据清洗挖掘阶段后,这些数据往往在冷启动等场景下有很好的作用。
- 堆数据:堆积历史数据,也就是在用户有一定行为后,对历史数据进行挖掘,构建标签系统,然后基于这些标签,进行各种维度的统计,这些统计结果就可以作为量化指标。
- 黑盒子:这个呢,就是使用机器学习、深度学习等方法,学习出人类无法理解的user_embedding,在推荐的中后期迭代中,承担非常大的作用。
那该如何把内容推荐做好呢?从技术层面上来说,需要做好:抓、洗、挖、算,这四门功课。
抓:爬虫,很多公司都会有爬虫组,在公司的数据基础上,获取更多互联网的数据来补充自己的内容源,增加分析的维度
洗:清洗,抓取过来的数据,必须洗洗才会更健康,冗余、黄赌毒等敏感及黑名单数据需要清洗
挖:挖掘,不管是自己的数据还是抓取过来的的数据,在清洗之后,需要深入挖掘,统计各维度的结果
算:计算,匹配用户和物品的属性,然后计算出更合理的推荐结果
整体上的流程,是这样的:基于现有的数据源,对内容进行分析,得到结构化的内容库和内容模型,然后根据标签给用户推荐结果,在用户使用产品后,对行为数据进行分析,构建用户的标签。而同时对于那些没有历史行为的用户,可以根据最初的标签,直接拿标签去推荐,所以基于内容的推荐,也常常作用于冷启动过程。
3. 内容召回的算法
说完流程,我们来谈谈基于内容召回,经常使用的一些算法。
从最初的数据源开始,对于文本数据,经常的做法就是:
- 把非结构化的文本结构化
- 根据用户行为数据,把物品的结构化结果传给用户,与用户结构化信息合并
对于文本结构化的处理上来说,一般使用比较多的就是NLP相关算法:
- TF-IDF:目前我经常用的就是,可以提取出item的关键词词频,然后建立关键词和item的倒排表。
- Kmeans:可以对用户、物品分别聚类,根据聚类进行针对性推荐
- Word2vec:计算词向量,扩充结构化标签;累加得到一个文本的稠密向量;聚类,得到更好的聚类效果
- 其他:LDA主题识别,TextRank算法,UGC内容分类,卡方检验CHI和信息增益IG
在具体的实践中,我目前的做法是:
- 针对item,利用TF-IDF,计算出每个item的关键词,然后在ES中构建关键词-item的倒排表,如:剑南春:[item1:0.9, item2:0.7, item100:0.5...]
- 截取近30天内用户的行为数据,统计出用户每个关键词的比例,如:剑南春-0.5,茅台0.2,五粮液0-0.2,泸州老窖-0.1,这个过程用hive、spark都可以统计出来
- 假如内容召回100个,那么拿着关键词去es中,提取每个关键词对应的item数量,如:剑南春-50个,茅台-20个,五粮液-20个,泸州老窖-10个
通过这样的方法,就完成了基于内容的召回,真的不难。就是给每个item打标签,然后统计用户的标签比例,然后根据召回的个数,对应的去数据库里拿item就结束了。
当然,在打标签的时候,根据内容的特点,去针对性的选择算法,筛选完后,再选择es或redis等查询快速的数据库存储即可。
而在实际工作中,标签打的越多,对用户的喜好也就越准确,但是,耗费的精力也就越多。召回阶段是推荐系统的一部分,没必要在某一个节点做的太过细致,就目前业界的趋势来说,更多的是用机器学习,深度学习等算法,去提升生产力,所以适度的标签化即可,也就是前面提到的,用户画像不是推荐系统的目的,而是附带的产品。
好了,关于基于内容的召回,就总结到这里,还是那句话,思路最重要,具体使用什么算法,使用什么工具,需要根据数据的特点来选择。学习就应该从全局到局部,由上至下的思想,才会把知识体系构建出来。
后续我会针对算法进行详细的总结,拜了个拜~