1. 前言

在之前总结过协同过滤的召回通路后,今天我们来总结下召回策略中的重头戏:基于内容的召回通路,也即我们常说的基于标签的召回。这里就要涉及两个一直很流行的词汇:用户画像User Profile和物品画像Item Profile。

说回推荐系统,它的使命就是,要在用户(User)和物品(Item)之间建立连接。那么用户画像和物品画像是否是推荐系统的“银弹”呢?答案肯定不是,但也不能说用户画像一无是处。

用户画像只是推荐系统构建过程中的一个副产品,而不是推荐系统的目的。归根结底,用户画像是给机器看的,而不是给用户看的,所以越酷炫的用户画像越没什么用。在使用机器学习、深度学习时,用户画像的维度、数量、量化等,这些往往是不可解释的。所以,不要把用户画像看的那么重要,但是,实际工作中,推荐系统的召回侧,标签化的内容召回,效果往往会比其他策略要好很多,而标签化的迭代往往是一个长期持久的过程。

为何一定要做好内容的推荐呢?这是因为,通常一个推荐系统往往从基于内容开始成长。推荐最开始的时候,内容数据很好获得,不需要有用户数据就可以做出推荐系统。内容数据是基础,只要深入挖掘,就可以挖掘出一些很有用的信息给推荐系统用。

然后,当最初的推荐结果反馈给用户后,用户的行为数据可以作为协同过滤等其他召回通路的数据输入源。

那么,今天我们就来聊聊基于内容的推荐召回。

2. 构建画像

现在我们来一起聊聊如何构建画像,拿用户画像来说,有两个关键因素:维度量化。对于维度来说,比如性别、年龄、价格等,我们在处理数据时,要铭记一点,这些数据是让机器去学习的,不一定让人类能够理解,后续我会总结在模型构建时,相关数据格式的处理。

说说量化,在实际的生产系统中,画像每个维度的量化,应该交给机器,而且以目标为导向,以结果来反向优化才有意义。

那么如何构建画像呢?常见的有三种方法:

  1. 查户口:直接使用最原始的数据作为画像的内容,如:性别、年龄、区域、兴趣爱好等等,在经过数据清洗挖掘阶段后,这些数据往往在冷启动等场景下有很好的作用。
  2. 堆数据:堆积历史数据,也就是在用户有一定行为后,对历史数据进行挖掘,构建标签系统,然后基于这些标签,进行各种维度的统计,这些统计结果就可以作为量化指标。
  3. 黑盒子:这个呢,就是使用机器学习、深度学习等方法,学习出人类无法理解的user_embedding,在推荐的中后期迭代中,承担非常大的作用。

那该如何把内容推荐做好呢?从技术层面上来说,需要做好:抓、洗、挖、算,这四门功课。

抓:爬虫,很多公司都会有爬虫组,在公司的数据基础上,获取更多互联网的数据来补充自己的内容源,增加分析的维度

洗:清洗,抓取过来的数据,必须洗洗才会更健康,冗余、黄赌毒等敏感及黑名单数据需要清洗

挖:挖掘,不管是自己的数据还是抓取过来的的数据,在清洗之后,需要深入挖掘,统计各维度的结果

算:计算,匹配用户和物品的属性,然后计算出更合理的推荐结果

整体上的流程,是这样的:基于现有的数据源,对内容进行分析,得到结构化的内容库和内容模型,然后根据标签给用户推荐结果,在用户使用产品后,对行为数据进行分析,构建用户的标签。而同时对于那些没有历史行为的用户,可以根据最初的标签,直接拿标签去推荐,所以基于内容的推荐,也常常作用于冷启动过程。

3. 内容召回的算法

说完流程,我们来谈谈基于内容召回,经常使用的一些算法。

从最初的数据源开始,对于文本数据,经常的做法就是:

  1. 把非结构化的文本结构化
  2. 根据用户行为数据,把物品的结构化结果传给用户,与用户结构化信息合并

