sparkmllib算法实例(sparkmllib系统推荐)

技术如何进行SparkMllib主题模型案例的分析如何进行SparkMllib主题模型案例的分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获

很多新手对于如何分析SparkMllib主题模型案例不是很清楚。为了帮助大家解决这个问题,下面小编就详细讲解一下。需要的人可以从中学习,希望你能有所收获。

如何进行SparkMllib主题模型案例的分析

一 文章涉及到的算法

1, LDA主题模型

符号定义

集合d,m个文档,主题集合t,k个主题

在D中,每个文档D被视为一个单词序列w1、w2,wn,wi代表第I个单词,让D有n个单词。(在LDA中称为词包,其实每个词的位置对LDA算法没有影响)

D中涉及的所有不同的词形成了一大组呼语(简称VOC)

LDA符合的分布

每篇文章D(长度为)都有自己的主题分布,主题分布是多项式分布。这个多项式分布的参数服从狄利克雷分布,这个狄利克雷分布的参数是。

每个主题都有自己的单词分布。字分布是多项式分布,这个多项式分布的参数服从狄利克雷分布,这个狄利克雷分布的参数是。

对于文章中的第n个单词,首先从文章的主题分布中抽取一个主题,然后从该主题对应的单词分布中抽取一个单词。重复这个随机生成过程,直到所有m篇文章都完成。

结果是训练两个结果向量(k个主题,VOC包含m个单词)

LDA以文档集D为输入(会有分词、停词、词干提取等预处理。):

对于每个D中的文档D,概率d pt1,ptk对应不同话题,其中pti表示D对应t中第ith个话题的概率,计算方法直观,pti=nti/n,其中nti表示D中第ith个话题对应的字数,n为D中所有字的总数。

对于每个t中的主题t,生成概率t pw1,不同字的pwm,其中pwi表示t在VOC中生成第ith个字的概率。计算方法也很直观,pwi=Nwi/N,其中Nwi表示对应话题t的VOC中第ith个单词的个数,N表示对应话题t的所有单词的总数。

LDA的核心公式如下:

p(w|d) = p(w|t)*p(t|d)

直观地看这个公式,就是以Topic为中间层,我们可以通过当前的d和 t给出文档D中W这个词出现的概率,其中p(t|d)由d计算,p(w|t)由t计算.

2, RegexTokenizer

RegexTokenizer允许根据规律性将文档分割成单词组。默认情况下,参数“pattern”(regex,default:)用作分隔符来分割输入文本。或者,用户可以将参数“gap”设置为false,表示正则表达式“pattern”的意思是“tokens”而不是拆分gap,并查找所有匹配的事件作为拆分结果。

请参考:基于DF的分词器分词

3, StopWordsRemover

单词只是指一种语言中广泛使用的非单词。在我们需要处理文本的各个地方,我们对这些停止词进行一些特殊的处理,以便我们可以更多地关注一些更重要的词。

Stopword的词汇一般不需要自己制作,有很多选项可以自己下载选择。

Spark中提供了StopWordsRemover类来处理stopword,它可以用作机器学习管道的一部分。

去字功能是直接去掉所有的停止字(stop word),它会检查inputCol的所有输入量,然后在outputCol中,这些停止字会被去掉。

有关详细信息,请参考波前文章:基于数据帧的停止字去除器处理

4, CountVectorizer

CountVectorizer和CountVectorizerModel旨在帮助将文本文档集合转换为频率向量。当先验字典不可用时,计数向量器可以用作估计器来提取词汇并生成计数向量器模型。该模型将基于字典为文档生成一个稀疏矩阵,该矩阵可以传递给其他算法,如LDA,来做一些事情。

处理。

在拟合过程中,CountVectorizer会从整个文档集合中进行词频统计并排序后的前vocabSize个单词。

一个可选参数minDF也会影响拟合过程,方法是指定词汇必须出现的文档的最小数量(或小于1.0)。另一个可选的二进制切换参数控制输出向量。如果设置为true,则所有非零计数都设置为1.这对于模拟二进制计数而不是整数计数的离散概率模型特别有用。

具体请参考,浪尖的另一篇文章:CountVectorizer

二   数据

20个主题的数据,每篇文章一个文件,每个主题100个文件。共两千个文件。

如何进行SparkMllib主题模型案例的分析

三  实现步骤

1, 导入数据

val corpus = sc.wholeTextFiles("file:///opt/datas/mini_newsgroups/*").map(_._2).map(_.toLowerCase())

如何进行SparkMllib主题模型案例的分析

2, 数据格式整理

