Apache spark 我应该如何获取每个文档';Spark LDA中的主题是什么? 我的目标
我有一些新闻语料库,我想使用LDA为每个新闻文档提取关键字,关键字也可以是 被称为标签,表明这条新闻是关于什么的 我没有使用tf idf,而是上网搜索,认为LDA可以做得更好 让我们提前定义一些术语:Apache spark 我应该如何获取每个文档';Spark LDA中的主题是什么? 我的目标,apache-spark,keyword,lda,Apache Spark,Keyword,Lda,我有一些新闻语料库,我想使用LDA为每个新闻文档提取关键字,关键字也可以是 被称为标签,表明这条新闻是关于什么的 我没有使用tf idf,而是上网搜索,认为LDA可以做得更好 让我们提前定义一些术语: “术语”=“单词”:词汇表中的一个元素 “标记”:出现在文档中的术语的实例 “主题”:表示某些概念的项的多项式分布 “文档”:一段文本,对应于输入数据中的一行 我对萨普尔达的看法 参考Spark Doc:我发现,EMLDAOptimizer生成了一个DistributedLDAModel,它不
- “术语”=“单词”:词汇表中的一个元素
- “标记”:出现在文档中的术语的实例
- “主题”:表示某些概念的项的多项式分布
- “文档”:一段文本,对应于输入数据中的一行
EMLDAOptimizer
生成了一个DistributedLDAModel
,它不仅存储推断的主题,还存储训练语料库中每个文档的完整训练语料库和主题分布
分布式LDAModel支持:
- TopicsPerDocument:培训语料库中每个文档的顶级主题及其权重
- topDocumentsPerTopic:每个主题的顶级文档以及主题在文档中的相应权重
onlinedaoptimizer
生成一个LocalLDAModel
,该仅存储推断主题
(来自mllib)
那让我们看看我做了什么
我有一些新闻语料库,它们是纯文本,大小大约为1.2G。标记化后,删除停止字和所有数据清理过程(预处理)。我使用CountVectorize
将VocabSize
设置为200000,将LDA
将K
设置为15,maxiter
设置为100,optimizer
设置为“em”,将CheckpointInterval
设置为10,未提及的其他参数为默认值。这两个变压器被放入管道中进行培训
(来自ml)
val countvectorier=new countvectorier()
.setInputCol(“内容\清除\剪切”)
.setOutputCol(“计数向量”)
.setVocabSize(200000)
val lda=新的lda()
.setK(15)
.setMaxIter(100)
.setFeaturesCol(“计数向量”)
.setOptimizer(“em”)
.setCheckpointInterval(10)
val管道=新管道()
.setStages(数组(计数向量器,lda))
val ldaModel=pipeline.fit(newsDF)
ldaModel.write.overwrite().save(“./news\u lda.model”)
将作业发送到spark submit,内存约为300G,最终训练成功
然后我开始使用这个管道模型来转换预处理的新闻语料库,show()
是:
+------------------------------+----+--------------------+--------------------+
| content_clean_cut| cls| count_vector| topicDistribution|
+------------------------------+----+--------------------+--------------------+
| [深锐, 观察, 科比, 只想, ...|体育|(200000,[4,6,9,11...|[0.02062984049807...|
| [首届, 银联, 网络, 围棋赛,...|体育|(200000,[2,4,7,9,...|[0.02003532045153...|
|[董希源, 国米, 必除, 害群之...|体育|(200000,[2,4,9,11...|[0.00729266918401...|
| [李晓霞, 破茧, 成蝶, 只差,...|体育|(200000,[2,4,7,13...|[0.01200369382233...|
| [深锐, 观察, 对手, 永远, ...|体育|(200000,[4,9,13,1...|[0.00613485655279...|
模式:
root
|-- content_clean_cut: array (nullable = true)
| |-- element: string (containsNull = true)
|-- cls: string (nullable = true)
|-- count_vector: vector (nullable = true)
|-- topicDistribution: vector (nullable = true)
我不明白这主题分布
列是什么意思,为什么它的长度是K
,就是说最大数字的索引就是这个文档(新闻)的主题索引,所以我们可以通过找到最大数字的索引来推断这个文档的主题,索引实际上是返回的descripbetopics()
方法中主题的索引
将管道中的第二阶段强制转换为DistributedLDAModel
,但未能找到与topTopicsPerDocument
和topDocumentsPerTopic
相关的任何内容。为什么这与官方文件不同
在DistributedLDAModel的实例中有一个方法topicsMatrix
,这到底是什么?我做了一些研究,认为topicsMatrix
是countVectorizerModel.词汇表中的每个主题乘以每个词汇,我不认为这个topicsMatrix
会有帮助。此外,这个矩阵中的一些数字是大于1的两倍,这让我感到困惑。但这并不重要
更重要的是如何使用LDA为每个文档(新闻)提取不同的关键字
关键字提取的任务是自动识别最能描述文档主题的术语
K是要与新闻语料库一起聚集的主题数。每个文档的topicDistribution
是K主题概率的数组(基本上是告诉您哪个主题索引的概率最高)。然后,您需要手动标记K主题(基于每个主题下分组的术语),因此您可以“标记”文档
LDA不会根据文本给你一个“标签”,而是将相关的关键字聚集到所需的k主题中