推荐召回--基于内容的召回:Content Based
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等查询快速的数据库存储即可。
而在实际工作中,标签打的越多,对用户的喜好也就越准确,但是,耗费的精力也就越多。召回阶段是推荐系统的一部分,没必要在某一个节点做的太过细致,就目前业界的趋势来说,更多的是用机器学习,深度学习等算法,去提升生产力,所以适度的标签化即可,也就是前面提到的,用户画像不是推荐系统的目的,而是附带的产品。
好了,关于基于内容的召回,就总结到这里,还是那句话,思路最重要,具体使用什么算法,使用什么工具,需要根据数据的特点来选择。学习就应该从全局到局部,由上至下的思想,才会把知识体系构建出来。
后续我会针对算法进行详细的总结,拜了个拜~
推荐召回--基于内容的召回:Content Based的更多相关文章
- 基于内容的图片检索CBIR(Content Based Image Retrieval)简介
传统的图像检索过程,先通过人工对图像进行文字标注,再利用关键字来检索图像,这种依据图像描述的字符匹配程度提供检索结果的方法,简称“以字找图”,既耗时又主观多义.基于内容的图像检索客服“以字找图”方式的 ...
- 推荐召回--基于物品的协同过滤:ItemCF
目录 1. 前言 2. 原理&计算&改进 3. 总结 1. 前言 说完基于用户的协同过滤后,趁热打铁,我们来说说基于物品的协同过滤:"看了又看","买了又 ...
- Recommending music on Spotify with deep learning 采用深度学习算法为Spotify做基于内容的音乐推荐
本文参考http://blog.csdn.net/zdy0_2004/article/details/43896015译文以及原文file:///F:/%E6%9C%BA%E5%99%A8%E5%AD ...
- elasticsearch使用More like this实现基于内容的推荐
基于内容的推荐通常是给定一篇文档信息,然后给用户推荐与该文档相识的文档.Lucene的api中有实现查询文章相似度的接口,叫MoreLikeThis.Elasticsearch封装了该接口,通过Ela ...
- ElasticSearch java API-使用More like this实现基于内容的推荐
ElasticSearch java API-使用More like this实现基于内容的推荐 基于内容的推荐通常是给定一篇文档信息,然后给用户推荐与该文档相识的文档.Lucene的api中有实现查 ...
- Recommender Systems基于内容的推荐
基于内容的推荐的基本推荐思路是:用户喜欢幻想小说,这本书是幻想小说,则用户有可能喜欢这本小说 两方面要求:(1)知道用户的喜好:(2)知道物品的属性 基于内容的推荐相比协同过滤方法(个人观点):协同过 ...
- 新闻推荐系统:基于内容的推荐算法(Recommender System:Content-based Recommendation)
https://blog.csdn.net/qq_32690999/article/details/77434381 因为开发了一个新闻推荐系统的模块,在推荐算法这一块涉及到了基于内容的推荐算法(Co ...
- 推荐系统第5周--- 基于内容的推荐,隐语义模型LFM
基于内容的推荐
- 【T-BABY 夜谈大数据】基于内容的推荐算法
这个系列主要也是自己最近在研究大数据方向,所以边研究.开发也边整理相关的资料.网上的资料经常是碎片式的,如果要完整的看完可能需要同时看好几篇文章,所以我希望有兴趣的人能够更轻松和快速地学习相关的知识. ...
随机推荐
- 【LeetCode】990. Satisfiability of Equality Equations 解题报告(C++ & python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 并查集 日期 题目地址:https://le ...
- 【LeetCode】875. Koko Eating Bananas 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 二分查找 日期 题目地址:https://leetc ...
- J. Bottles
J. Bottles time limit per test 2 seconds memory limit per test 512 megabytes input standard input ou ...
- 前端项目 node8升级到node16,代码升级汇总
背景 公司的项目是vue项目,环境是node@8x版本的,最近我创建react hook的项目,发现至少需要node14才支持,打开官网才发现node都已经到16版本了.失策啊,失策.于是直接升级到最 ...
- 【算法】main函数的堆栈溢出
main函数的堆栈的大小默认为1mb 如果把数组int x[1000][1000]定义在main函数里 则int为4byte,8bit为1byte,1024byte为1kb,1024kb为1mb 4* ...
- 响应式网页设计(Bootstrap)
Bootstrap官网 AOS官网 Chrome官方教程 Chrome教程 Bootstrap官网中有许多Bootstrap网站示例,大家可以参考
- Java实习生常规技术面试题每日十题Java基础(一)
目录 1.Java 的 "一次编写,处处运行"如何实现? 2.描述JVM运行原理. 3.为什么Java没有全局变量? 4.说明一下public static void main(S ...
- Android物联网应用程序开发(智慧城市)—— 火焰监控界面开发
效果: 布局代码: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns: ...
- 实践剖析.NET Core如何支持Cookie和JWT混合认证、授权
前言 为防止JWT Token被窃取,我们将Token置于Cookie中,但若与第三方对接,调用我方接口进行认证.授权此时仍需将Token置于请求头,通过实践并联系理论,我们继续开始整活!首先我们实现 ...
- [学习笔记] Oracle创建用户、分配权限、设置角色
创建用户 create user student --用户名 identified by "123456" --密码 default tablespace USERS --表空间名 ...