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)

相关推荐

  • Centos6、7操作系统中怎么开启或关闭ICMP协议

    技术Centos6、7操作系统中怎么开启或关闭ICMP协议小编给大家分享一下Centos6、7操作系统中怎么开启或关闭ICMP协议,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有

    攻略 2021年11月15日
  • 居住证如何办理,居住证怎么办理?需要什么手续

    技术居住证如何办理,居住证怎么办理?需要什么手续以上海为例,办理流程如下居住证如何办理。1、申报居住登记。来沪人员办理居住登记,应当到现居住地的社区事务受理服务中心,填写《居住登记信息表》,并提供本人居民身份证或者户口簿

    生活 2021年10月31日
  • js中判断字符串时间类型大小(js中如何判断时间大小写)

    技术怎样用JS判断日期数字整数和特殊字符怎样用JS判断日期数字整数和特殊字符,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。如何在用一个程序检测所输入的内

    攻略 2021年12月14日
  • 抖音3元1000粉,抖音花3元能买多少粉丝?

    技术抖音3元1000粉,抖音花3元能买多少粉丝?试着去挑选那些能吸引别人眼球的封面,让更多的抖友点入你的视频,查看你的视频.太普通的封面可能会让观众在众多作品中忽略掉,而更多的则是无法通过双击和评论来分享,因此说好的封面

    测评 2021年10月21日
  • 如何进行Spring框架中的后置增强

    技术如何进行Spring框架中的后置增强这篇文章将为大家详细讲解有关如何进行Spring框架中的后置增强,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在这一篇中我们看一下

    攻略 2021年12月2日
  • 怎么样提高英语水平,怎样全方位提高英语水平

    技术怎么样提高英语水平,怎样全方位提高英语水平不知你全方位是个什么样的定义怎么样提高英语水平。
    如果是讲听说读写,那说得分开来谈。我个人认为作为外语学习,总体原则是”没(阅)读过的不听,没听过的不说(朗读),没说过的不写

    生活 2021年10月29日