gpt4 book ai didi

scala - Spark Latent Dirichlet Allocation模型主题矩阵太小

转载 作者:行者123 更新时间:2023-11-30 09:01:05 25 4
gpt4 key购买 nike

首先,为了以防万一,我将解释如何表示要运行 LDA 模型的文档。首先,我进行一些预处理,以获得每个人所有文档中最重要的术语,然后获得所有最重要单词的并集。

 val text = groupedByPerson.map(s => (s._1,preprocessing.run(s, numWords, stopWords)))
val unionText = text.flatMap(s=> s._2.map(l => l._2)).toSet

我使用正则表达式“标记”所有文档中的所有单词,

val df: Dataframe = ...
val regexpr = """[a-zA-Z]+""".r
val shaveText = df.select("text").map(row => regexpr.findAllIn(row.getString(0)).toSet)
val unionTextZip = unionText.zipWithIndex.toMap

我还注意到我需要将字符串“words”转换为唯一的 double 值,类似于 documents 中给出的示例在运行LDA模型之前,所以我创建了一个映射来转换所有单词。

val numbersText = shaveText.map(set => set.map(s => unionTextZip(s).toDouble))

然后我创建语料库

val corpus = numbersText.zipWithIndex.map(s => (s._2, Vectors.dense(s._1.toArray))).cache

现在我运行LDA模型

 val ldaModel = new LDA().setK(3).run(corpus)

当我检查词汇量大小时,我注意到它被设置为语料库中第一个文档大小的大小,尽管存在词汇量较大或较小的文档。

因此主题矩阵将给出如下所示的错误

Exception in thread "main" java.lang.IndexOutOfBoundsException: (200,0) not in [-31,31) x [-3,3)
at breeze.linalg.DenseMatrix$mcD$sp.update$mcD$sp(DenseMatrix.scala:112)
at org.apache.spark.mllib.clustering.DistributedLDAModel$$anonfun$topicsMatrix$1.apply(LDAModel.scala:544)
at org.apache.spark.mllib.clustering.DistributedLDAModel$$anonfun$topicsMatrix$1.apply(LDAModel.scala:541)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
at org.apache.spark.mllib.clustering.DistributedLDAModel.topicsMatrix$lzycompute(LDAModel.scala:541)
at org.apache.spark.mllib.clustering.DistributedLDAModel.topicsMatrix(LDAModel.scala:533)
at application.main.Main$.main(Main.scala:110)
at application.Main.main(Main.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

我想我可以使用向量来表示一袋单词。向量的大小是否需要相等?也就是说,为每个单词创建一个 bool 特征,无论它是否在文档中?

最佳答案

长话短说,当然向量需要具有相同的长度。显而易见的答案是使用稀疏向量。我用过this及其 github 链接以获取指导。

关于scala - Spark Latent Dirichlet Allocation模型主题矩阵太小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36758971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com