版权声明:本文由文智原创文章,转载请注明出处:
文章原文连接:https://www.qcloud.com/community/article/131算法
来源:腾云阁 https://www.qcloud.com/community架构
文本聚类是文本处理领域的一个重要应用,其主要目标是将给定的数据按照必定的类似性原则划分为不一样的类别,其中同一类别内的数据类似度较大,而不一样类别的数据类似度较小。聚类与分类的区别在于分类是预先知道每一个类别的主题,再将数据进行划分;而聚类则并不知道聚出来的每一个类别的主题具体是什么,只知道每一个类别下的数据类似度较大,描述的是同一个主题。所以,文本聚类比较适合用于大数据中热点话题或事件的发现。框架
文智平台提供了一套文本聚类的自动化流程,它以话题或事件做为聚类的基本单位,将描述同一话题或事件的文档聚到同一类别中。用户只须要按照规定的格式上传要聚类的数据,等待一段时间后就能够得到聚类的结果。经过文本聚类用户能够挖掘出数据中的热门话题或热门事件,从而为用户对数据的分析提供重要的基础。本文下面先对文本聚类的主要算法做介绍,而后再具体介绍文智平台文本聚类系统的原理与实现。oop
文本聚类须要将每一个文档表示成向量的形式,以方便进行类似度的计算。词袋模型(bag of words,BOW)是文本聚类里面的一种经常使用的文档表示形式,它将一个文档表示成一些词的集合,而忽略了这些词在原文档中出现的次序以及语法句法等要素,例如对于文本“北京空气重污染拉响黄色预警”,能够表示为词集{北京,空气,污染,黄色,预警}。经过词袋模型将文档转化为N维向量,进而构造整个文档集合的词语矩阵,就可使用一些数值运算的聚类算法进行文本聚类。性能
固然,并非全部的词都用来构建文档的词向量,能够去掉一些像a、an、the这样的出现频率很高而又无实际意义的词,这样的词没有什么类别区分能力,应做为停用词而去掉。另外,可使用TF-IDF等方法来评估一个词对于文档的重要程度,保留对文档较为重要的词做为词向量之用。学习
以词袋模型为基础,将文档表示成N维向量,进而能够利用相关的聚类算法进行聚类计算。经常使用的文本聚类算法有层次聚类算法、划分聚类算法(例如k-means、k-medoids算法)以及基于主题模型的聚类算法(例如PLSA、LDA)等。大数据
层次聚类算法是对给定的数据集进行层次的分解,直到达到某个终止条件为止。具体能够分为凝聚和分裂两种方式。凝聚是自底向上的策略,首先将每一个对象做为一个类别,而后根据对象之间的类似度不断地进行合并,直到全部对象都在一个类别中或是知足某个终止条件;而分裂则与凝聚相反,用的是自顶向下的策略,它首先将全部对象都放到一个类别中,而后逐渐分裂为愈来愈小的类别,直到每一个对象自成一个类别或是知足某个终止条件。大多数的层次聚类算法都采用凝聚的方式,这里就以凝聚的方式为例对算法进行介绍。优化
层次聚类算法的输入是数据集中全部对象的距离矩阵,并预先设定一个距离阈值,用于迭代的终止,算法的主要步骤以下:spa
其中步骤3中类与类之间距离的计算方法有3种,分别为:对象
层次聚类算法的优势是计算速度较快,而且不须要指定最终聚成的类别个数,可是须要预先指定一个距离阈值做为终止条件,这个距离阈值的设定须要必定的先验知识。
划分聚类算法中有表明性的算法是k-means算法和k-medoids算法,这里以较为经常使用的k-means算法为表明进行介绍。
k-means算法是基于距离的聚类算法,输入是数据集中全部文档的词向量矩阵,须要预先指定最终聚成的类别个数k,而且还须要指定算法迭代终止的条件,这能够经过指定迭代的次数或是指定先后两次迭代中k个质心距离变化的总和小于必定阈值做为算法迭代终止的条件。k-means算法的主要步骤以下:
k-means算法须要预先指定聚成类别的数目k,这须要必定的先验知识,并且算法迭代终止条件的设定也是要根据必定的经验。另外,算法初始质心的选取会影响到最终的聚类结果,有很多文献都在研究优化k-means算法初始质心的选取。
基于主题模型的聚类算法是假定数据的分布是符合一系列的几率分布,用几率分布模型去对数据进行聚类,而不是像前面的层次聚类和划分聚类那样基于距离来进行聚类。所以,模型的好坏就直接决定了聚类效果的好坏。目前比较经常使用的基于主题模型的聚类算法有LDA和PLSA等,其中LDA是PLSA的一个“升级”,它在PLSA的基础上加了Dirichlet先验分布,相比PLSA不容易产生过拟合现象,LDA是目前较为流行的用于聚类的主题模型,这里以LDA为表明介绍基于主题模型的聚类算法。
LDA(Latent Dirichlet Allocation,隐含狄利克雷分配),是一种三层贝叶斯几率模型,它由文档层、主题层和词层构成。LDA对三层结构做了以下的假设:
图1 LDA三层模型结构
LDA模型的训练过程是一个无监督学习过程,模型的生成过程是一个模拟文档生成的过程,文档中的一个词首先是根据必定的主题几率分布抽取出一个主题,而后是从这个主题中以必定的几率分布抽取出一个词,如此重复,直到生成文档中全部的词。LDA在模型中以Dirichlet分布为基本假设,其生成过程如图2所示。
图2 LDA的模型生成过程
在实际的应用中,能够经过Gibbs Sampling来对给定的文档集合进行LDA训练。首先是用户须要设定生成的模型的主题个数k,而后是对给定的文档进行分词,去掉停用词,得到文档的词袋模型,做为训练的输入。
图3 使用Gibbs Sampling的LDA训练过程
LDA中隐含的变量包括文档的主题分布Θ、主题的词分布Φ以及词所属的主题Z。Gibbs Sampling经过不断的抽样与迭代,推算出这些隐含变量。如图3所示,Gibbs Sampling在初始时随机给每一个词分配主题z(0),而后统计每一个主题z下出现词t的数量以及每一个文档m下出现主题z中的词的数量,再计算,即排除当前词的主题分布,根据其它词的主题分布来估计当前词分配到各个主题的几率。当获得当前词属于全部主题的几率分布后,再根据这一律率分布为该词抽样一个新的主题z(1)。而后用一样的方法不断更新下一个词的主题,直到文档的主题分布Θ和主题的词分布Φ收敛或是达到预约的迭代次数为止。最终输出全部的隐含变量,每一个词所属的主题也可以获得。根据每一个词所属的主题分布,就能够进一步计算出每一个文档所属的主题及其几率,这就是LDA聚类的结果。
在上一节中咱们介绍了经常使用的文本聚类算法,其中层次聚类算法和k-means算法等都是基于距离的聚类算法,而LDA则是使用几率分布模型来进行聚类。基于距离的聚类算法的优势是速度比较快,可是它们都是经过两个文档共同出现的词的多少来衡量文档的类似性,而缺少在语义方面的考虑。相反,LDA等基于模型的聚类算法可以经过文本中词的共现特征来发现其中隐含的语义结构,对“一词多义”和“一义多词”的现象都可以建模,并在聚类结果中获得体现。“一词多义”就例如“苹果”一词,它多是指水果,多是指手机,也多是指公司,LDA可以将其分配到不一样的主题中;而“一义多词”就例如众多的同义词,它们虽然在文本上并不类似,可是在语义上是类似的,LDA可以将它们汇集到一块儿。正是因为LDA在语义分析方面的优点,咱们文智平台的聚类系统使用LDA来进行文本聚类。可是LDA在训练中会比较耗时,单机状况下300万的文档数据训练须要100多个小时,这是不能接受的,所以须要对LDA作并行化计算。
Spark是继Hadoop以后新一代的大数据并行计算框架,是目前大数据分析的利器。相比于传统的Hadoop MapReduce,Spark将计算时的中间结果写到内存中,而不是写磁盘,并且在同一个任务中能够重复利用task对象,而无需从新建立,这使得Spark很是适合应用于相似LDA这样的须要反复迭代的算法中。
图4 Spark任务执行整体框架
Spark在任务的执行上也是跟Hadoop相似,经过必定的任务管理器和调度器将任务分配给各个节点来并行化执行,从而可以取得比单机环境下快数十倍的计算效率,如图4所示。对于LDA,其训练过程主要是Gibbs Sampling,目前已经有对LDA中Gibbs Sampling进行并行化的方法。具体地说,就是将训练数据分红多份,分配给每一个节点进行独立的并行化训练,训练完成后再更新全局模型,而后再根据全局模型进行下一轮的迭代训练,如此重复,直到任务结束,如图5所示。
图5 LDA并行化计算
在Spark中实现上述的LDA并行化流程,能够极大地提高LDA的计算效率,训练300万的文档数据由原来的须要100多个小时减小到只需5到6个小时。
文智平台文本聚类系统的总体架构如图6所示,主要分为接入层、计算层和存储层三层。用户经过前台页面按照规定的格式上传数据文件,而后在计算层首先会对数据进行预处理,去除无效数据,接着使用Spark对数据进行LDA聚类,这是一个反复迭代的过程。用户能够指定生成的主题个数以及迭代的最大次数,若是用户不指定咱们也会有默认值。LDA聚类获得的结果再通过简单的统计和排序整理就可以生成数据中的热门话题,热门话题和聚类结果最后会返回给用户。整个计算层的操做都是无需用户参与的,用户只须要上传数据文件,而后等待一段时间后就能够得到文本聚类的结果。
图6 文本聚类系统总体架构
文智平台基于Spark的LDA聚类系统可以快速而有效地对数据进行聚类,聚类的平均准确率达到80%以上,并且通过对Spark平台的不断优化,聚类的效率也在不断提升,表1中所示的是系统目前聚类的性能状况,后续还会在性能方面对系统不断进行优化。
表1 基于Spark的LDA聚类系统性能状况
文智平台文本聚类系统使用Spark对文本数据进行LDA聚类,能够从语义的层面上挖掘出用户数据中的热门话题。系统的应用范围很是普遍,能够应用于各种文本数据,尤为是对海量社交数据的分析很是有效。这一整套使用LDA进行文本聚类的机制目前已经较为成熟,已经在为公司内的一些部门提供文本聚类服务,咱们期待从此系统能获得更为普遍的应用。