00:00
接下来还有最后一部分内容是基于物品的协同过滤,相似推荐。呃,大家就会想到,我们既然是在这个物品的页面当中,对于某一个物物品来说,会把它相似的物品拿出来做一个推荐,那这种相似的相似首先是一个维度的原则,另外一个维度我们还可以根据不同的数据源去做相似,相似推荐,一个是如果基于物品的信息的话,可以把它提取出来做相似推荐,另外还可以基于什么呢?啊,就是我们提到的可以基于行为数据做协同过滤,呃,那么基于物品的协同过滤,这就是之前提到的item CF,它有一个好处就是我不需要知道物品的详细信息,也不需要对物品的信息去做这个文本上的一些处理,对吧?做特征提取,我只需要收集用户的这些行为就可以了。
01:01
比方说评分的行为,比方说那这个就多了,对吧,点击行为,购买行为,收藏行为,这都是用户行为,我们把它收集起来之后,就可以考察两个商品之间的相似度,所以在实际应用当中啊,在很多这个电商企业,包括很多其他的网站里边,他的推荐基于item CF去做推荐的也是非常非常多的,非常非常重要的,大家可以看到就是这两部分,尽管我们放到后面来讲,但事实上在实际应用当中,这两部分其实是可以说是应用最广泛的两部分,一个是基于内容,一个是基于item CF,那大家想这个item CF具体怎么做呢?之前其实在讲这个整体架构的时候,已经给大家提出了一个思路,这个思路就是同线相似度啊,大家再回忆一下这个铜线相似度的公式怎么算的,这个其实也很简单,我们就是找到。
02:01
我们要考察两个商品之间的相似度,我们就找给这个商品做出评分的人,做出评分的用户,考察有哪些用户同时给这两个商品做了评分,或者说这个行为数据可以是同时点击,是不是都表示这个用户对它感兴趣啊,或者说同时购买,这也是对他同时感兴趣,我们可以把这个综合考虑起来。呃,然后分子就是同时对他有行为的用户,那么分母除以的就是他们俩各自有哪些用户。对他们做出了评分,对他们做出了购买点击的行为,所以整体来讲,他考察的就是什么呢?就是。如果一两个用户,如果一个用户对这两个物品都做出了评价,或者说都做出了点击购买的行为,我们就认为这两个物品的相似度更高,大家想这是不是就是item CF的那个思路,如果有很多个用户都同时对这两个物品有点击购买或者说喜欢评分的行为,我们就认为这两个物品相似度高啊,这就是基本的一个思路。好,那接下来我们就在代码里边对这个思路做一个具体的实现。
03:25
呃,啊,不应该是在业务系统了,我们在这个recommend下边还是去新建一个模块,子模块这部分我们就叫做item CF recommend。同样把它创建出来,然后我们会先考察它的po文件里边的依赖怎么样去选取,那大家首先想一想,这一部分我们应该怎么去写呢?我们还是对照之前的这个离线这一部分,考察一下它的泡沫文件里边有哪些依赖。
04:07
那大家想一下,当时我们考察了第一个g plus,这个是做什么的?是提取出特征向量来之后要转成对矩阵,然后方便。用那个线性代数库里边的那个算算余弦相似度对吧?啊,它的那个点击,然后算模长,那我们这里边需要算余弦相似度吗?不用,我们这里要自己定义同线相似度计算,那那是不是就不用这个东西了,哎,所以这一部分可以去掉,然后下面看Spark Co需要Spark需要。ML要不要?一项一项考察,诶,这个好像不需要不需要了,因为我们用到的算法是什么,是不是就是自己定义出来的这些,呃,这个同线相似度啊,那么在这里面我们就选取对于任意两个商品而言,其实就是得到对这两个商品评过分的人数,还有最关键的就是得到同时对他们俩做过评价的人数就可以了,那这是不是大家会想到我直接去写一些CQ,或者是把它查出来是不是就完事啊,统计出个数就完事,所以这里边我们并不需要MLLA,不需要用到复杂的机器学习算法。
05:27
啊,那后面的这个skyla library要么啊,这些肯定是需要的啊,Mono相关的东西要么啊,肯定是保留的,所以整体来看的话还是可以抄,只不过对要删两个。呃,先copy过来,这里边ML lab就可以删掉了。上边还有一个g plus可以删掉,这就是item CF用到的一些依赖。好,呃,那接下来我们就在这个目录里边同样的一些流程。
06:06
把这个文件日志文件先copy过来。然后去重命名一下SKY。接着新建一个。单例对象对吧,这个大家都已经非常的熟悉了,然后我们这里边这个名字就还是叫做艾特硅谷点,这个叫item cf.item CF recommend。好,我们把它创建出来。按照我们的套路,一开始还是去考察样例类,呃,那么这里面我们需要用到哪些样例类呢?大家想一下我我对于这个item CF而言需要的数据是什么?
07:01
哦,大家会想到这跟前面我们讲到的这个基于内容的推荐又不一样,基于内容推荐我们是不是只需要商品信息啊,这里边我们需要的是什么?Item CF是协同过滤,所以需要的是行为数据,对,对于我们这个项目而言,行为数据是不是就是评分数据啊,所以大家看,那它其实反过来是跟我们这个offline这一部分,是不是就是之前基于盈语义模型的这一部分比较接近了,所以我们可以直接把这部分拿过来,Reading拿过来就可以了,然后mon con也是需要的,同样下边是不是也需要定义一个product ras,最后我们把相似度算出来啊,呃,跟我们基于内容的那一部分就非常的接近,所以我可以把这些全copy过来。里边有一个可以不需要是不是用户的推荐列表,不需要,只要得到商品之间的相似度就可以了啊,所以我直接保留这几个样例类,然后接下来我们就进入到对象里边内部来,首先定义常量。
08:16
常量和表明。呃,我我们这个在做item CF的时候,既然是用到了RA,那肯定就是说rating表是不是得传进来啊啊,这个肯定是需要的啊啊,那另外大家会想到下边是不是也应该得有对应的这个product RA,或者甚至我想要去截取这个数量,都可以把这些都拿过来。先把它copy过来吧,我去做一个改变就可以了,Reading这个不用变,Users不需要删掉。那么这里的product re,同样我们需要去改一个表名,在业务系统里面定义的是item CF product Rex,所以我们这里还是把它改成对应的名字啊,Item CF。
09:06
Product re,呃,最后还有这个,这里定义的是用户最大的推荐数量,我们这里边也可以定义一个最大的推荐数量,就是我们可以去截取对不对?算了那个铜线相似度之后,可以按照它的前多少个去做截取啊,这里边取任意的数值都可以啊,我们就按一个十个来做就可以,接下来就是main函数入口。呃,那对应到这个。营运营模型这里边来同样的操作,前面是不是照抄对应的config,然后Spark session mango对应的这个参数都是一样的,先抄过来再说。把他引入。大家不要忘记把后边的这个APP name需要改一下啊,Item CF。
10:04
Spark session创建出来,这是我们前面的这些步骤,后边接下来就是对加载数据,呃,这里我们要加载的是评分数据对吧?呃,然后后续我们还是把它转换成data frame去做处理。呃,那这一部分其实大家就能够想到,过程跟之前都非常的类似啊,RA data frame就等于对Spark用这个read方法啊,那后边其实这个操作我们都能想到了啊,跟这里是不是一样啊,只不过这里是RDD,因为我们用。后边s.train的时候用的是mml lab里边的这个RDD的接口,所以我们这里边是转换的是RDD,那我们这里前面都一样,只不过是把它转换成了。
11:06
只不过是把它转换成了这个data frame对吧?诶这里边我直接可以去掉啊,直接用当前我们item CF里边定义好的这个量就可以了,那接下来做什么转换呢。大家会想到我这里边已经有了这些数据啊,已经拿到这些数据包括什么呢。哎,这是有user ID product ID score,然后还有time STEM,对吧,那我们最后用到的是不是并不需要这个时间戳啊,这个东西显然是不需要的,所以我们可以先做一个提取吧,Map一下。这个map就很简单,每一个元素我们提取出来的。
12:02
User ID。Product ID对吧?然后score把time STEM去掉就可以了,最后得到的在to data free,呃,这里面我们可以指定表名,因为前面这里已经是这个元组的形式了啊。呃,就是指定这个对应的列名,那么前面这里应该是user ID对product ID。Stop。呃,出于性能考虑,可以再加上这个catch缓存一下,好,然后已经加载进数据来之后,就应该是一个呃,将要做的这个核心算法了啊和核心算法。用铜线呃计算。
13:08
同线。相似。得到。商品的相似列表,那做完了之后,呃,这里边就是大家会想到我最后应该得到的还是一个相似的data frame,呃,假如说这里是一个nu啊,那得到这个data frame之后,接下来是不是就把它存到猫里面去就完事了呀,对吧,保存到。呃,那这里边保存到网购的这个过程,我们就直接照抄好了,这不就是直接一个write方法吗?对吧,我们直接把这个照抄过来,呃,当然这里边。应该是把CDF做一个right操作,后边注意我们应该写到哪张表里面去呢?前面定义好的叫item CF product re,对吧?这是这张表最后做一个C,最后写完了spark.stop就完成了我们的这个主体内容,呃,大家看这个过程其实还是很简单的,对吧?
我来说两句