This commit is contained in:
louzefeng
2024-07-11 05:50:32 +00:00
parent bf99793fd0
commit d3828a7aee
6071 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,133 @@
<audio id="audio" title="04 | 画鬼容易画人难:用户画像的“能”和“不能”" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/91/df/910c80be51ea84dbce5d7da5957cb6df.mp3"></audio>
做好一个推荐系统,总共分三步:
1. 认识每一个用户;
1. 给他推荐他感兴趣的东西;
1. 坐等各项指标上升。
开个玩笑,如果这么简单的话,那么你和我都要失业了;但是话说回来,认识用户是必须的,不过不用担心,认识用户不用请他们吃饭,这就是我们常常听说的“用户画像”这个词。今天,我就来跟你聊一聊:用户画像的那些事儿。
用户画像比较抽象,就像每个人都听说过鬼,但很少有人见过。事实上,它也没有那么神秘,只是大家对它有误解,要么觉得没什么用,要么觉得它是“银弹”,可能相信后者的人略多一些,但实际上这两种看法都不准确。
## 什么是用户画像
先说说“用户画像”这个词它对应的英文有两个Personas 和 User Profile。Personas属于交互设计领域的概念不在本文讨论范围内请出门右转去找交互设计师们聊留下来的人我们聊聊 User Profile 这种用户画像。
User Profile 原本用于营销领域。营销人员需要对营销的客户有更精准的认识,从而能够更有针对性地对客户和市场制定营销方案。
这个理念本身没有错,但是有一个问题:传统营销领域,是以市场销售人员为第一人称视角去看待客户的,也就是用户画像为营销人员服务。
在这种用途下谈论的用户画像,和我们即将在推荐系统领域谈论的相差有点大;但是很遗憾,今天在媒体上看到的大多数“用户画像”案例分享,都停留在这个意思上。
比如最常见的用户画像出现在高大上的PPT上用标签云的方式绘制一个人的形状或者在一个人物形象旁边列出若干人口统计学属性以此来表达“用户画像”这个概念。
看上去非常酷炫,但是我得悄悄告诉你一个赤裸裸的真相:越酷炫的用户画像越没什么用。
**为什么会这样?根本原因是:用户画像应该给机器看,而不是给人看。**
既然是给机器看的,那么画像是不是酷炫、是不是像、维度是不是人类可读,都不重要。那它到底是个什么样子呢?先别急,听我慢慢讲。
一个推荐系统来到这个世界上它只有一个使命就是要在用户User和物品Item之间建立连接。
一般方式就是,对用户和物品之间的匹配评分,也就是预测用户评分或者偏好。推荐系统在对匹配评分前,则首先就要将用户和物品都向量化,这样才能进行计算。
而根据推荐算法不同,向量化的方式也不同,最终对匹配评分的做法也不同,在后面讲到具体推荐算法时你会看到这一点。
用户向量化后的结果就是User Profile俗称“用户画像”。**所以,用户画像不是推荐系统的目的,而是在构建推荐系统的过程中产生的一个关键环节的副产品。**
另外,通常大型推荐系统一般都分为召回和排序两个阶段,这个在后面我会专门讲到。
因为全量物品通常数量非常大无法为一个用户User逐一计算每一个物品Item的评分这时候就需要一个召回阶段其实就是预先筛选一部分物品Item从而降低计算量用户画像除了用于最终匹配评分还要用在召回。所以构建用户画像就要以这两个阶段为目的。
## 用户画像的关键因素
举个例子,我想去吃点夜宵,楼下有五家大排档,那么从推荐系统的思路来看,我怎么选择呢?
首先就是将五家大排档向量化,我暂定向量的维度有:
1. 价格1~5分最贵的1分最便宜的5分
1. 种类1~5分只烤馒头片的是1分天上飞的、海里游的、地上跑的、地里种的都有就是5分
1. 味道1~5分根据以前吃的最难吃的是1分最好吃的是5分。
现在每一个大排档都有一个向量,我自己也要有一个对应的向量,就是你有多看中这三个元素:
1. 价格: 1~5分土豪不差钱就是1分囊中羞涩就是5分。
1. 种类: 1~5分早就想好吃什么了不在乎选择多不多1分看看再说就是5分
1. 味道: 1~5分只是果腹就是1分资深吃货就是5分
这样一来就可以对五家大排档做匹配打分了,你很容易得出哪家大排档最适合。
假如我的向量是:
价格: 3<br />
<br>种类: 5<br />
<br>味道: 5
这就是一个大排档推荐系统的简单用户画像了,是不是很简单!
这里可以简单计算一下:每一个因素相乘后再相加,就得到每一个大排档的评分了。
接下来我来围绕这个大排档推荐系统的用户画像,看看建立用户画像的关键因素:**第一个是维度,第二个是量化。**
### **首先我先来说说“维度”。**
看前面这个例子,我定下来的几个维度:价格、种类、味道。这几个维度有三个特点:
**1 每个维度的名称都是可理解的。**
当我们去给每一个大排档计算评分时想象你是一台计算机你读取了用户画像的“价格”取值为3再去取出一个大排档的“价格”评分两者相乘用户画像的维度“价格”和大排档的“价格”天然匹配上了。
因为是同一个名字;但是计算机很傻,你把大排档的这个维度换成“价钱”,它就不知道该如何是好了。
另一方面对这三个维度把两边同时换成1、 2、3或者a、b、c都是可以的也不影响计算结果计算机依然能够匹配上所以用户画像的维度不一定需要人类能够理解只要计算机能把两边对应上就可以了。
**2 维度的数量是我拍脑袋定的。**
假如是根据用户的阅读历史挖掘阅读兴趣标签,那么我们无法提前知道用户有哪些标签,也就不能确定用户画像有哪些维度,所以第二点也不是必须的。
**3 有哪些维度也是我拍脑袋确定的。**
因为这一点也不是必须的,用户画像的维度个数可以不用确定。理论上来说维度越多,画像越精细,但带来的计算代价也是很大的,需要权衡。
虽然这里以标签作为例子,但是你要注意,用户画像是向量化结果,而不是标签化。标签化只是向量化的一种,因为向量的维度不一定需要人理解。
### 其次,我来说说量化。
我们这里的量化都是主观的,而在实际生产系统上,用户画像每个维度的量化,应该交给机器,而且以目标为导向,以推荐效果好坏来反向优化出用户画像才有意义,像这里这个简单的例子,没有去管推荐效果而先行主观量化了每一个维度,是大忌。
所以用户画像的量化是和第三个关键元素“效果”息息相关的。前面已经说过,不要为了用户画像而用户画像,它只是推荐系统的一个副产品,所以要根据使用效果(排序好坏、召回覆盖等指标)来指导用户画像的量化。
## 用户画像构建的方法
再来整体说说怎么构建用户画像,按照对用户向量化的手段来分,用户画像构建方法分成三类:
**1. 第一类就是查户口。**
直接使用原始数据作为用户画像的内容,如注册资料等人口统计学信息,或者购买历史,阅读历史等,除了数据清洗等工作,数据本身并没有做任何抽象和归纳。这就跟查户口一样,没什么技术含量,但通常对于用户冷启动等场景非常有用。
**2. 第二类就是堆数据。**方法就是堆积历史数据,做统计工作,这是最常见的用户画像数据,常见的兴趣标签,就是这一类,就是从历史行为数据中去挖掘出标签,然后在标签维度上做数据统计,用统计结果作为量化结果。这一类数据贡献了常见的酷炫用户画像。
**3. 第三类就是黑盒子。**就是用机器学习方法,学习出人类无法直观理解的稠密向量,也最不被非技术人员重视,但实际上在推荐系统中承担的作用非常大。
比如使用潜语义模型构建用户阅读兴趣或者使用矩阵分解得到的隐因子或者使用深度学习模型学习用户的Embedding 向量。这一类用户画像数据因为通常是不可解释,不能直接被人看懂。
我会在后面专门讲解这些技术手段,以及它们在推荐系统中的实际使用。
## 总结
现在总结一下今天的内容:
<li>
用户画像到底是什么?它是对用户信息的向量化表示,为什么不向量化表示不行呢?因为没办法交给计算机计算,而且,用户画像是给机器看的,而不是给人看的。
</li>
<li>
用户画像的关键元素有哪些?维度、量化。用户画像是跟着使用效果走的,用户画像本身并不是目的。
</li>
<li>
通常构建用户画像的手段有哪几类?有三类,第一类只会查户口做记录,第二类就是堆数据做统计,第三类就是黑盒子看不懂。
</li>
你可以分享一下你现在正在经历的用户画像是什么样的,它有哪些优点和哪些问题,是不是为了展示给人看而构建的酷炫用户画像呢?欢迎留言和我一起讨论。感谢你的收听,我们下次再见。
<img src="https://static001.geekbang.org/resource/image/87/b0/873b086966136189db14874181823fb0.jpg" alt="" />

