Spark Latent Dirichlet分配模型主题矩阵太小

时间:2016-04-21 03:18:11

标签: scala apache-spark machine-learning lda apache-spark-mllib

首先,为了以防万一,我将解释如何表示我想要运行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'在运行LDA模型之前,使用类似于documents中给出的示例的唯一double,因此我创建了一个映射来转换所有单词。

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)

我以为我可以用矢量来代表一个单词。向量需要大小相等吗?也就是说,为每个单词创建一个bolean功能,无论它是否在文档中?

1 个答案:

答案 0 :(得分:2)

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