我的目标
我有一些新闻语料库,我想用LDA为每个新闻文档提取关键词,关键字也可以被称为标签,说明这个新闻是关于什么的。
我没有使用tf-idf,而是在互联网上搜索,并认为LDA可以更好地完成这项工作。
让我们预先定义一些术语:
“术语”= "word":vocabulary
中的一行。
我对SAPRK LDA的看法
参考Spark:https://spark.apache.org/docs/latest/mllib-clustering.html#latent-dirichlet-allocation-lda和我发现EMLDAOptimizer生成一个DistributedLDAModel,它不仅存储推断的主题,而且存储训练语料库中每个文档的完整训练语料库和主题分布。
DistributedLDAModel支持:
当OnlineLDAOptimizer生成一个LocalLDAModel时,只存储推断的主题。
(来自mllib)
那就让我们看看我做了什么
我有一些新闻语料库,它们是纯文本,大小或多或少是1.2克。令牌化后,移除塞子和所有数据清洗程序(前处理).我使用CountVectorize将VocabSize设置为200000,LDA将K设置为15,maxiter设置为100,optimizer设置为"em",CheckpointInterval设置为10,其他未提及的参数为默认值。这两个Transformer被放在一个管道中进行训练。
(从毫升)
val countVectorizer = new CountVectorizer()
.setInputCol("content_clean_cut")
.setOutputCol("count_vector")
.setVocabSize(200000)
val lda = new LDA()
.setK(15)
.setMaxIter(100)
.setFeaturesCol("count_vector")
.setOptimizer("em")
.setCheckpointInterval(10)
val pipeline = new Pipeline()
.setStages(Array(countVectorizer, lda))
val ldaModel = pipeline.fit(newsDF)
ldaModel.write.overwrite().save("./news_lda.model")发送工作的火花-提交约300克内存,最后它成功地训练。
然后我开始使用这个流水线模型对预处理后的新闻语料库进行转换,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)我不明白这个topicDistribution列的意思是什么,为什么它的长度是K,这是否意味着最大数的索引是这个文档的主题索引(新闻),所以我们可以通过找到最大数的索引来推断这个文档的主题,而索引实际上是describeTopics()方法返回的主题的索引吗?
将管道中的第二阶段转换为DistributedLDAModel,但未能找到与topTopicsPerDocument和topDocumentsPerTopic相关的任何内容。为什么这与正式文件不同?
在topicsMatrix的例子中有一个DistributedLDAModel方法,这到底是什么?我做了一些研究,认为topicsMatrix是countVectorizerModel.vocabulary中的每一个主题--每一个单词,我不认为这个topicsMatrix会有帮助。此外,这个矩阵中的一些数字是大于1的两倍,这使我感到困惑。但这并不重要。
更重要的是如何使用LDA为每个文档(新闻)提取不同的关键字
关键字提取的任务是自动识别最能描述文档主题的术语。
发布于 2020-05-13 10:25:39
K是要与您的新闻语料库聚在一起的主题数。每个文档的topicDistribution是K主题概率数组(基本上是告诉您哪个主题索引的概率最高)。然后,您将需要手动标记K-主题(基于每个主题下分组的术语),因此您可以“标记”文档。
LDA不会根据文本给出一个“标签”,相反,它将相关的关键字聚集到所需的k-主题中。
https://stackoverflow.com/questions/60701177
复制相似问题