Apache spark 我应该如何获取每个文档';Spark LDA中的主题是什么? 我的目标

Apache spark 我应该如何获取每个文档';Spark LDA中的主题是什么? 我的目标,apache-spark,keyword,lda,Apache Spark,Keyword,Lda,我有一些新闻语料库,我想使用LDA为每个新闻文档提取关键字,关键字也可以是 被称为标签,表明这条新闻是关于什么的 我没有使用tf idf,而是上网搜索,认为LDA可以做得更好 让我们提前定义一些术语: “术语”=“单词”:词汇表中的一个元素 “标记”:出现在文档中的术语的实例 “主题”:表示某些概念的项的多项式分布 “文档”:一段文本,对应于输入数据中的一行 我对萨普尔达的看法 参考Spark Doc:我发现,EMLDAOptimizer生成了一个DistributedLDAModel,它不

我有一些新闻语料库,我想使用LDA为每个新闻文档提取关键字,关键字也可以是 被称为标签,表明这条新闻是关于什么的

我没有使用tf idf,而是上网搜索,认为LDA可以做得更好

让我们提前定义一些术语:
  • “术语”=“单词”:词汇表中的一个元素
  • “标记”:出现在文档中的术语的实例
  • “主题”:表示某些概念的项的多项式分布
  • “文档”:一段文本,对应于输入数据中的一行
我对萨普尔达的看法 参考Spark Doc:我发现,
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主题中