View File

@@ -0,0 +1,216 @@
<audio id="audio" title="05 | 从文本到用户画像有多远" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/6b/1f/6b642b9343b148321079698f2271001f.mp3"></audio>
前面我和你聊过了不要把用户画像当成银弹也不要觉得一无是处。对于一个早期的推荐系统来说基于内容推荐离不开为用户构建一个初级的画像这种初级的画像一般叫做用户画像User Profile一些大厂内部还习惯叫做UP今天我就来讲一讲从大量文本数据中挖掘用户画像常常用到的一些算法。
## 从文本开始
用户这一端比如说有:
1. 注册资料中的姓名、个人签名;
1. 发表的评论、动态、日记等;
1. 聊天记录(不要慌,我举个例子而已,你在微信上说的话还是安全的)。
物品这一端也有大量文本信息,可以用于构建物品画像( Item Profile ),并最终帮助丰富 用户画像User Profile这些数据举例来说有
1. 物品的标题、描述;
1. 物品本身的内容(一般指新闻资讯类);
1. 物品的其他基本属性的文本。
文本数据是互联网产品中最常见的信息表达形式,数量多、处理快、存储小,因为文本数据的特殊地位,所以今天我专门介绍一些建立用户画像过程中用到的文本挖掘算法。
## 构建用户画像
要用物品和用户的文本信息构建出一个基础版本的用户画像,大致需要做这些事:
**1. 把所有非结构化的文本结构化,去粗取精,保留关键信息;**<br />
<br><br />
**2. 根据用户行为数据把物品的结构化结果传递给用户,与用户自己的结构化信息合并。**
第一步最关键也最基础,其准确性、粒度、覆盖面都决定了用户画像的质量。仿佛如果真的要绘制一个用户的模样,要提前给他拍照,这个拍照技术决定了后面的描绘情况,无论是采用素描、油画、工笔还是写意。这一步要用到很多文本挖掘算法,稍后会详细介绍。
第二步会把物品的文本分析结果,按照用户历史行为把物品画像( Item Profile )传递给用户。你也许会问:传递是什么意思?没关系,这个稍后我会介绍。
### 一、结构化文本
我们拿到的文本,常常是自然语言描述的,用行话说,就是“非结构化”的,但是计算机在处理时,只能使用结构化的数据索引,检索,然后向量化后再计算;所以分析文本,就是为了将非结构化的数据结构化,好比是将模拟信号数字化一样,只有这样才能送入计算机,继续计算。这个很好理解,不多解释。
从物品端的文本信息我们可以利用成熟的NLP算法分析得到的信息有下面几种。
1. 关键词提取最基础的标签来源也为其他文本分析提供基础数据常用TF-IDF和TextRank。
1. 实体识别人物、位置和地点、著作、影视剧、历史事件和热点事件等常用基于词典的方法结合CRF模型。
1. 内容分类:将文本按照分类体系分类,用分类来表达较粗粒度的结构化信息。
1. 文本 :在无人制定分类体系的前提下,无监督地将文本划分成多个类簇也很常见,别看不是标签,类簇编号也是用户画像的常见构成。
1. 主题模型:从大量已有文本中学习主题向量,然后再预测新的文本在各个主题上的概率分布情况,也很实用,其实这也是一种聚类思想,主题向量也不是标签形式,也是用户画像的常用构成。
1. 嵌入“嵌入”也叫作Embedding从词到篇章无不可以学习这种嵌入表达。嵌入表达是为了挖掘出字面意思之下的语义信息并且用有限的维度表达出来。
下面我来介绍几种常用的文本结构化算法。
**1 TF-IDF**
TF全称就是Term Frequency是词频的意思IDF就是 Inverse Document Frequency 是逆文档频率的意思。TF-IDF提取关键词的思想来自信息检索领域其实思想很朴素包括了两点在一篇文字中反复出现的词会更重要在所有文本中都出现的词更不重要。非常符合我们的直觉这两点就分别量化成TF和IDF两个指标
1. TF就是词频在要提取关键词的文本中出现的次数
1. IDF是提前统计好的在已有的所有文本中统计每一个词出现在了多少文本中记为n也就是文档频率一共有多少文本记为N。
IDF就是这样计算<br />
<img src="https://static001.geekbang.org/resource/image/a9/63/a90ba5c08a6ea42773633b278ceca863.png" alt="" /><br />
计算过程为词出现的文档数加1再除总文档数最后结果再取对数。
IDF的计算公式有这么几个特点
1. 所有词的N都是一样的因此出现文本数越少(n)的词它的IDF值越大
1. 如果一个词的文档频率为0为防止计算出无穷大的IDF所以分母中有一个1
1. 对于新词本身应该n是0但也可以默认赋值为所有词的平均文档频率。
计算出TF和IDF后将两个值相乘就得到每一个词的权重。根据该权重筛选关键词的方式有
1. 给定一个K取Top K个词这样做简单直接但也有一点如果总共得到的词个数少于K那么所有词都是关键词了显然这样做不合理
1. 计算所有词权重的平均值,取在权重在平均值之上的词作为关键词;
另外,在某些场景下,还会加入以下其他的过滤措施,如:只提取动词和名词作为关键词。
**2 TextRank**
TextRank这个名字看上去是不是和著名的PageRank有点亲戚关系是的TextRank是PageRank的私生子之一著名的PageRank算法是Google用来衡量网页重要性的算法TextRank算法的思想也与之类似可以概括为
1. 文本中设定一个窗口宽度比如K个词统计窗口内的词和词的共现关系将其看成无向图。图就是网络由存在连接关系的节点构成所谓无向图就是节点之间的连接关系不考虑从谁出发有关系就对了
1. 所有词初始化的重要性都是1
1. 每个节点把自己的权重平均分配给“和自己有连接“的其他节点;
1. 每个节点将所有其他节点分给自己的权重求和,作为自己的新权重;
1. 如此反复迭代第3、4两步直到所有的节点权重收敛为止。
通过TextRank计算后的词语权重呈现出这样的特点那些有共现关系的会互相支持对方成为关键词。
**3 内容分类**
在门户网站时代每个门户网站都有自己的频道体系这个频道体系就是一个非常大的内容分类体系这一做法也延伸到了移动互联网UGC时代图文信息流 App 的资讯内容也需要被自动分类到不同的频道中,从而能够得到最粗粒度的结构化信息,也被很多推荐系统用来在用户冷启动时探索用户兴趣。
在门户时代的内容分类,相对来说更容易,因为那时候的内容都是长文本,长文本的内容分类可以提取很多信息,而如今 UGC 当道的时代,短文本的内容分类则更困难一些。短文本分类方面经典的算法是 SVM 在工具上现在最常用的是Facebook开源的FastText。
**4 实体识别**
命名实体识别也常常被简称为NERNamed-Entity Recognition在NLP技术中常常被认为是序列标注问题和分词、词性标注属于同一类问题。
所谓序列标注问题,就是给你一个字符序列,从左往右遍历每个字符,一边遍历一边对每一个字符分类,分类的体系因序列标注问题不同而不同:
1. 分词问题:对每一个字符分类为“词开始”“词中间”“词结束”三类之一;
1. 词性标注:对每一个分好的词,分类为定义的词性集合的之一;
1. 实体识别:对每一个分好的词,识别为定义的命名实体集合之一。
对于序列标注问题通常的算法就是隐马尔科夫模型HMM或者条件随机场CRF我们在推荐系统中主要是挖掘出想要的结构化结果对其中原理有兴趣再去深入了解。
实体识别还有比较实用化的非模型做法词典法。提前准备好各种实体的词典使用trie-tree数据结构存储拿着分好的词去词典里找找到了某个词就认为是提前定义好的实体了。
以实体识别为代表的序列标注问题上工业级别的工具上spaCy比NLTK在效率上优秀一些。
**5 聚类**
传统聚类方法在文本中的应用今天逐渐被主题模型取代同样是无监督模型以LDA为代表的主题模型能够更准确地抓住主题并且能够得到软聚类的效果也就是说可以让一条文本属于多个类簇。
作为初创公司或初创产品我知道你的时间宝贵也知道你的公司处处节俭以至于没有业务专家为你的应用制定分类体系这时候如果能在文本数据上跑一个LDA模型那世界就显得非常美好了。
LDA模型需要设定主题个数如果你有时间那么这个K可以通过一些实验来对比挑选方法是每次计算K个主题两两之间的平均相似度选择一个较低的K值如果你赶时间在推荐系统领域只要计算资源够用主题数可以尽量多一些。
另外需要注意的是得到文本在各个主题上的分布可以保留概率最大的前几个主题作为文本的主题。LDA工程上较难的是并行化如果文本数量没到海量程度提高单机配置也是可以的开源的LDA训练工具有GensimPLDA等可供选择。
**6 词嵌入**
关于嵌入,是一个数学概念。以词嵌入为例来说吧。
词嵌入也叫作Word Embedding。前面讲到的结构化方案除了LDA其他都是得到一些标签而这些标签无一例外都是稀疏的而词嵌入则能够为每一个词学习得到一个稠密的向量。
这样说可能很抽象换个说法一个词可能隐藏很多语义信息比如北京可能包含“首都、中国、北方、直辖市、大城市”等等这些语义在所有文本上是有限的比如128个于是每个词就用一个128维的向量表达向量中各个维度上的值大小代表了词包含各个语义的多少。
拿着这些向量可以做以下的事情:
1. 计算词和词之间的相似度,扩充结构化标签;
1. 累加得到一个文本的稠密向量;
1. 用于聚类,会得到比使用词向量聚类更好的语义聚类效果。
这方面当然就属大名鼎鼎的Word2Vec了。Word2Vec是用浅层神经网络学习得到每个词的向量表达Word2Vec最大的贡献在于一些工程技巧上的优化使得百万词的规模在单机上可以几分钟轻松跑出来得到这些词向量后可以聚类或者进一步合成句子向量再使用。
### 二、标签选择
前面说到,用户端的文本,物品端的文本如何结构化,得到了诸如标签(关键词、分类等)、主题、词嵌入向量。接下来就是第二步:如何把物品的结构化信息给用户呢?
我们想一想,用户在产品上看到了很多我们用各种逻辑和理由展示给他的物品,他只从中消费了一部分物品。现在问题就是,到底是那些特性吸引了他消费呢?
一种简单粗暴的办法是直接把用户产生过行为的物品标签累积在一起,但是这里要说的是另一种思路。
我们把用户对物品的行为,消费或者没有消费看成是一个分类问题。用户用实际行动帮我们标注了若干数据,那么挑选出他实际感兴趣的特性就变成了特征选择问题。
最常用的是两个方法卡方检验CHI和信息增益IG。基本思想是
1. 把物品的结构化内容看成文档;
1. 把用户对物品的行为看成是类别;
1. 每个用户看见过的物品就是一个文本集合;
1. 在这个文本集合上使用特征选择算法选出每个用户关心的东西。
### 1 卡方检验
CHI就是卡方检验本身是一种特征选择方法。
前面的TF-IDF和TextRank都是无监督关键词提取算法而卡方检验CHI则是有监督的需要提供分类标注信息。
为什么需要呢?在文本分类任务中,挑选关键词就得为了分类任务服务,而不仅仅是挑选出一种直观上看着重要的词。
卡方检验本质上在检验“词和某个类别C相互独立”这个假设是否成立和这个假设偏离越大就越说明这个词和类别C暗中有一腿那当然这个词就是关键词了。
计算一个词Wi和一个类别Cj的卡方值需要统计四个值
1. 类别为 Cj 的文本中出现词Wi 的文本数 A
1. 词 Wi 在非 Cj 的文本中出现的文本数 B
1. 类别为Cj的文本中没有出现 Wi的文本数 C
1. 词Wi 在非Cj 的文本中没有出现的文本数 D 。
听起来有点绕,我把它画成一个表格更加一目了然。<br />
<img src="https://static001.geekbang.org/resource/image/fa/87/fa389dccac533dccfe9ebc028a37d987.png" alt="" />
然后按照如下公式计算每一个词和每一个类别的卡方值:<br />
<img src="https://static001.geekbang.org/resource/image/f4/c5/f49825884771fb06ab9f1a88bae0d2c5.png" alt="" />
关于这个卡方值计算,我在这里说明几点:
1. 每个词和每个类别都要计算,只要对其中一个类别有帮助的词都应该留下;
1. 由于是比较卡方值的大小所以公式中的N可以不参与计算因为它对每个词都一样就是总的文本数
1. 卡方值越大,意味着偏离“词和类别相互独立”的假设越远,靠“词和类别互相不独立”这个备择假设越近。
### 2 信息增益
IG 即 Information Gain信息增益也是一种有监督的关键词选择方法也需要有标注信息。要理解信息增益理解了信息熵就差不多了。
信息熵一批文本被标注了类别那么任意挑出一条文本问你“猜猜这是什么类别”如果原来每个类别的文本数量都一样那你肯定最不好猜如果其中一个类别的文本C数远远多于其他类别那么你猜这条文本属于类别C就很可能猜对。这两个情况区别就在于信息熵不同
1. 各个类别的文本数量差不多时,信息熵就比较大。
1. 其中少数类别的文本数量明显较多时,信息熵就较小。
进一步再想一件事如果从这一堆文本中再挑出包含有词W的文本数再来猜任意一条文本的类别时仍然会有上面两种情况。这时候考虑一个情况如果在整个文本上的情况是1但挑出包含词W后的情况变成2了那么你想这个词W是不是非常有用因为有了它我们就能以较高的成功率猜对任意一条文本的类别了。
对,上面这个思考过程就是信息增益的思想,信息增益计算也是分成三步:
1. 统计全局文本的信息熵;
1. 统计每个词的条件熵,就是知道了一个词后再统计文本的信息熵,只不过这里要分别计算包含词和不包含词两部分的信息熵,再按照各自文本比例加权平均;
1. 两者相减就是每个词的信息增益。
信息增益应用最广就是数据挖掘中的决策树分类算法,经典的决策树分类算法挑选分裂节点时就是计算各个属性的信息增益,始终挑选信息增益最大的节点作为分裂节点。
卡方检验和信息增益不同之处在于:前者是针对每一个行为单独筛选一套标签出来,后者是全局统一筛选。
这些方法都是在离线阶段批量完成的,把用户的画像生成配置成离线任务,每天更新一遍,次日就可以使用新的用户画像。
那么对于一个新用户,能不能在他刚刚进入产品时就能够快速生成一个简单的画像呢?答案是:当然可以。这在后面的专栏中会讲到的 MAB 问题。
## 总结
用户画像对于推荐系统还是非常必要的,而产品中属文本数据最多,那如何用文本数据构建出用户的画像内容呢?
本文按照如下步骤梳理了这一过程:
1. 分析用户的文本和物品的文本,使其结构化;
1. 为用户挑选有信息量的结构化数据,作为其画像内容。
其中,我们提出了把为用户挑选画像标签看成是特征选择问题,除了卡方检验和信息增益,你还知道有哪些特征选择方法呢?欢迎留言一起讨论。
感谢你的收听,我们下次再见。
<img src="https://static001.geekbang.org/resource/image/87/b0/873b086966136189db14874181823fb0.jpg" alt="" />