对于文本结构化的处理上来说,一般使用比较多的就是NLP相关算法:

  1. TF-IDF:目前我经常用的就是,可以提取出item的关键词词频,然后建立关键词和item的倒排表。
  2. Kmeans:可以对用户、物品分别聚类,根据聚类进行针对性推荐
  3. Word2vec:计算词向量,扩充结构化标签;累加得到一个文本的稠密向量;聚类,得到更好的聚类效果
  4. 其他:LDA主题识别,TextRank算法,UGC内容分类,卡方检验CHI和信息增益IG

在具体的实践中,我目前的做法是:

  1. 针对item,利用TF-IDF,计算出每个item的关键词,然后在ES中构建关键词-item的倒排表,如:剑南春:[item1:0.9, item2:0.7, item100:0.5...]
  2. 截取近30天内用户的行为数据,统计出用户每个关键词的比例,如:剑南春-0.5,茅台0.2,五粮液0-0.2,泸州老窖-0.1,这个过程用hive、spark都可以统计出来
  3. 假如内容召回100个,那么拿着关键词去es中,提取每个关键词对应的item数量,如:剑南春-50个,茅台-20个,五粮液-20个,泸州老窖-10个

通过这样的方法,就完成了基于内容的召回,真的不难。就是给每个item打标签,然后统计用户的标签比例,然后根据召回的个数,对应的去数据库里拿item就结束了。

当然,在打标签的时候,根据内容的特点,去针对性的选择算法,筛选完后,再选择es或redis等查询快速的数据库存储即可。

而在实际工作中,标签打的越多,对用户的喜好也就越准确,但是,耗费的精力也就越多。召回阶段是推荐系统的一部分,没必要在某一个节点做的太过细致,就目前业界的趋势来说,更多的是用机器学习,深度学习等算法,去提升生产力,所以适度的标签化即可,也就是前面提到的,用户画像不是推荐系统的目的,而是附带的产品。

好了,关于基于内容的召回,就总结到这里,还是那句话,思路最重要,具体使用什么算法,使用什么工具,需要根据数据的特点来选择。学习就应该从全局到局部,由上至下的思想,才会把知识体系构建出来。

后续我会针对算法进行详细的总结,拜了个拜~

最新文章

  1. mui框架使用的过程中遇到的几个问题
  2. 1476. Lunar Code
  3. Servlet页面登录的数据库验证程序(二)
  4. linux安全检查
  5. JQuery Easy Ui dataGrid 数据表格
  6. windows系统中ubuntu虚拟机安装及web项目到服务上(一)
  7. CF 120F Spider 树的直径 简单题
  8. 怎么样能让自己的虚拟机上网win7 for linux
  9. trate
  10. Objective-C 【类对象及SEL存储方式】
  11. 51nod贪心算法入门-----独木舟问题
  12. poj2406 Power Strings(kmp失配函数)
  13. Arduino线程库ProtoThreads
  14. POJ 1862 Stripies
  15. POJ 1804 Brainman(5种解法,好题,【暴力】,【归并排序】,【线段树单点更新】,【树状数组】,【平衡树】)
  16. 【Visual C++】游戏编程学习笔记之六:多背景循环动画
  17. .net core 程序退出事件
  18. JDBC事务的相关知识
  19. 作业一 :关于C语言
  20. Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)

热门文章

  1. 【LeetCode】940. Distinct Subsequences II 解题报告(Python)
  2. 【剑指Offer】旋转数组中的最小数字 解题报告(Python)
  3. 【LeetCode】849. Maximize Distance to Closest Person 解题报告(Python)
  4. 1137 - Expanding Rods
  5. visual studio code的python编程中遇到的SyntaxError:invalid syntax问题的原因和解决办法
  6. python xlrd读Excel表
  7. spring练习,使用Eclipse搭建的Spring开发环境,属性注入通过构造方法方式实现,模拟用户的正常登录。
  8. js 盒子逐渐缓慢移动效果
  9. Spring Cloud Eureka源码分析之心跳续约及自我保护机制
  10. select 1 from 是什么意思?有什么作用?