00:00
接下来是基于引语翼模型的离线推荐,对吧,我们就直直接把它叫做离线推荐模块了,那么这里边的核心我们就是用as算法训练英语一模型对吧?得到的训练出来的模型之后,我们是不是就可以把两个特征矩阵,用户特征矩阵和电影特征矩阵乘回去,得到一个预测评分,根据预测评分它的大小是不是就可以得到用户的推荐矩阵啊,用户的推荐列表构成的一个矩阵对不对?所有用户的推荐列表构成一个矩阵啊,这就是我们离线推荐要的内容,当然了,最后还有一个副产品,前面跟大家讲过,就是为了后边实时做推荐的时候,我们是不是想要拿到电影之间的相似度。所以在这里我们已经拿到了电影的特征矩阵,每个电影的特征向量都已已知了,那我们是不是可以根据这个特征向量求出它的相似度啊啊,所以这就是我们离线这一部分要做的内容啊,当然在整个的项目架构里边,它就是这一小部分。
01:08
好,那么接下来大家看一眼这个as这一部分怎么去做,其实大家看非常简单啊,As其实我们如果要去想要去做这个模型训练的话,核心就一好,大家看就这里对吧,呃,这个写成skyla代码,呃,这个哇一个model model等于als点。As是不是就是从ML lab里边引入的东西啊,对吧?MLLA里边有的东西,然后我们引入这个,呃,这个类类库之后,它有一个方法叫吹啊,直接传入参数把它串出来就可以了,一行搞定,所以大家看之前我们讲算法的时候讲了那么久,大家感觉那么复杂,对吧,实际在做操作的时候就一行代码。
02:02
当然了,大家会想到这一行代码里边我们要什么东西呢?大家看这里边的东西是不是就是我们当时今天上午上上两节课的时候,刚刚给大家用Python实现过,对不对,是不是就是我们传入的那个参数啊,第一个是不是就是data,哎,这里是train data对吧?然后后边是rank rank是什么?大家注意,Rank就是我们的那个K,就是特征向量的维度,对,就是隐藏隐藏特征向量的维度对吧,然后下边是inter。从名称大家看这是什么,迭代次数对不对,然后下面还有一个拉姆达,拉姆达是什么?对拉姆达,这是我们的那个。就是正则化系数对不对,正则化参数,诶,所以大家会想到这里面好像少了一个参数,少了一个什么呢。
03:00
我们当时好像还有一个阿尔法对吧?阿尔法是什么?阿尔法是对梯度下降算法里面的不长对不对,这里我们其实用的就不是梯度下降了,对吧?我们是不是as交交替最小R乘是直接精确要计算出来的呀?哎,所以这里是不是就少了一个参数,少了一个阿尔法啊,所以大家看到呃,就是这样的一个参数调用,那当然了,这个training data,这个data怎么得到呢?这里边我们可能要做几个几步操作啊,基本的数据是不是就是评分数据啊,从我们的那个评分表里边read出来,Read出来可以先把它转成一个data set,然后我们自己可以定义一个movie rating这样的一个样例类,对不对?我们把它转成自己想要的这个数据结构,然后大家注意,要把它转成一个叫做rating的数据结构。这个RA是个什么数据结构呢?这是ML lab里边定义出来的一个数据结构,它就是这样的一个三元组,U ID mid score,就是一个用户,一个物品,然后一个评分啊,必须得是这样的一个结构。
04:13
这是不是就是as算法第一个这个数据要求的数据结构啊,啊,所以必须转成这样的一个RDD,所以转成这样之后直接传进去直接搞定。啊,所以大家看到,呃,就是前面理解的时候比较复杂,但是理解了之后实践还是很简单的,对吧,那当然了,后面还有几个参数,这几个参数怎么样去获取呢。那大家可能会想到我们一开始实现的话,那就直接拍脑袋给一个就完事儿,对吧?呃,自己就像我们在这个pthon程序里边,拍脑袋给一个就可以了,但是在我们实际项目里边,是不是我们应该做参数调整啊,这个参数调整是不是要做交叉验证,那我们交叉验证的时候是不是得放到划分训练集测试集,放到测试集上面去做测试,对不对?那我们用什么指标去衡量它呢?诶这是不是就想到了在我们推荐里边,这既然是一个评分预测评分,它是不是可以用。
05:16
对军方跟误差RMSE来做一个衡量啊啊,大家回忆一下啊,军方跟误差怎么算来着,是不是每一个实际值和每一个预测值求差,求误差,然后求平方和,然后求平均数,最后再开根号啊。均方根误差对吧?那就这样的一个计算公式,这个东西越小是不是就代表我们这一参数越好啊,所以我们到时候可能给一组参数,我们选一个对方跟误差最小的参数作为我们的一个经验参数,对吧?啊,这就是这个过程,当然了,模型的参数选择评估的过程,我们提到你后边如果我们要做推荐出来一个列表的话。
06:00
是不是如果是一个推荐出来是一个列表top n推top n推荐的话,那是不是其实是一个相当于是一个分类问题了。那他的评估的时候。是不是就得用到精确率召回率相关的一些参数啊,啊,当然我们这个项目里边没有涉及,因为我们要想去评价精确率、召回率,是不是还得收集用户反馈数据啊,这个就比较复杂了,所以我们这里边没有设计,但是大家要知道对吧?推荐系统最后你推荐出来的列表要去评价的话,那还得用到这些,好,那接下来呃,这给大家算一下,我们前面这是拿到了这个训练的模型对不对?模型出来了之后,你还没有拿到推荐列表的呀,那怎么样得到用户的推荐列表呢?大家就会想到我们是不是先要做一个预测评分啊,预测评分怎么算,其实也很简单,大家看就这一行代码,Model前面不是算出来了吗?model.predict但是这个predict传什么参数呢?这个参数有讲究。
07:09
参数必须得传一个,大家看必须得传一个u ID mid元组类型的RDD。那大家就会想到这是不是就是每一个用户对应每一个电影,它要有一个空矩阵传进去啊。哎,所以是这样的一个过程,那这个空矩阵我们怎么算呢?呃,这里边有一个想法,就是直接用每一个user和每一个I movie做一个笛卡耳机,笛卡耳机大家之前呃接触过是吧?对,它是不是相当于怎么样两个集合drawing啊,而且这个drawing是相当于一对一对吧,Alter drawing对不对,所以它是一个一个就是全外连接对吧?所以大家可以想到我们这里做一个这样的是不是就把它完整的这个空矩阵得到了,然后把它传进去,就可以做一个预测评分,得到的预测评分我们是不是可以group by key啊呃,就是对应的这个UID选出来对不对,把它所有的预测出来的电影的评分都都group by,做一个这个聚合,然后是不是就得到了一个评分的列表,那么这个列表里边我们再去做一个呃排序,然后再选取里边的前多少个是。
08:28
不是就得到我们最后想要的这个用户推荐列表啊,所以我们得到最后的一个用户推荐列表是一个什么形式呢?可能就是这样的一个RDD对吧,里边的格式是一个UID,一个用户对应一个列表,一个sequence对吧?那里边每sequence里边它的元素是什么呢?每一个又是一个电影对应一个评分,一个电影对应一个评分,这是不是就是它的。电影推荐列表啊,对应的评分也在里边对吧?好,这就是我们最后得到这个结果,写入写回到mango里面去啊,这是离线推荐的结果。
09:11
前面我们讲了,除了这个结果之外,是不是还有一个副产品,副产品是要算,哎,对所有电影之间的相似度,那大家会想到算相似度根据什么去算?根据什么算电影的相似度呢?诶之前有同学想到这个,我们可以根据它那个类别去算相似度,类别信息去去算,去算那个相似度,对吧,把类别信息当成它的一个特征,提取出特征,但那个我们是不是就相当于是基于。基于内容去做推荐了,对吧,那大家会想到现在我们是基于行为数据还是基于这个评分数据的,对不对,那基于评分数据怎么拿到电影的特征呢。
10:00
基于内容,大家想到从标签里面,就从我们这个分类信息里边拿到的,要先提取它特征,然后找相似度对不对?那大家会想到我们这里边,如果要是能从它的这个评分数据里边提取出电影的特征的话,是不是也可以算它的相似度啊?电影的特征向量怎么算?大家想想我们之前这个盈余模型,它得到的模型是分解出来的,是什么东西?这个model训练完成之后,是不是就可以得到一个P一个Q啊,那P和Q是什么?是不是就是一个用户特征矩阵,一个电影特征矩阵啊,那是不是特电影特征矩阵训练完成之后就已经得到了,哎,所以呢,我们是不是直接从得到那个Q里面拿出来就可以算相似度了呀?哎,所以这就是基本的一个思路,好,那么大家看一眼啊,那对于我们的这个算法而言,大家看很简单,也是调这个方法model.product features啊,这就是model里边定义好的一个属性,对不对?Product features代表什么?是不是代表商品的特征啊。
11:20
所以就是我们model已经训练好了之后,大家会想到是不是应该有一个user features,还有一个product features啊,我们要的是product features,这个代表电影特征对不对?那得到这个电影特征之后,我们要算它的相似度,那是不是要把两两的相似度都都做一个计算啊,那大家会想到这跟前面有类似的地方,就是说我们是不是要把每一个电影跟每一个电影都做一个匹配,好像是做一个全外连接对不对?所以我们是不是还可以把它算一个笛卡耳机啊,那得到的这个结果就相当于是每一个电影和每一个电影对应上,哎,作为一个元素对不对?那这两个电影它的向量向向量特征向量都已经知道了,我们是不是可以根据。
12:11
对,是不是可以求一个余弦相似度啊,对,A和B的向量都已经知道了,求点击除以它的模长的乘积是不是就是它的余弦值啊?夹角余弦值对不对?这个余弦值是不是就可以作为它的相似度存储起来啊?哎,这就是我们整体的一个思路,那大家想到为什么我们这里不算那个欧式距离,要算这个余弦相似度呢?前面我们就已经留下了这个问题,对不对?大家会想到我们现在用到的是评分数据,对吧,基于的是评分数据,那用户给电影的评分,他有可能出现一个什么状况呢?大家想一想。
13:00
大家可以想到就是用户对电影的评分,是不是有可能每一个用户给电影评分的时候,有可能并不是说这两个电影本身差别比较大,而是因为诶我这个用户评价就比较苛刻,我给所有电影评分都比较低,我给出来的三分相当于就是一个非趁的好评了,大部分可能都是一分两分。那另外一个用户呢,他就比较宽松,大部分电影都能够得到三分,然后他的好评就是五分,对不对,那大家可以想到,如果两个电影一个用户前一个电影,前一个用户给他的评分是三分,后一个用户给他评分是五分。那大家会想到,这两个评分是不是差距其实没有我们想象的那么大?那同样一个用户如果给一两个电影的评分,一个是一,一个是三,那另外一个用户给这两个电影的评分,一个是三,一个是五,那这两个向量其实是不是差别不大啊,那大家会想到这两个向量如果说表达在我们的坐标空间里边,这就代表什么呢?对,是不是它本身的那个值可能差别比较大,大家想1335对吧,本身的那个值可能差别很大,但是其实。
14:25
他是不是都应该在一个方向上啊,对吧,只不过就是诶这个用户他在这个方向上给的那个值比较小,另外一个用户是不是在这个方向上走的更远一点啊,那大家会想到怎么样表达他们之间方向的这个差距呢?是不是用夹角更好来表达啊,所以我们就用了一个夹角的余弦值。那为什么用余弦值呢?向量就啊是向量有点求啊啊对,因为向量是不是就是这么求的啊,对,就是大家会想到向量,两个向量做点积,它的那个公式里边是不是就直接是用,就是它俩的模长乘积乘以这个余弦算出来的呀,所以我们算点击是不是比较好算。
15:16
那反过来是不是求余弦比较好好求啊,啊,所以这就是我们这样的一个一个一个想法对吧?好,那接下来我们要做的这个计算,其实就是呃,计算这样的一个余弦相似度,然后把它保存到我们的这个列表里边,啊,这就是这样的一个过程,好,那接下来大家会看到整体的流程,是不是算出来的内容,一部分是要存到这个mango里边来,这是我们的那个评分矩阵对不对?另外一部分如果说实时推荐系统要从red里边缓存里边拿的话,那我们还要把它存到red里边,对吧?啊,当然了,这一部分如果我们对速度要求不那么高的话,把它全部存到mongo里边也是可以的啊,我们实际应用的时候就不那么复杂了,就直接把它放在mon mango里边就好了,接下来还有最后一部分就是啊,不是最后一部分啊,就是另外一部分重要内容就是实时推荐。
16:16
模块,那首先我们来看一下,呃,实时推荐模块是我们整个项目架构里边的这一小块,首先我们来看一下它的这个架构,我们主要出于什么样的考虑,大家会想到既然是实时推荐,那是不是要求就是速度要快啊?基于这样的一个要求,那大家会想到我是不是你需要速度快,那是不是计算的结果就应该不需要那么精确啊,你既要速度快,还要特别精确啊,这个就要求太高了对不对?你如果这两个都能达到,那我们根本就不需要离线推荐了,你这个推荐什么都什么都好,什么都能做到了,对吧?所以我们的想法是速度要快,结果可以不特别精确,那我们是不是就可以提前把相似度按,按照前面我们提前把相似度算好对不对,不需要实时去更新,然后我们还要有一个预先设计好的模型啊,根据这个模型,也就是相当于我们预定的规则对不对?根据这个规则,然后又有了现成的相似度,然后我们直接一算就把它算出来了,这样是不是就很快,诶,这就是我们基本的一个想法。
17:32
而且我们会想到这里要做的计算就应该只是针对当前这个用户这次评分相关的一些计算对不对,你不要计算所有的,那肯定就计算量很大了,所以我们的整体流程其实就是来的数据是不是就是一个用用户评分数据啊啊,评分数据是不是就这这四项收集到日志里边来,那肯定还是先要过这个,然后卡夫卡对不对?呃,最后是不是输入到这个实时推荐算法来啊,那我们的SPA streaming实时推荐算法这里其实还是要用到red里边的数据的,最后的结果是不是写回到mango里面去啊啊,这就是整体的一个架构,那么具体我们怎么样去做这个实时推荐它的这个模型去做定义呢?啊,大家这里边先把这个给大家列出来啊,大家先想一下,如果让你去设计这个模型,你怎么设计?
18:31
这看起来很复杂是不是?我们先把它简化一下,我们已经拿到的数据是什么呢?我们先梳理一下这个思路,已经拿到的数据是,诶当前有一个评分数据,对吧?诶用户刚给一个电影做了一个评分,然后我们是不是已经拿到了所有的相似度矩阵啊,也就是说这个电影跟它相似的电影是不是都能拿出来,那大家可以想到我基本的一个想法,那么就是就是相当于是item CF对吧?我跟这个你既然看了这个电影,对这个电影感兴趣,我把跟这个电影相似的全选出来推荐给你,那不就完事吗?
19:18
大家觉得这个推荐会有什么问题吗?可能有问题,会有什么问题呢?这种推荐的问题在于,我看了一部电影,确实代表对这个电影还是感兴趣的,对吧,但是我对它是有评分的呀,我如果给他了一个好评,一个五星好评,那这部电影很赞,我对他又感兴趣,而且又有好评,你把跟他相类似的推荐出来,这个没毛病,假如说我给他了一个一星差评呢,我尽管对他诶有点兴趣看了,但是最后是一个差评,你真的,你真的确定要给我推荐跟他非常类似的东西吗?
20:08
所以大家会想到,在这种问题里边,是不是我们还应该综合把这个评分也考量进去啊,因为评分其实本身是一个很特殊的行为数据,它代表什么呢?本身评分是不是代表用户的一些兴趣,你对它不感兴趣,你不会看他,不会买它,对吧,不会对他有评分,它本身是代表一定兴趣的,但是本身评分的高低,它是更加强烈的表达了用户的一个偏好,对不对?它代表了用户到底喜不喜欢这个东西,所以这两部分内容其实我们是要综合考虑的,而且更重要的,其实我们应该把这个评分综合考虑进去,对不对?大家就会想到了,那我怎么样把这个评分综合考虑进去呢?
21:00
大家就会想到,那我是不是应该把评分跟相似度做一个加权啊,是不是应该有一个权重值啊,你跟一个电影,比方说我们拿到了跟他非常类似的一个电影,对吧。如果说本身这个电影评分很低的话,那是不是你跟他很接近,但这个接近其实用处不那么大,对不对啊,如果是我是一分差评的话,你即使跟他很接近,我对你的推荐力度也没有那么大,那大家可能就会想到,那你到底对什么样的推荐力度大呢?那当然就是得有好评的电影才行,对不对?所以我们现在就要综合考虑,是不是就不能只考虑一次评分了,诶,我们可能要综合考虑最近的K4评分。这样是不是就可以避免我这里边只有一次评分,如果是差评的话,那其实推荐出来是不是值得推荐的东西很少啊,哎,所以我综合考虑最近的case评分,我把它们都拿出来做一个加权计算,如果要是高分电影,那对应的那个相似的电影应该权重大对不对?差评低分的电影对应的权重小,那得到了最后最后加权求和的那个结果,就是我得到的一个推荐优先级对不对啊,这是我们的一个综合的考量。
22:29
好,那大家看一下我最后的这个过程是怎么样做的呢?我我是要先获得一组备选电影,备选电影从哪里选,就从我们相似的电影去拿,相似的电影也有用,对吧?那我们既然你看了这部电影评分了,是不是代表对对这这个电影相关的东西感兴趣啊,哎,所以我们直接拿出来电影作为备选电影放在这里,那具体怎么来做呢?把每一个备选电影单独去做计算,算一个推荐优先级。
23:04
那比方说现在我们对这个X,这是一个备选电影,是不是要算一个推荐优先级啊,那它的推荐优先级怎么算呢?是不是综合考量最近的K4评分跟K评分过的这些电影,一个一个跟X去做一个相似度的评价,对不对?算它的相似度,那么跟它相似度,最后再用它的评分做一个加权,最后求和,是不是就代表我最后对X的一个推荐程度啊?大家想这到底是一个什么思维,是不是就是说我这里有一组已经评分过的电影,你现在他是备选对不对?我对他到底推荐力度有多强呢?好,你挨个跟我已经评分过的电影来算一下吧,到底有多相似对不对?如果跟他你很你跟他很相似,而且这个评分又很高,那是不是这个得分就很高啊,所以这两项一成得分就高对不对?所以大家看这里边我们的公式,是不是要把它的相似度和这个评分当前当前这个。
24:19
苹果分的这个电影的评分要做一个成绩啊,如果你跟他的相似度很高,但是评分很低的话,那是不是最后的成绩也会比较低啊,所以这个就没什么用对不对?诶,所以我要选择的其实就是说你跟高分电影相似度很高的那个电影对不对?他最后的推荐力度就会很高,所以我们把最后的这个加权做一个求和。最后我们再除以s sum,这是什么?这就是所有的这个个数对不对?相当于求了一个加权平均数对吧?我们把前面这一项作为推荐优先级计算的一个基本项,这就是我们核心的这个推荐优先级,除了这个推荐优先级之外,后面我们还加两项,加什么呢?
25:09
哎,相当于这一项是对。大家看啊,这相当于是一个一个增加项,一个奖励项,对吧,后面是减是一个减小的一个惩罚项,对什么做奖励,对什么做惩罚呢?大家可能会想到,假如说我这一波评分全是一分差评。那是不是我这一次算出来这个推推荐优先级综合来看的话,就应该整体都应该降低啊,对吧?因为你都是差评,那你这个推荐出来效果其实肯定不会太好,所以大家会想到我这里同样反过来,如果我都是好评的话,是不是这一次推荐力度应该整体增强啊,所以我这里其实这个count表示的是所有最近K4评分里边高分的个数,我们自己可以定义什么叫高分对吧?比方说大于三的叫高分对不对啊,那如果小于三的是不是就是低分,应该做一个衰减啊,做一个惩罚对不对,那前面加一个log,这是表示这个衰减程度,你不要不要那么剧烈对吧?前面我这个好不容易算出来一个推荐优先级就就几分,你后边这个评价的个数一多,你直接24,评分直接加了20,呃,这个显然不好,对不对,我们所以我们做一个log的衰减,你即使无限增。
26:31
那它最后也是有一个上限的,对吧?好,那么大家看一下最后算计算的公式,计算怎么样算呢?比方说这个X的。推荐优先级,推荐推荐度,推荐评分怎么算?就是让他跟所有已经评分过的数据。依次算相似度,跟A算一个相似度叫SAX,然后乘以A的平分五啊,这就是上面这个乘积对不对,然后是不是对B也要这么算一下呀,对C也算一下对不对?算完了之后除以个数除以三做了一个加权平均啊,当然这里我们没有算D,大家想把D算一遍也可以,对不对,因为D跟他的关联,是不是在选备选电影的时候都已经选出来了呀。
27:19
备选电影是不是都是跟D相关的呀?啊,当然大家如果想把这个评分也加进来的话,也是一样的,就是多多一项就好,然后后边增加项是不是要看高分项啊,高分项是不是四和五两项,所以加上LOG2,然后减去LOG11项对不对?这里边高分项是不是要跟它防止是零,是不是求一个跟它跟一的max啊啊,所以就是这样的一个值。这就是我们,呃,就是实时推荐这一部分的一个计算,那最后怎么样得到它的推荐列表呢?其实也很简单,我们首先拿到的是不是从这个相似度矩阵里边拿到我们的候选电影,然后从这个red里边应该有最近的K4评分,对不对,这应该是提前写好的,拿到这个评最近的case评分,接下来我们要做的就是对每一个候选电影是不是要算它的一个推荐评分啊,怎么算,那就是每。
28:18
候选电影拿出来跟最近K4评分的每一个电影算一个相似度,然后是不是就可以算基础分数啊,做加权平均算出来它的基础分数,然后再加上你到底高分有几个评价,低分有几个评价,加两个这个偏移项,最后得到的结果是不是就是我当前候选电影的评分数啊,最后就可以得到一组评分,一个列表对吧?根据这个列表啊,当然这里大家可以想到我是不是还可以跟之前应该有实时推荐结果,如果已经有的话,是不是可以做一个加权的合并啊,根据高低再做一个合并对不对?那么这个合并完了之后得到的就是一个实时推荐的列表,对吧?啊,写到mango里面去就可以了啊,这就是实时推荐这一部分。
29:07
大家看一下啊,下来之后可能还得再好好梳理梳理,把这个过程先想清楚,接下来我们写代码的时候就会比较简单一些,好,那最后还有一部分部分就是基于内容推荐这一部分,呃,我们这里就简单说了,基于内容怎么推呢?其实很简单啊,大家会想到我们的数据最关键的是不是就是电影的标签啊,所以我们这里就基于标签来给咱大家做一个推荐就好了,那这个内容是不是就有点相类似,呃,我们讲过的这个item CF啊,对吧?当然大家也可以说根据我们前面的这个实时推荐,大家就是基于协同过滤得到的那个用五比电影特征矩阵,然后算出来的一个相似度推荐,那那个是不是就是item CF啊,所以大家如果认为前面的实时那一部分是item CF的话,那我们现在的这个基于内容推荐也是类似,那我们这个基于内容推荐怎么推呢?
30:08
啊,是不是基于这个电影标签做一个t fidf,算出它的那个特征向量之后,是不是就可以算相似度了,把相似度电影的相似度矩阵算出来之后,后边是不是还是直接放到实时推荐那个拈里边来,照样推出来就可以啊,这个方式是不是一样啊,大家想这个是不是过程是类似的啊?哎,所以我们这一部分就到时候给大家做一个简单的实现,只要算出相似度矩阵电影的相似度矩阵,那是不是后面的就跟我们前面实时推荐是一模一样的啊,只不过你就是定义出一个不同的表来,我们前面读相似度矩阵,从那个盈余模型那边算出来的离线矩阵来读,现在我们是是不是从基于内容这部分来读就可以了啊,后面就都是一样的了,所以这部分我们就是一个简单的介绍,呃,当然了,就是最后我们的实现是不是相当于是一个分区混合啊,不同的模块。
31:08
推荐出来的内容,我们在页面上不同的地方做一个实现啊,大家也可以想到,就是我们的页面上可能直接写的就是离线推荐,实时推荐,但大家在实际项目里面肯定不会这么去写,对不对,实际项目里边一定是有一定真实含义,让用户觉得可以理解,比较喜欢的这种这种呃实现,比方说像我们看到京东里边啊,它会有这个。呃,会会有各种一开始这个首页推荐对不对,然后会有这个秒杀,会有会买专辑,会有排行榜,会有发现好货,会逛这些,大家想到这是不是就会根据不同的内容做出不同的推荐啊啊,所以大家会看到我们点击东西都是之后,它的这个是就是变化其实是不一致的,有可能有一些内容变了,大家看这个电动车对不对,有一些内容就没变对吧?呃,所以在实实际的这个电商系统里边,它其实也是做了一个分区混合,只不过不像我们写的那么直白而已,好,这就是我们整个这一部分内容,但。
我来说两句