val corpus_body = corpus.map(_.split("\n\n")).map(_.drop(1)).map(_.mkString(" "))

val corpus_df = corpus_body.zipWithIndex.toDF("corpus", "id")

import org.apache.spark.ml.feature.RegexTokenizer

val tokenizer = new RegexTokenizer().setPattern("[\W_]+").setMinTokenLength(4).setInputCol("corpus").setOutputCol("tokens")

val tokenized_df = tokenizer.transform(corpus_df)

如何进行SparkMllib主题模型案例的分析

3, 导入停用词

val stopwords = sc.textFile("file:///opt/datas/stop_words.txt").collect()

如何进行SparkMllib主题模型案例的分析

4, 去除停用词

import org.apache.spark.ml.feature.StopWordsRemover

// Set params for StopWordsRemover

val remover = new StopWordsRemover().setStopWords(stopwords).setInputCol("tokens").setOutputCol("filtered")

// Create new DF with Stopwords removed

val filtered_df = remover.transform(tokenized_df)

如何进行SparkMllib主题模型案例的分析

5, 生成词频向量

import org.apache.spark.ml.feature.CountVectorizer

// Set params for CountVectorizer

val vectorizer = new CountVectorizer().setInputCol("filtered").setOutputCol("features").setVocabSize(10000).setMinDF(5).fit(filtered_df)

val countVectors = vectorizer.transform(filtered_df).select("id", "features")

如何进行SparkMllib主题模型案例的分析

6, 构建LDA模型

import org.apache.spark.ml.clustering.LDA

val numTopics = 20

// Set LDA params

val lda = new LDA().setK(numTopics).setMaxIter(10)

7, 训练LDA模型

val model = lda.fit(countVectors )

8, 查看训练结果数据

val topicIndices = model.describeTopics(5)

如何进行SparkMllib主题模型案例的分析

9, 词典的使用

val vocabList = vectorizer.vocabulary

如何进行SparkMllib主题模型案例的分析

10,使用模型

val transformed = model.transform(dataset)

transformed.show(false)

五  可调整测试点

1, 增加stop-words

val add_stopwords = Array("article", "writes", "entry", "date", "udel", "said", "tell", "think", "know", "just", "newsgroup", "line", "like", "does", "going", "make", "thanks")

val new_stopwords = stopwords.union(add_stopwords)

2, 使用EM

用于估计LDA模型的优化器或推理算法,目前Spark支持两种:

online:Online Variational Bayes (默认)

em: Expectation-Maximization

可以通过调用setOptimizer(value: String),传入online或者em来使用。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/149265.html

(0)

相关推荐

  • Java学习之手机编程软件

    技术Java学习之手机编程软件 Java学习之手机编程软件对于Java,有两种截然不同的观点:一种认为Java是最简单功能最强大的编程语言之一,另一种则表示这种编程语言既难用又复杂。安卓手机Java编程

    礼包 2021年11月29日
  • 11g RAC和增加日志组大小和数量

    技术11g RAC和增加日志组大小和数量这篇文章给大家介绍11g RAC和增加日志组大小和数量,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。备库关闭日志应用:SQL> select status f

    攻略 2021年11月29日
  • 用python做未来的预测(数据预测怎么用python做)

    技术如何在R中使用开源大规模预测工具Prophet这期内容当中小编将会给大家带来有关如何在R中使用开源大规模预测工具Prophet,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Prop

    攻略 2021年12月20日
  • 为所当为,如何理解王维的《送别》

    技术为所当为,如何理解王维的《送别》唐代诗人为所当为、画家有“诗佛”之称的王维,字摩诘,号摩诘居士。河东蒲州人(山西运城),祖籍太原祁州人(太原祁县)历任官职甚多,后官至尚书右丞,故称王右丞。《送别》唐代: 王维下马饮君

    生活 2021年10月28日
  • git flow 的正确使用姿势(gitflow工作流程)

    技术如何浅析GitLab Flow的十一个规则本篇文章为大家展示了如何浅析GitLab Flow的十一个规则,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。使用 Git 版本控制

    攻略 2021年12月18日
  • 春天有哪些花开,春夏秋冬各有哪些花开哟

    技术春天有哪些花开,春夏秋冬各有哪些花开哟一年四季各有什么花对应开放1、春天春天开花的种类有很多,比如:梅花、水仙、迎春、白玉兰、琼花、君子兰、牡丹、芍药、丁香、杜鹃、西洋杜鹃、樱花、含笑、玫瑰、紫荆、棣棠、锦带花、连翘

    生活 2021年10月20日