第七篇|Spark平台下基于LDA的k-means算法实现

本文主要在Spark平台下实现一个机器学习应用,该应用主要涉及LDA主题模型以及K-means聚类。通过本文你可以了解到:

  • 文本挖掘的基本流程
  • LDA主题模型算法
  • K-means算法
  • Spark平台下LDA主题模型实现
  • Spark平台下基于LDA的K-means算法实现

1.文本挖掘模块设计

1.1文本挖掘流程

文本分析是机器学习中的一个很宽泛的领域,并且在情感分析、聊天机器人、垃圾邮件检测、推荐系统以及自然语言处理等方面得到了广泛应用。

文本聚类是信息检索领域的一个重要概念,在文本挖掘领域有着广泛的应用。文本聚类能够自动地将文本数据集划分为不同的类簇,从而更好地组织文本信息,可以实现高效的知识导航与浏览。

本文选择主题模型LDA(Latent Dirichlet Allocation)算法对文档进行分类处理,选择在Spark平台上通过Spark MLlib实现LDA算法,其中Spark Mllib是Spark提供的机器学习库,该库提供了常用的机器学习算法。其基本设计思路如下图所示:

在这里插入图片描述

1.2文本挖掘流程分析

首先是数据源部分,主要的数据包括文档数据和互联网爬虫数据。然后是数据抽取部分,将已经收集好的数据通过同步工具上传至分布式文件系统HDFS,作为模型训练的数据源。其次是数据探索与预处理部分,该部分主要是对原始数据集进行预处理,包括分词、停用词过滤、特征向量提取等。再次是模型训练部分,主要包括训练与测试,从而得到一个模型。最后是模型评估,对学得模型进行评估之后,进行线上部署。

2.文本挖掘模块算法研究

2.1LDA主题模型算法

LDA(Latent Dirichlet allocation)由David M. Blei,Andrew Y. Ng,Michael I. Jordan于2003年提出的基于概率模型的主题模型算法,即隐含狄利克雷分布,它可以将文档集中每篇文档的主题以概率分布的形式给出,将文本向量投射到更容易分析处理的主题空间当中,去除文本中存在的噪声,是一种常用的文本分析技术,可以用来识别大规模文档集或语料库中潜在的主题信息,通常被用来对大规模文档数据进行建模。通过主题模型和设定的主题数,可以训练出文档集合中不同的主题所占的比例以及每个主题下的关键词语出现的概率。从文档集合中学习得到主题分布和主题比例,可以进一步在数据挖掘任务中使用。

LDA借用词袋的思想,以某一概率选取某个主题,再以某一概率选出主题中的每个单词,通过不断重复该步骤产生文档中的所有语词。该方法对词汇进行了模糊聚类,聚集到一类的词可以间接地表示一个隐含的主题。LDA对文本信息进行了挖掘,能用来衡量不同文档之间的潜在关系,也能通过某一类词来表达文档中隐藏的主题。

2.2K均值算法

聚类(Clustering)是一种将数据集划分为若干组或类的方法。通过聚类过程将一群抽象的对象分为若干组,每一组由相似的对象构成,称之为一个类别。与分类不同(将数据按照事先定义好的分类标准进行划分),聚类是一种无监督学习(unsupervised learning),训练数据集的标签信息是未知的,目标是通过对无标记训练样本按照特定的测度的形似性程度进行聚合,为进一步数据分析提供基础。

K均值(k-means)算法的基本思想是初始随机给定K 个簇中心,即从n个数据对象中选择k个任意对象作为初始的簇中心,按照最邻近原则把待分类样本点分到各个簇。然后按平均法重新计算各个簇的中心(该类别中的所有数据对象的均值),从而确定新的簇心。一直迭代,直到簇心的移动距离小于某个给定的值。

K均值算法采用了贪心策略,通过迭代优化来近似求解上式E值,算法流程如下图所示
在这里插入图片描述

2.3文本挖掘算法优化

LDA主题模型算法应用于文档聚类,计算得出的主题可以看做是文档的聚类中心,利用主题模型进行文档聚类,可以有效地组织文档数据集。同时,由于LDA主题模型可以计算出每篇文档在不同主题下的概率分布,因此可以将此主题的概率分布作为文档的特征向量,从而将高维的文档向量投影到低维的特征空间中。

计算文本之间的距离是传统的K-means算法在进行文本聚类时的关键步骤,而文本通常是非结构化数据,构建的文本向量具有稀疏性和维度高的特点,同时,构建文本特征向量并未考虑到文字之间的语义关系,因此可能会造成位于同一类簇的文本之间具有非相似性。

因此本文基于LDA主题模型改进K-means算法,首先通过LDA主题模型对文档数据集进行建模,挖掘出每篇文档的主题概率分布,既能够达到文档降维和去除噪声的效果,又能弥补通过关键词构建文档特征向量容易造成丢失信息的缺陷。最后每篇文档的主题概率分布作为K-means算法的输入数据集。

3.实验分析

3.1基于Spark的LDA主题模型算法实现

数据集介绍

选择Newsgroups数据集作为该实验的训练集和测试集。Newgroups是一个新闻数据集,该数据集包括大约20000篇新闻文档,总共分为6个大类别,每个大类别又分不同的小类别,小类别共计20个,如下表所示。该新闻数据集已经成为了学界和业界在机器学习的文本挖掘实验中常用的数据集,比如文本分类和文本聚类。

该数据集共包含7个文件,其中3个文件为训练数据(train.data、train.label、train.map),共计11269篇,另外3个文件为测试数据(test.data、test.label、test.map),共计7505篇,另外一个文件为词汇表(vocabulary.txt),其第i行表示编号为i的单词的名称。文件扩展名为.data的文件格式为[docIdx wordIdx count],其中docIdx表示文档编号,wordIdx表示词语的编号,count表示该词语的词频统计。文件扩展名为.label的文件表示文档的主题分类,每行数据代表某篇文档的类别。文件扩展名为.map的文表示类别编号与类别名称的映射关系,其具体格式为[labelName labelId]。

在这里插入图片描述

原始数据集处理

原始的数据集格式为[docIdx wordIdx count],例如[1,20,2]表示在编号为1的文档中,编号为20的词语的词频是2。LDA接受的参数格式为:

[label,(vector_ size, [wiIdx,wjIdx,···wnIdx ],[tfi,tfj,···tfn])]

上述格式的数据代表一个带有标签的稀疏向量,其中label表示文档编号,vector_ size表示向量的维度,wnIdx表示词n的索引编号,tfn表示词n的词频。需要将原始数据转换成上述的格式,具体步骤如下:

  • Step1:将原始数据集上传至HDFS
[kms@kms-1 ~]$ hdfs dfs -put /opt/modules/train_data/lda/train.data  /train/lda/
  • Step2:初始化SparkSession并加载数据
val spark = SparkSession           
                       .builder           
                       .appName(s"${this.getClass.getSimpleName}")                                          .getOrCreate()         
//设置日志级别         
Logger.getLogger("org.apache.spark").setLevel(Level.OFF)         Logger.getLogger("org.apache.hadoop").setLevel(Level.OFF) 
//加载原始数据集
val rowDS = spark.read.textFile("/train/lda/train.data")     
  • Step3:数据集矩阵变换处理
//创建形如MatrixEntry(row_index, column_index, value)的MatrixEntry
val matrixEntry:RDD[MatrixEntry] = rowDS.rdd.map(_.split(" "))
      
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值