00:00
这里其实大家看到就我们就不是了啊,这里要真正来做这个核算法,核心内容核心部分,呃,我们要用什么呢?T fidf,从内容信息里边提取电影特征向量对不对,那当然这个最后我们拿到的特征肯定是最后一步了,那一开始怎么做呢?大家看一下这个过程啊。哎,首先我们定义一个tonizer,大家看这是个什么东西呢?这是一个分词器对吧?好,我们首先大家看是不是在Spark ML feature里边feature特征对不对,来特征提取,特征处理,在在这一部分啊,在这里边有一个东西叫做tonizer,所以我把它引入。呃,这个实例化创建一个一个分词器,默认按照空格分词对不对,Tonizer,然后大家会看到我还需要定义什么,什么东西呢?它可以有一些方法,我可以去set一些东西,这相当于这个分词器里边的一些属性对不对?大家看到很重要的就是可以set input column和output column,这是什么意思呢?因为前面我们给大家提到就是这个,呃,这里这个tor它的操作对象都是data frame对不对?所以它指定的是说你根据data frame里边的。
01:43
哪一列去做处理对不对?所以input column是不是就是我们要输入的那一列啊,那大家想一下,这里边大家看这个值应该是个string,是不是就是列名啊,我们要处理哪一列?对,是不是runs,然后还应该有一个output column,这相当于它自己会给我们输出一列对不对?那这个我们就自己来定义吧,比方说这个我们叫叫words吧,就是我们的关键词对不对,相当于提取出来的啊,一般情况就这么叫了啊,所以大家可以看一下这个东西怎么用啊,接下来就是用分磁器对原始数据做转换。
02:27
呃,最后生成新的一列是不是was啊,我们前面定义出来output column对不对啊,所以大家看一看这个生成的是一个什么东西啊。Words,我们把这个叫成words data吧,Words data我们调用的就是tokenizer,下边有一个叫transfer的一个方法。大家会看到它里边传入的是不是一个data set啊,我们的data frame是不是可以直接传进去data set row对不对?所以这里边我们要传的就是movie t df,把它直接传进来就可以,大家可以可能会觉得有点奇怪啊,就是整个这个过程,这做的事情到底是什么呢?那我们先来看一下吧,要不然我们这个还是糊里糊涂的对不对,大家知道这个this frame是不是可以直接售出来啊,好,那我这里边。
03:28
给大家直接跑一下看看,诶后面应该没错吧,哦,这个定义出来没问题对吧,后面都住掉应该是跑起来没问题啊。还是给大家简单的说了一下,我们这个ML和这个ML lab啊,这里我们的内容应该已经输出了啊,大家看这个输出的话啊,在这儿啊,也还没有太远。大家看一眼输出的是什么东西?是不是我们本来是mid name runs,是不是三列啊,现在是不是就多了一列,有一个output,对不对,Output column,那么大家看这个output是什么东西呢?
04:11
诶,我们前面看到啊,一个mid,它有一个name,它的runs类别,假如是一个drama的话,大家看这里输出出来是不是就是一个叫drama的一个一个词啊,而且大家看输出的这是不是是不是相当于是个列表啊。哎,大家看是个数组对吧,每一个词是不是就是前面我们按照空格分割开的每一个词啊,每个元素就是前面的每一个词对不对啊,所以其实就是这么简单的一个处理啊,那大家会想到接下来我们要做什么?是不是就是把这个数组里边出现的词,这就相当于我们在Python里边是不是把那个那个磁带模型拿到了呀,Bow拿到了对不对?呃,然后我们是不是要对它做这个词数统计,然后频率统计对不对,然后ID是是要统计它在所有的文档里边出现的频率啊,对吧,大家可以看到这相当于一条,是不是相当于一个文档啊,这这跟我们之前的内容就一样了啊好,接下来我们继续看。
05:16
呃,这里边瘦完了之后,我们就还是给它放在后面啊,然后接下来。我们既然已经拿到了这个基本分词,原始的这个结果,接下来是不是就要统计它的,相当于统计TF了呀,统计TF的时候,我们要引入一个叫做引入。一个叫做huing TF的一个工具啊,那么它是可以做什么事情呢?它可以把。一个词语序列转化成对应的瓷瓶啊,那么大家可以想到这是不是就可以作为我们的那个初始特征传进去,对吧?大家想到这个,我们一开始想到如果要做这个呃,就是离散化处理一个我们的这个呃类型变量的话,其实也最后做的事情是不是也就是统计了一个磁平啊,相当于大家想到每一个离散化化之后,要不是零,要不是一,在我们这这个问题里边所有只出现一次,是不是相当于就是一个词频统计啊,所以其实跟这个做法是一样的,相当于就是做了一个呃TF的计算对不对?那这里大家看引入的是一个叫做哈ing TF的工具。
06:42
大家会想到是不是你有一个haring TF啊,大家已经看到了,对吧?这是不是大家看这个东西我们要引入哪个呢?我们也统一来做,大家会想到这两个有什么区别对吧?ML lab和ML里边MLB是不是它应该基于RDD去做计算啊,抽象层级会低一些,然后我们这个ML里边的应该会基于data frame做计算,我们这里面都是data frame,所以统一ML对吧?呃,哈,TF,然后这里大家看一下它也可以,它的操作是不是类似啊,大家看是不是也可以set input column跟上面一样啊,那这里的include column我们应该基于什么去做计算了?对,是不是刚才的words啊,然后还应该有一个outset output column对不对?这个我们就叫它,呃。
07:38
这个词频我们就叫初始的特征吧,Roll features,然后另外这里还有一个很重要的需要set的东西,叫做number features,这是什么意思呢?就是说你分开的这个特征本身的维度有多少,对不对?Number features,那这是什么含义呢?这也就是说在做这个分词统计TF的时候,它是哈in TF是不是要做一个哈希计算啊?那这里表示的这个特征值对应的其实就是做哈希的分桶的数量,那什么叫哈希分桶的数量呢?就是说大家知道做哈希计算,如果说你给最后出来哈希的结果,那个分桶数比较少的话,是不是有可能出现哈希碰撞啊?就是说哎,我们这一类,假如说一共我们的类型本身那个维度特别的多,分出来的词特别的多,有比方说有1000个。
08:38
呃,那大家想到我们最后的特征可能只想提取100个对吧,那是不是有一些做哈希之后就应该会哈希到同一个类里面去啊,啊,这是不是相当于就出现哈希碰撞了,所以我们这里边可以根据我们预知的它的这个本身的特征的类别,然后给它预设一个值啊,它这里默认的这个值,如果我们什么都不给的话,默认的值是比较大的,呃,应该是二的18次方,就是22262144啊,就是26万多这样的一个分头,那我们这里好像不需要那么多特征对不对,因为大家已经知道了,这里边我们已知的特征是不是就是那些呃类型啊,那我们这里定义一个,定义一个50基本上也就足够了,大家如果要是想把它调小的话,也可以调小,想调大也可以调大,自己看看结果就可以,那引入这个东西之后怎么样去做处理呢?呃,那大家就会想到我这里边定义一个。
09:38
Feature right的data做了特征化处理之后的data,它就直接用huing TF,它又会有一个transform方法,对不对啊,大家看它的这个处理方式都是这样的,就是words,把words data再处理进来就可以了,所以大家可以想到在这个过程我为了给大家方便演示,是不是是挨个定义出来,然后一步一步去做的处理,如果我们提前把这些工具都定义好,是不是我直接一串那个流式处理就可以把它直接串起来啊,大家可以想象的出来对不对,我这里边没有用这种方法,大家可以自己去把它做一个实现,就是我只要定义出分子器,定义出huing TF工具,接下来我是不是直接可以tokenizer.transfer,然后再点,呃,就是大家可以想到,我可以继续把这个得到的沃塔继续可以去用哈ing TF去做transfer对不对,放到这个里边来啊,做一个这样。
10:38
啊,连续的调用,当然我们这样分开的话,看的会更清晰一些,这里我们就不看这个words data了,我们去用一个visualize data再给大家看一眼吧。看一眼这个,我们看到输出的结果是个什么东西呢?来看是这样子,这是个什么东西啊,这个看起来好像很很特别,对不对?大家看前边有个50,然后下边的好像所有的这个这个值都是50,这代表什么?
11:14
是不是就是我们这里定义好的这个特征的维度啊,也就是这个哈希哈希分桶的数量对不对,我们现在是不是就相当于有50个特征啊。然后那后边这个27是什么意思呢?哎,这个就不一样了,对吧,二十七二十六四十四十六,这是一个,大家看这是一个数组对吧,这什么意思啊。然后后边又有一个数组,这里是1.0,大家看下面,诶,下面这里也是1.0对不对,这里大家看有些看不太清楚,我们可以可以做个什么什么处理呢?啊,大家会想到这里我们是不是可以去把它做一个,呃,Tnket等于false,大家知道这个参数吧,这是不是表示不要去压缩啊,对吧,这个结果不要去压缩,我们再重新去让一下看看啊。
12:07
看一下结果,诶大家看这是我们拿到的这个结果。他长这个样子,这什么意思啊?大家看前面有一个,如果words是一个drama的话,呃,一个戏剧对吧,它的数据是50,然后有一个列表里边是27,然后里边是1.0,那我们就再找这个27还在哪里出现,对吧?诶,大家看这里又出现了,又出现了,这里它给的只是drama horror saller,呃,Riller,大家看到这是不是就表示这里边也有drama这个词啊,那是不是27大家会想到,哎,这是不是代表50个特征里边第27个特征是不是就叫drama?大家想是不是这样的一个划分,我们把这个平铺展开之后,整个的特征是不是从一个维维度,我们的这个runrous这一个维度是不是就展成了50个维度啊,这50个维度分别叫什么呢?大家看诶,是不是就是每一个具体的类型就是一个维度啊?当然我们指定了50个特征,是不是有一些地方应该是空的没有对吧?或者如果我们指定的比较明确的话,大家会想到,呃,就是每一个电影它对应的这一个词可能只是某一个类型或者某几个类型对不对?所以得到的这一个,它的这个特征向量,大家会想到是不是应该是一个稀疏的状态啊,大家会想到应该就是某一个或者某几个是一别的,是不是都是零。
13:45
如果我们把它展开,大家会想到是不是应该是50个数字的这样的一个向量,一个一个数组,对不对,只有第27个是一,别的是不是都是零啊?那大家想这是不是一个什么样的表达?
14:01
这有点像稀疏矩阵对不对啊,那当然这里不是矩阵,这是稀疏向量对不对,这就是稀疏向量的表达式,表达形式,那这里也是在呃,SKY里边本呃就是ML lab里边定义出来的这个稀疏向量的数据结构,它怎么表达呢?有三个元素,就是三三,相当于是一个三元组,对吧?第一个参数表示。本身这个向量的长度就是你一共到底有多少个维度对不对?第一个元素,第二个元素是一个数组,是一个列表,表示真正有,既然是稀疏嘛,那就是少数的有值,别的都是零对不对?第二个元素表示有值的那些位置,也就是那些索引值对不对?诶这里是27,所以是第27个位置,这里有值,然后第三个是不是就是你有值到底是什么值,对不对?那大家看到就是第27个它的取值是1.0,那别的地方是什么呢?对,都是零,所以大家看到这其实就是这个系数向量的一个表达啊,那同样我们看一下下面这个值比较多的啊,这个我们有三个类型的,这个它得到的这个系数向量是什么呢?
15:19
哎,是不是也是对应的,它这个分类,它对应到的是第26个特征维度,27个和36个特征维度,这三个位置都是1.0,别的是不是都是零啊?哎,那大想到这是不是提取出来就是一个特征向量啊,其实已经有这个特征向量之后,是不是我们已经可以算它的相似度了呀。
我来说两句