00:00
接下来给大家讲的是这个实时推荐模块,好,我们看一下,先给大家说一下,它是在我们整个架构的哪一部分呢?呃,那是在右下角这一小部分,呃,前面这一部分其实是跟我们其其他的一些相关工具的一个连接,我们真正实现的算法是这一部分。好,那首先来想一下基于模型的这个实时推荐模块,它有哪些基本的需求呢?而首先我们想到既然是实时嘛,那就一定得反应快,哎,我得实时的看到这个推荐出来的效果,所以说计算速度要求是比较高的,那随之对应的就带来一个问题,你不能说要求计算速度又快,而且又要又特别好,特别精准,这个是不是做不到啊,啊,既想马儿好,又想马儿不吃草,这个没有这样的事儿啊,所以我们的要求就是计算速度要快,要实时,而预测的结果可以不是特别的精确,所以根据这样的需求,我们就有了一个思路。
01:11
思路就是我可以预先把商品的相似度算出来,先放在那里,然后预先设计好一个推荐的模型,然后如果你来了一个基本,来了一条评分数据,我是不是可以直接根据这个模型把它相似的?商品推荐出来就可以了呀,诶这就是一个很快的过程了,那这就是一个基本最简单的基本的思路,大家可以看一看,根据这个基本的思路,我这里面来了一条,这是一条评分数据。这个格式大家能看到吧,啊,这是一个评分数据写到日志里边来,接下来是不是就进入用服务去做一个采集啊,啊,接下来采集到给到卡夫卡,卡夫卡可能会去做一个过滤,做一个处理,进一步得到的最终的结果。
02:08
给到实时推荐算法里面来,Spark streaming去做流失处理,那么在做处理的时候,我们可能就需要一些提前准备好的数据了,比方说release里边要拿到最近的一些评分,诶,这个数据我们的实时算法需要用,另外还需要amongo里边可能也得存好一些数据,比如说就是我们之前。离线基于盈余翼模型不是还有一个副产品吗?就是物品的商品的相似度矩阵对吧?那这一部分我们存到mango里面去了,这里作为实时推荐算法的另外一个输入。结合起来,根据我们预设好的模型去做一个计算,得到的结果再返回写入到mango里边来就可以了,这就是整体的一个流程,那接下来我们重点是不是就是这个模型到底怎么选取啊,诶怎么样去计算他的这个推荐优先级呢?最简单的一个想法是就是前面我们说的相似,基于相似的推荐,而且这个相似是原理是基于什么呢?就是用户最近一段时间的口味。
03:27
应该是相似的。呃,那大家会想到我是不是你刚刚看了一个什么样的商品,或者说刚刚给哪个商品做了一个评分,来了这个这样的一条实时的评分数据,我接下来是不是就拿到跟他相似的那些商品给你推荐出来就完事了,哎,这是最简单的一个想法,这种推荐会有什么样的问题呢?大家想一想。13诶,对,呃,这个大家就会想到,首先如果说我们只是一个商品来了一个评分,我们就直接给他做相关的推荐的话,首先一个问题是。
04:17
这一个物品可能代表不了他最近所有的偏好,对吧,这个评分不一定代表他最近的口味,我们可能需要考虑他最近一段时间内的多个评分,综合考虑可能会好一点。另外还有一个考虑是你直接推跟他相似的物品,那我假如说这个评分是一个差评的。尽管说我我评分了这个物品,看了这个物品,或者说购买了这个物品,这是代表他好像对这个相关的感兴趣,对吧,但是如果是一个差评的话,那是不是这个感兴趣的程度,你应该相对应的有一个减小啊,你不能给他完全相似的那个物品就就推出来,因为推出来的很有可能还是一个差评的物品。
05:06
所以这里大家就要去做综合考量了。我们是不是应该综合考虑相似度和评分的那个分值啊?所以这里边我们预设的这个模型或者说算法,就是自己给出了一个商品优先级的推荐公式,就是说对于某一个商品来说,我们给他计算一个对应的推荐优先级,算出来是一个分数,这个分数的计算公式大家可以看一眼,怎么样去计算呢?啊,这里边是分成了三项,前边这一项。大家可以认为是一个推荐的,呃,基础评分项,后边是两个呃偏移量,那么这个求了一个log,这代表一个奖励,前面一个加,后边减一个log,这个代表一个惩罚,具体代表什么含义呢?
06:07
我们整体的思路是,先从。当前商品,我我现在不是已经来了一个新的商品评分吗?我们先把当前商品,它跟它相似的那些商品取出来,作为备选的商品。然后我们针对每一个备选商品去算一个推荐优先级。计算推荐推荐优先级的时候,就要综合考虑它的那个评分的影响了,应用的公式就是我们这样一个公式,大家来看一下这里边具体的一个例子啊,我们计算X备选商品X推荐推荐优先级怎么样去算呢?我们的方法是用。
07:02
它和最近K4评分的商品。之间去算一个相似度。X和A有一个相似度叫c axx和B有一个相似度叫BX,同样跟C也有一个相似度,然后怎么样去算呢?乘以对应那个平已经评分过的商品的评分,那大家想这是不是相当于把它的相似度做了一个按照评分做了一个加权啊?然后做一个叠加,最后再除以个数三,有三个平分项,我就除以三,这就是我们前面的第一项基础评分。然后后边的两项是偏移项,第一个是一个奖励,那这个奖励是什么呢?它是代表count count表示。
08:04
评分里边的高分项。所以他的意思是说,假如最近一段时间内评出来的这些呃,评分的商品普遍得分比较高的话,那我这一次推荐优先级就要提升,就要有一个奖励。啊,也就是说最近你如果最近的口味。已经看过的商品评,评价出来的这个商品大部分都符合你的口味,给的都是高分,这一次你如果前面得到的这个推荐,我们按照相似得到这个推荐,他就得多加一个奖励。就应该更加推荐,哎,所以这里边我们是用它的个数和一取一个最大值,求一个log,那这里边的话有两个评分比较高的,那我们这里标准一般就是比方说一到五分的评分,那以三分作为基准,是不是大于三的就是高分啊?呃,这里边四五两个,我们这里边再加一个LOG2,那同样对应的后边就应该对第一分项有一个惩罚,如果你最近的评分低分很多的话,那这一次推荐的力度就要减小。
09:20
所以我们统计一下哦,小于三的分数一有一个,那我们就减一个LOG1,这就是我们整体的这一个模型,大家觉得这个好理解吗?呃,其实应该还是比较好理解的,就是前面这个基础项,我们没有直接用,他跟我们当前。评分商品的相似相似度来做来做推荐,而是呃,首先我们是用了最近K次评分的K个商品。用他们之间的相似度,然后呢,还用评分的这个数量,评分的分数对相似度做了一个加权,你不要单纯的只考虑相似,而且还要看他的分数到底多高,如果分数评分高,是一个好评的话,那跟他越相似,我是不是应该推荐力度应该越大。
10:16
如果是一个差评的话,那是不是越相似,这这个这个品推荐力度是不是就不应该那么大呀。所以说我这个相对应的推荐力度就应该做一个衰减。这就是我们整个这一个模型的一个基本思路,好,呃,那我们具体的计算过程是这样的一个过程,大家看一眼,我们首先来了一个基本的。评分数据里边的项目就是user的ID product ID,还有具体的评分score,最后还有一个时间戳。那么我们首先应该拿到哪两个数据呢?我们应该从商品的相似度矩阵里边拿到当前的候选商品,这是我们首先应该拿到的一个数据。另外还得拿到一个数据什么呢?从red里边取出最近的case评分。
11:13
这是我们两个基本数据,接下来我们要做的事情是对于每一个候选商品。去计算他的推荐评分。计算推荐评分的时候,怎么样去算的呢?结合最近K4评分的商品,然后跟每一个评分过的商品算一个相似度,然后用它的评分去做一个加权,得到基础分数。然后接下来在统计最近K4评分里边,高分有几个,低分有几个,然后加上偏移项。奖励项和惩罚项,最后得到一个推荐结果啊,当然了,得到的推荐结果可以和之前的实时推荐结果做一个合并更新,最后写回到实时推荐列表里面去就可以了,这就是我们整个完整的过程,那其实已经得到这个实时用户推荐列表的话,实时计算这一部分就完全就已经结束了,那接下来我们还有两个模块是所谓的其他形式的离线推荐。
12:25
他在我们整个项目架构里边就是这一部分,好,那这一部分首先我们来想一下啊,其他形式的离离线的相似推荐,它主要放在哪一部分展示呢?就是我们点开用户呃,商品的详情页的时候,它下面应该有跟这个商品相关的一些商品,相似的一些商品,对吧?呃,那么这一部分内容我们根据什么去推呢?怎么样拿到跟当前商品相似的商品呢?当然我们可以基于之前我们不是基于盈余翼模型已经有了一个相似度矩阵吗?可以基于他去推,但是更多的时候我们是不是应该基于对基于用本身商品的内容跟他相似的去推,或者基于诶用户购买了哪些商品,哎,然后基于这个去推,对吧?所以这里面大家可以看到我们用到的信息,首先可以从用户信息,信息表里边找到商品的标签,用户给他打上的标签,基于这个内容信息,我们去做一个分词,是不是可以提取出来商品的特征。
13:40
根据特征就可以给他做相似推荐,这是一个思路,另外还有一个还可以基于什么去做推荐呢?评分表里面是不是有商品评分啊,基于用户给他的评分,我们是不是可以啊做item CF。还有什么啊,对,当然了,就是说还可以结合用户的一些搜索行为啊,他之前搜索了哪些关键词去做对应的推荐,对吧,所以这些东西都是可以去做考察的,我们这里边重点给大家介绍的两种形式就是。
14:19
怎么样选取它的相似商品呢?一种就是跟他有相同标签的商品,那这一部分数据我们需要用到商品信息表里面的商品标签,我们用到的算法当然就是t fidf了。还有另外一种可以基于喜欢过商品A的用户,那么他还喜欢什么样的商品呢?是不是把这个类似从评分表里边我们做一个协同过滤。这是item CF对吧?找到类似的商品推荐出来就可以了,这个基本的思路就是喜欢的人重合度越高。那么。商品的相似度是不是就越大呀?大家能不能想到这样一个想法,放。
15:07
呃,对,其实网站当中往往也会有这样的一个推荐,他会有对应的推荐说明,就是说诶,喜欢了这样的物品的,喜欢了这个物品的人还看了哪些物品,对吧?或者说在一些书城网站啊,或者电影网站,哎,经常会有这样的啊,就是啊看了这个这本书的人还在看啊,看了这部电影的人也在看什么什么样的物品,所以在我们页面设计当中,在我们推荐的这个列表里面,其实也应该给出推荐理由,让用户知道,诶我是根据什么来推出这这些这些商品的,那么他就可以去选择,诶看看这个东西是不是跟我相关的一些东西。好,所以接下来这两部分呢,就是一部分是基于内容的推荐,我们会基于UGC标签去做一个分词,然后提取出物品的特征,这里边涉及到的当然就是TT fidf算法,大家回忆一下啊,TF是词频,我们会在这里边会把每一个标签当做一个词语。
16:22
而把每一个。对每一个商品它获得的一个标签,一组标签作为一个文档啊,那么这样的话,我们就可以统计这一个标签在文档中出现等磁频,那你文档频率是什么呢?逆文档频率,那就是。啊,这个标签在所有的文档当中出现的,对出现的频率的那个相反,呃,倒数倒数对吧?呃,去做一个热门度的惩罚,所以这两个乘起来我们就可以算出来它的TFIDF,通过这个算法提取出物品的特征向量。
17:09
提取出特征向量来之后,接下来怎么算相似度呢?啊,这个就又是余弦相似度对不对?哎,之前根据我们的余弦相似度的计算公式,两个向量拿到,那么就可以算出它对应的相似程度。最后,我们一般在实际应用当中,在商品的详情页或者购买页,一般都会把它相关内容的商品会推荐出来,这是我们经常在电商应用网站里边能够看到的一种推荐的模式。另外还有一个是基于物品的协同过滤,也就是我们所说的item CF,那大家想一想,如果让你去做一个item CF的话,你怎么做呢?前面我们说了基本的思路是,诶,就是喜欢这个物品的人对吧,看过这个物品的人,同时也看过哪些物品,我们就推出来,那我们具体在代码里面怎么实现这个东西呢?
18:14
那我是不是得去统计。同时看过这两个物品的人啊。诶,大家想一下到是不是这样啊,我看过前一个物品A的人,如果同时也看了物品B,那么A和B是不是他们的相似度就会比较高,哎,这就是我们基本的一个考量。啊,所以这里边给大家提出我们这里边用到的一个概念啊,就是叫做同线相似度,什么叫同线相似度呢?它就是利用行为数据来去计算不同商品间相似度的一个一种方法,大家看公式是怎么样的呢?就是ni和NG取了一个。
19:01
交集,然后看它里边的个数什么意思,也就是说购买了商品I的用户和购买商品这个用户他们之间的交叉,那个交集有多少。也就是说同时购买了商品I和商品这的用户到底有多少,在我们这个问题里面,我们具体项目应用里面,那可能不是购买,这里是平分了,对吧?所有的行为数据是不是都可以按这个公式来算啊,所以我们只要统计一下有多少人同时购买了商品I和商品J,那么我们就可以把它放在分子上,这就代表他们之间相似度的一个考虑。那下面还要除以一个分母,这是代表什么呢?除以的是。啊,就是购买商品I的数量和购买商品J的数量,然后他们乘起来开一个根号,这是为什么要除以这个数呢?
20:08
这其实整体的思想还是要对热门商品做一个惩罚,大家会想到,如果这个商品是一个热门商品的话,热门商品和热门商品之间。是不是一定相似度很高啊,假如我们用这样就只用上面这个分子来做做计算的话,因为他既然是热门商品吧,那是不是大多数人都会买同时买这两个,但是这不代表他们内部真正的有关联对不对,不代表他们之间到底有多相似,所以说如果我们直接基于上面这个去做推荐的话,也很容易推荐出来就都是热门商品了。所以我们还要对他去做一个热门商品的惩罚,除以他们的这个本来购买的这个人数,那么得到的其实就是说。
21:07
同时购买了I和G的人数占他们各自购买人数里边的那个比例,如果这个比例更高,才代表他们之间的相相关度高,大家可以理解这个过程对吧?在实际应用当中啊,项目应用当中,其实item CF用的也是非常广的,呃,我们往往因为为什么他应用比较广呢。就是我们不需要知道物品的相关的信息,或者说这个信息准不准都没关系,我们只要统计收集到用户的常规的这些行为就可以了,我们这里用到的是评分,你即使没有评分,我用点击,用收藏,用购买,只要我买了点,把这个数据统计到是不是就可以做啊?诶,所以item CF应用非常的广泛。这是这一部分内容。
22:01
那最后我们要实现的,其实就是前面讲到的所有的一个混合,所有的东西都揉在一起,大家做一个举一反三,做一个整体的综合,我们现在要融会贯通,把所有的结合在一起,这就是一个分区混合了。在页面上用不同的位置显示出来,那我们这里面就有基于模型的推荐,有基于协同过滤的推荐,还有基于内容的推荐,也有基于统计的推荐啊里边应用的思路和这个分类方式是很多很多的。这就是我们整个这个项目的设计的一个介绍。
我来说两句