View File

@@ -0,0 +1,115 @@
<audio id="audio" title="06 | 超越标签的内容推荐系统" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/0e/90/0e507d4f9dc825ab5c8daa03bb52a290.mp3"></audio>
我曾在不同公司里都听到过,他们的产品经理或者大佬问过这样的问题:我们的推荐系统标签够不够?
相信你也遇到过类似的问题。这其实是一个很大的误区:基于内容的推荐系统,标签只是很小一部分。
而且就算是标签,衡量质量的方式也不是数目够不够;所以,今天我要讲的内容,就是说一说脱离标签定式思维的内容推荐。
## 为什么要做好内容推荐
所谓的基于内容推荐,通俗一点来讲,就是一个包装成推荐系统的信息检索系统。这听上去有点残酷,但通常一个复杂的推荐系统很可能是从基于内容推荐成长起来的。
可以说,基于内容的推荐系统是一个推荐系统的孩童时代,所以,我们不能让自己的推荐系统输在起跑线上,得富养才行。那么,首先我就来讲一讲如何养成一个基于内容的推荐系统。
为什么基于内容的推荐系统这么重要呢?因为内容数据非常易得,哪怕是在一个产品刚刚上线,用心找的话总能找到一些可以使用的内容,不需要有用户行为数据就能够做出推荐系统的第一版。
内容数据尤其是文本,只要深入挖掘,就可以挖掘出一些很有用的信息供推荐系统使用。
另外,著名的流媒体音乐网站 Pandora其音乐推荐系统背后的“音乐基因工程”实质上就是人工为音乐标注了各种维度的属性这样即便使用基于内容推荐的方式也做出了很好的推荐效果。
听上去,上面这段话特别像是在安慰还处在冷启动阶段的你,事实上呢,其实并不全是,内容推荐的方式还有它的必要性。推荐系统总是需要接入新的物品,这些新的物品在一开始没有任何展示机会,显然就没有用户反馈,这时候只有内容能帮它。
基于内容的推荐能把这些新物品找机会推荐出去,从而获得一些展示机会,积累用户反馈、走上巅峰、占据热门排行榜。
要把基于内容的推荐做好,需要做好“抓、洗、挖、算”四门功课。它们分别是对应了下面的内容。
1. 抓:大厂们从来不公开说的一件事是,他们一直在持续抓数据丰富自己的内容,所以做好一个基于内容的推荐,抓取数据补充内容源,增加分析的维度,两者必不可少。
1. 洗:抓来的数据,相当于捡别人掉地上的东西吃,我们也得注意卫生,洗洗更健康,数据也一样,冗余的内容、垃圾内容、政治色情等敏感内容等等都需要被洗出去。
1. 挖:不管是抓来的数据,还是自家的数据,如果不深入挖掘,那就和捧着金饭碗去要饭一样,浪费了大好资源。可以说,很多推荐系统提升效果并不是用了更复杂的推荐算法,而是对内容的挖掘做得更加深入。
1. 算:匹配用户的兴趣和物品的属性,计算出更合理的相关性,这是推荐系统本身的使命,不仅仅是基于内容的推荐才要做的。
**那么,这四门功课到底如何分布在基于内容的推荐系统中呢?**
下面我和你一起来看看,基于内容推荐的框架
在文稿中,我放了一张图,一个典型基于内容推荐的框架图是下面这样的:<br />
<img src="https://static001.geekbang.org/resource/image/c4/d8/c4b73865fed32f9f95a1b56802827dd8.png" alt="" />
简要介绍一下这张图的流程和基本元素。
内容这一端:内容源经过内容分析,得到结构化的内容库和内容模型,也就是物品画像。用户这一端:用户看过推荐列表后,会产生用户行为数据,结合物品画像,经过用户分析得到用户画像。
以后对于那些没有给用户推荐过的新内容,经过相同的内容分析过程后就可以经过推荐算法匹配,计算得到新的推荐列表给用户。如此周而复始,永不停息。
## 内容源
在互联网中,抓数据是一件可做不可说的事情,哪怕是市值几千亿的大厂,也有专门的小分队抓数据,补充推荐系统每天的内容消耗。因为,只有当内容有多样性了,一个推荐系统才有存在的合法性,所以大厂职工们抓数据也是为了保住自己的饭碗。
爬虫技术本身非常复杂、非常有学问,比推荐算法难多了,这里就不展开讲了。
不论是抓来的数据还是自家用户产生的数据,都离不开清洗数据。由于各家都在相互借鉴来借鉴去,所以抓到重复的内容也是很有可能的,去重与识别垃圾内容、色情内容、政治敏感内容等都是必修课。
关于这个环节的边角算法,我们在后面的文章中会专门花一些篇幅来讲。
## 内容分析和用户分析
基于内容的推荐,最重要的不是推荐算法,而是内容挖掘和分析。内容挖掘越深入,哪怕早期推荐算法仅仅是非常硬的规则,也能取得不俗的效果。举个例子,如果推荐物品是短视频,我们分几种情况看:
1. 如果短视频本身没有任何结构化信息,如果不挖掘内容,那么除了强推或者随机小流量,没有别的合理曝光逻辑了;
1. 如果对视频的文本描述,比如标题等能够有内容分类,比如是娱乐类,那么对于喜欢娱乐的用户来说就很合理;
1. 如果能够进一步分析文本的主题,那么对于类似主题感兴趣的用户就可能得到展示;
1. 如果还能识别出内容中主角是吴亦凡,那就更精准锁定一部分用户了;
1. 如果再对内容本身做到嵌入分析,那么潜藏的语义信息也全部抓住,更能表达内容了。
举这个例子是为了说明:随着内容分析的深入,能抓住的用户群体就越细致,推荐的转化率就越高,用户对产品的好感度也就增加了。上一篇中我列举了文本数据——这也是内容数据最常见形式的分析方法。
内容分析的产出有两个:
1. 结构化内容库;
1. 内容分析模型。
结构化的内容库,最重要的用途是结合用户反馈行为去学习用户画像,具体的方法在上一篇中已经介绍了。容易被忽略的是第二个用途,在内容分析过程中得到的模型,比如说:
1. 分类器模型;
1. 主题模型;
1. 实体识别模型;
1. 嵌入模型。
这些模型主要用在:当新的物品刚刚进入时,需要实时地被推荐出去,这时候对内容的实时分析,提取结构化内容,再于用户画像匹配。
## 内容推荐算法
对于基于内容的推荐系统,最简单的推荐算法当然是计算相似性即可,用户的画像内容就表示为稀疏的向量,同时内容端也有对应的稀疏向量,两者之间计算余弦相似度,根据相似度对推荐物品排序。
你别嫌糙,如果你内容分析做得深入的话,通常效果还不错,而且基于内容的推荐天然有一个优点:可解释性非常强。
如果再进一步,要更好地利用内容中的结构化信息,因为一个直观的认识是:不同字段的重要性不同。
比如说,一篇新闻,正文和标题中分析出一个人物名,评论中也分析出其他用户讨论提及的一些人物名,都可以用于推荐。直观上新闻的正文和标题中更重要。
那么我们可以借鉴信息检索中的相关性计算方法来做推荐匹配计算BM25F算法。常用的开源搜索引擎如Lucene中已经实现了经典的BM25F算法直接拿来使用即可。
前面提到的两种办法虽然可以做到快速实现、快速上线,但实际上都不属于机器学习方法,因为没有考虑推荐的目标,而我们在之前的专栏中就专门强调了目标思维,那么,按照机器学习思路该怎么做呢?
一种最典型的场景:提高某种行为的转化率,如点击、收藏、转发等。那么标准的做法是:收集这类行为的日志数据,转换成训练样本,训练预估模型。
每一条样本由两部分构成:一部分是特征,包含用户端的画像内容,物品端的结构化内容,可选的还有日志记录时一些上下文场景信息,如时间、地理位置、设备等等,另一部分就是用户行为,作为标注信息,包含“有反馈”和“无反馈”两类。
用这样的样本训练一个二分类器常用模型是逻辑回归Logistic Regression和梯度提升树GBDT或者两者的结合。在推荐匹配时预估用户行为发生的概率按照概率排序。这样更合理更科学而且这一条路可以一直迭代优化下去。
## 总结
基于内容的推荐一般是推荐系统的起步阶段,而且会持续存在,它的重要性不可取代。因为:
1. 内容数据始终存在并且蕴含丰富的信息量,不好好利用就可惜了;
1. 产品冷启动阶段,没有用户行为,别无选择;
1. 新的物品要被推荐出去,首选内容推荐。
基于内容的整体框架也是很清晰的,其中对内容的分析最为重要,推荐算法这一款可以考虑先使用糙快猛的相似度计算,也可以采用机器学习思路训练预估模型,当然这必须得有大量的用户行为做保证。
好的,今天的内容就到这里,你可以在留言中谈一谈你对整个内容推荐链条各个环节的理解吗?欢迎和我一起讨论,感谢你的收听,我们下期再见。
# 本周知识要点
<img src="https://static001.geekbang.org/resource/image/46/ef/4691f5de66ed4778449e0498bca8a5ef.jpg" alt="" />