首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该如何在Spark中获得所有文档的主题?

我应该如何在Spark中获得所有文档的主题?
EN

Stack Overflow用户
提问于 2020-03-16 06:18:22
回答 1查看 711关注 0票数 0

我的目标

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

我没有使用tf-idf,而是在互联网上搜索,并认为LDA可以更好地完成这项工作。

让我们预先定义一些术语:

“术语”= "word":vocabulary

  • "token":实例的一个元素,该元素出现在document

  • "topic":多项分布中,该分布在表示某些concept

  • "document":文本的项上,对应于输入数据

中的一行。

我对SAPRK LDA的看法

参考Spark:https://spark.apache.org/docs/latest/mllib-clustering.html#latent-dirichlet-allocation-lda和我发现EMLDAOptimizer生成一个DistributedLDAModel,它不仅存储推断的主题,而且存储训练语料库中每个文档的完整训练语料库和主题分布。

DistributedLDAModel支持:

  • topTopicsPerDocument:培训corpus
  • topDocumentsPerTopic:中每个文档的顶级主题及其权重,每个主题的顶级文档以及文档中主题的相应权重。

OnlineLDAOptimizer生成一个LocalLDAModel时,只存储推断的主题。

(来自mllib)

那就让我们看看我做了什么

我有一些新闻语料库,它们是纯文本,大小或多或少是1.2克。令牌化后,移除塞子和所有数据清洗程序(前处理).我使用CountVectorizeVocabSize设置为200000,LDAK设置为15,maxiter设置为100,optimizer设置为"em",CheckpointInterval设置为10,其他未提及的参数为默认值。这两个Transformer被放在一个管道中进行训练。

(从毫升)

代码语言:javascript
复制
    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()是:

代码语言:javascript
复制
+------------------------------+----+--------------------+--------------------+
|             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...|

模式:

代码语言:javascript
复制
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,但未能找到与topTopicsPerDocumenttopDocumentsPerTopic相关的任何内容。为什么这与正式文件不同?

topicsMatrix的例子中有一个DistributedLDAModel方法,这到底是什么?我做了一些研究,认为topicsMatrixcountVectorizerModel.vocabulary中的每一个主题--每一个单词,我不认为这个topicsMatrix会有帮助。此外,这个矩阵中的一些数字是大于1的两倍,这使我感到困惑。但这并不重要。

更重要的是如何使用LDA为每个文档(新闻)提取不同的关键字

关键字提取的任务是自动识别最能描述文档主题的术语。

EN

回答 1

Stack Overflow用户

发布于 2020-05-13 10:25:39

K是要与您的新闻语料库聚在一起的主题数。每个文档的topicDistribution是K主题概率数组(基本上是告诉您哪个主题索引的概率最高)。然后,您将需要手动标记K-主题(基于每个主题下分组的术语),因此您可以“标记”文档。

LDA不会根据文本给出一个“标签”,相反,它将相关的关键字聚集到所需的k-主题中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60701177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档