文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-19 11:05

关注

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

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

一  文章涉及到的算法

1, LDA主题模型

符号定义

LDA符合的分布

结果是希望训练出两个结果向量(k个topic,VOC中共包含m个词)

LDA以文档集合D作为输入(会有分词,去掉停用词,取词干等预处理):

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: "s+")作为分隔符来分割输入文本。或者,用户可以将参数“gaps”设置为false,指示正则表达式“pattern”表示“tokens”,而不是分割间隙,并查找所有匹配事件作为切分后的结果。

具体请参考:基于DF的Tokenizer分词

3, StopWordsRemover

stopwords简单来说是指在一种语言中广泛使用的词。在各种需要处理文本的地方,我们对这些停止词做出一些特殊处理,以方便我们更关注在更重要的一些词上。

停止词的词表一般不需要自己制作,有很多可选项可以自己下载选用。

Spark中提供了StopWordsRemover类处理停止词,它可以用作Machine learning Pipeline的一部分。

StopWordsRemover的功能是直接移除所有停用词(stopword),所有从inputCol输入的量都会被它检查,然后再outputCol中,这些停止词都会去掉了。

具体请参考,浪尖文章:基于DataFrame的StopWordsRemover处理

4, CountVectorizer

CountVectorizer 和 CountVectorizerModel 旨在帮助将文本文档集合转化为频数向量。当先验词典不可用时,CountVectorizer可以用作Estimator提取词汇表,并生成一个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来使用。

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