基于Mahout 命令的电影聚类分析与实现
摘要:研究使用mahout命令进行电影聚类分析,介绍了聚类算法、分类算法及推荐过滤算法等。同时结合mahout的特点,分别呈现两种算法即K-means与Canopy+K-means的原理,并采用从电影网站中爬取的几十条数据对算法进行测试与实现,两种算法最终都直观地得出此聚类所代表的电影信息。
关键词:Mahout;聚类分析;大数据;电影
中图分类号:TP393文献标志码:A文章编号:1006-8228(2017)11-54-04
0引言
互联网娱乐在大数据浪潮中迎来了新的挑战,如何在各种网站海量的视频中找到感兴趣的内容就成了新的难题。中国电影产业正处于高速发展期,据中国电影产业《2017-2022年中国电影行业深度调研及投资前景预测报告》数据中显示:国产电影2016年我国共生产故事片772部,动画片49部,科教片67部,记录片32部,特种片24部,总计944部,超过前十年峰值,2016年国产电影放映率仅40%,相比美国100%上映率,资源严重浪费[1]。电影票房惨淡可能导致前期的巨大投入无法收回,因此电影人必须谨慎考虑每个因素对票房的影响,到底什么类型的电影才能卖得好?这是本文数据分析要解决的问题。电影网站上的数据非常庞大,抓取到的文本信息甚至需要以TB为单位来存储,所以在进行大数据量的代码实现之前,要先对小数据集进行测试,以验证算法的可行性。
1聚类概述
聚类顾名思义是将同一类事物或数据归到同一类型中,同一个类中的对象有很大的相似性,不同类之间的对象有很大的差异性。在机器学习中,要把大量的数据划分为不同的类型通常采用建模的方法。聚类是搜索类的无事先规则与分类的标准的学习过程。与分类不同,聚类是无规则的学习,不依赖预先定义的类或带类标记的实例,由聚类学习算法自动确定标记,而分类学习的实例或数据对象有类别标记[2]。聚类分析是一种探索性的分析,不同分析者对于同一组数据进行聚类分析,所得到的聚类数未必一致。
2应用背景
本文将从电影网站上爬取到的电影类型匹配到所建数据库中。利用数据清洗中的去重,将没有匹配到任何电影类型信息视为无用文本数据将其删除。最后保留电影名称,匹配到的类型,词与词之间用空格分开。然而这样的文本向量是无法在分布式文件系统上进行处理的,因此需要通过TF-IDF加权的方法,将词文本进行转换,得到可处理的数据向量。
TF-IDF是一种统计方法,即一个词语在在一篇文章中或一个文件集或一个语料库中出现次数越多,同时在所有文档中出现次数越少,越能够代表該文章。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF词频(termfrequency)是指某一个给定的词语在该文件中出现的次数[4]。词频公式如图1所示。
单纯使用TF还不足,需要进行权重的设计即:一个词语预测主题的能力越强则权重越大,反之权重越小。IDF逆向文件频率(inversedocumentfrequency)就是在完成这样的工作,某一特定词语的IDF,是由总的文件数目除以包含该词语之文件的数目,再将得到的值用log取对数得到。逆文档频率公式如图2所示。
在IDF中用一个语料库(corpus)来模拟语言的使用环境。如果一个词很常见,那么分母就越大,逆文档频率就越小越接近0。为避免分母为0用加1法即:所有文档都不包含该词。TF-IDF公式如图3所示。
从图3可得出,TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语言中的出现次数成反比,即提取关键词的算法为计算出文档的每个词的TF-IDF值,然后按降序排列,取排在最前面的几个词。
3Mahout算法
Mahout算法大致分为聚类、协同过滤和分类三种。聚类分析是当下科学研究中一个很活跃的领域,常用聚类算法有:canopy聚类,k均值算法(k-means),模糊k均值,层次聚类,LDA聚类等[3]。Mahout算法分析有以下几种:
3.1K-means聚类
在将电影类型向量转换为HDFS可处理的数据后,便可以进行基于文本词频与TF-IDF的k-means聚类。
K-means算法是基于划分的聚类方法,首先选择用户指定的参数个数K为初始质心,然后将事先输入的n个数据对象划分为k个聚类以便使所获得的聚类满足[5]:同一聚类中的对象相似度较高,而不同聚类中的对象相似度较低。聚类相似度是利用各聚类中对象的均值所获得一个“中心目标”来进行计算的。通常采用以下方法来实现:①与层次聚类结合;②稳定性方法;③系统演化方法。
K-means算法试图找到使平凡误差准则函数最小的簇,当潜在的簇形状是凸面的,簇与簇之间区别较明显,当簇的大小相近时,其聚类结果较理想。该算法时间复杂度为O(tKmn),与样本数量线性相关,所以,对于处理大数据集合,该算法效率高,且伸缩性较好。但该算法除了要事先确定簇数K和初始聚类中心外,经常以局部最优结束,同时对“噪声”和孤立点敏感[6],并且该方法不适用于发现非凸面形状的簇或大小差别很大的簇。
3.2Canopy算法
Canopy主要思想是把聚类分为两个阶段:第一阶段,通过使用一个简单、快捷的距离计算方法把数据分为可重叠的子集,称为“canopy”;第二阶段,通过使用一个精准、严密的距离计算方法来计算出现阶段中同一个canopy的所有数据向量的距离[7]。这种方式和聚类方式不同的地方在于使用了两种距离计算方式,同时因为只计算了重叠部分的数据向量,所以达到了减少计算量的目的。
Canopy算法的优势在于可以通过第一阶段的粗糙距离计算方法把数据划入不同的可重叠的子集中,然后只计算在同一个重叠子集中的样本数据向量来减少对于需要距离計算的样本数量。
4算法与实现
在影视网站上的数据十分庞大,本文从豆瓣网上收集了30条电影信息,其中10条是戏曲类型电影,10条是爱情类型电影,10条是动作类型电影,每一个电影信息都用一个txt文件保存,编码格式为UTF-8。由于已知这30个测试数据集应聚成三类,将可直接进行k-means算法的实现,也可以进行Canopy结合K-means的算法实现,下面分别呈现两种方法的代码与结果[8]。
4.1k-means实现
⑴环境准备
使用的Mahout版本为apache-mahout-distribution-
0.12.2,使用的Hadoop版本为hadoop-2.4.1。
将30个txt文件压缩后上传至远程虚拟机,解压至一个本地目录。如/tmp/movie/txt。使用Mahout命令将文本文件转换成SequenceFile,同时会将这么多小文本文件合并成一个Sequence,执行成功后,在本地的/tmp/movie/txt-seq目录下生成了chunk-0文件,该文件格式为SequenceFile,将文本文件转换成SequenceFile,Mahout提供了相应API。将转换好的SequenceFile上传至分布式文件系统上的/tmp/movie/txt-seq/目录中。
⑵解析SequenceFile,转换成向量表示
Mahout聚类算法使用向量空间(Vectors)作为数据,接下来在Hadoop上,使用之前生成的SequenceFile,转换成向量表示。
⑶运行K-Means
使用tf-vectors作为输入文件,即根据关键词出现的频率来进行聚类。
输出1,初始随机选择的中心点;
输出2,聚类过程、结果。
⑷查看聚类结果
由于Mahout的clusterdump命令只能在本地运行,因此需要将聚类结果从HDFS下载到本地,其运行命令如表1所示。
将文件下载到PC端本地并用notepad+查看dump出来的结果如表2所示。
可以看出,一共有三个TopTerms,即聚成了三类:第一个聚类,文本的形式是词=>词频,在每个聚类中,出现次数越高的词排名越靠前;第二个聚类,排名最高的词汇是“动作类型”词频为0.9,说明在K-means聚类下,该聚类收敛的效果非常好;第三个聚类,排名在第四位的是“戏曲类型”电影,说明该聚类是关于戏曲类型的,但是电影类型并不是词频为0.9,说明该聚类中还有其他电影的信息,而对比第一个聚类,发现第三个聚类中的确有一部分是重合的,说明聚类结果看似不理想,却完全符合现实情况[9]。在运行K-means时使用的是tf-vectors,即基于词频进行聚类,这是当已经提取了关键词后,每一个词都是重要的,不会存在高频无用词,若使用tfidf-vectors,即基于词频-逆向文件频率进行测试,运行命令/结果几乎相近。此处略。这说明TF-IDF相比TF加权方法,更能提取出文本的特征值,从而使聚类效果理想。
4.2Canopy+K-means实现
K-means算法是基于TF与TF-IDF加权方法的实现,Mahout的K-means算法提供了另一种选择,即如果提供了初始化聚类中心,随机从输入向量中生成K个点,采用canopy算法将能得到初始化聚类中心,并且mahout也有相应封装好的jar包,直接从命令行进行操作[10]。
⑴运行Canopy
使用tfidf-vectors进行测试,因为TF-IDF方法更为有效地生成了一个聚类结果,这个聚类结果将直接用作初始化聚类中心。
⑵运行K-Means
这里只采用tfidf-vectors作为输入向量,并且在-c后面用canopy聚类结果。运行命令如表3所示。
⑶查看聚类结果
用dump将聚类结果下来,下载到PC端使用Notepad++查看如表4所示。
以上数据显示Canopy+K-means算法起到很好的聚类结果,虽然关键词的排序以及权重与K-means的结果有细微不同,这正说明了两种方法过程的不同,但都收敛到了很好的聚类效果。
5结束语
本文阐述了K-means算法适合于已知聚类数的测试数据;Canopy+K-means在基于TF-IDF加权技术下适用于对未知聚类数的情况进行聚类。两个方法最后都能有效地将电影类型排序出聚类结果,可以直观地看出这一个聚类代表的是哪一种电影类型[11]。每一个聚类中,根据权重的排序也可以很直观地得到与该电影关联度最大的类型。这样的映射是来源于数以万计的大数据中电影信息的综合评估,是客观的,是符合大数据挖掘机器学习核心理念的。本文用的是测试数据的实现,由于实际应用中数据的复杂性,多样性,特别是对于多维数据和大型数据的情况下,参数会有变化。大量无关的属性使得在所有维中存在类的可能性几乎为零,同一部电影会出现许多不同的类型,会使电影类型的权重下降,导致无法在聚类结果中直观地看出这一类代表的是哪一类电影,因此需要人为地提高电影类型的权重,让电影类型在文本词向量中重复若干次,相当于提高词频,而逆向词频频率不变,以此提高电影类型的TF-IDF权重。
作者:叶慧仙等