这几天我一直在为这个问题头疼。感觉它应该很容易直观......真的希望有人能提供帮助!
我已经org.nd4j.linalg.api.ndarray.INDArray
从一些半结构化数据中构建了一个单词出现,如下所示:
import org.nd4j.linalg.factory.Nd4j
import org.nd4s.Implicits._
val docMap = collection.mutable.Map[Int,Map[Int,Int]] //of the form Map(phrase -> Map(phrasePosition -> word)
val words = ArrayBuffer("word_1","word_2","word_3",..."word_n")
val windows = ArrayBuffer("$phrase,$phrasePosition_1","$phrase,$phrasePosition_2",..."$phrase,$phrasePosition_n")
var matrix = Nd4j.create(windows.length*words.length).reshape(windows.length,words.length)
for (row <- matrix.shape(0)){
for(column <- matrix.shape(1){
//+1 to (row,column) if word occurs at phrase, phrasePosition indicated by window_n.
}
}
val finalmatrix = matrix.T.dot(matrix) // to get co-occurrence matrix
到目前为止,一切都很好...
在这一点的下游,我需要将数据集成到 Spark 中的现有管道中,并使用 pca 等的实现,所以我需要创建一个 DataFrame,或者至少是一个 RDD。如果我提前知道单词和/或窗口的数量,我可以执行以下操作:
case class Row(window : String, word_1 : Double, word_2 : Double, ...etc)
val dfSeq = ArrayBuffer[Row]()
for (row <- matrix.shape(0)){
dfSeq += Row(windows(row),matrix.get(NDArrayIndex.point(row), NDArrayIndex.all()))
}
sc.parallelize(dfSeq).toDF("window","word_1","word_2",...etc)
但是窗口和单词的数量是在运行时确定的。我正在寻找一个 WindowsxWordsorg.apache.spark.sql.DataFrame
作为输出,输入是一个 WindowsxWordsorg.nd4j.linalg.api.ndarray.INDArray
提前感谢您提供的任何帮助。