为什么我只能检索Array [Float]字向量但必须将mllib.linalg.Vector传递给w2v模型?

时间:2016-04-12 18:26:20

标签: apache-spark word2vec

我正在训练一个单词矢量模型,现在我想对这些矢量做一些操作。

目前我试图找出如何添加一些像下面的向量,然后从结果向量中获取一些同义词。问题是model.findSynonyms(org.apache.spark.mllib.linalg.Vector, Int)出现问题,因为我只从Array[Float]获得model。这就是为什么我尝试创建一个DenseVector,它本身现在需要Array[Double]并且混乱是完美的 - 但请自己看看:

val model = Word2VecModel.load(sc, modelPath)
val headVector = model.getVectors.head
val synonyms = model.findSynonyms("computer", 10)
var aVec : Array[Float] = new Array(headVector._2.length)

for((synonym, cosineSimilarity) <- synonyms) {

  println(s"  $synonym $cosineSimilarity")

  // Returns Array[Float] (unfortunately)
  val bVec = model.getVectors.get(synonym).get
  val zipped = aVec zip bVec

  aVec = zipped.map(t => t._1 + t._2)
  println(util.Arrays.toString(aVec))
}

println(util.Arrays.toString(aVec))

// aVec is Array[Float] instead of Array[Double]
// or even better: something that implements org.apache.spark.mllib.linalg.Vector
val v : DenseVector = new DenseVector(aVec)

model.findSynonyms(aVec, 10)

由于aVec为Array[Float]而不是Array[Double],因此无法编译。这是因为我只能从Array[Float]获得model。所以我要么完全错了,要么就是API的一个主要问题。

还有其他方法可以做到这一点,还是我必须在这两种类型之间转换所有向量?为什么我没有从model实施org.apache.spark.mllib.linalg.Vector

获取某些内容

我也按建议here

尝试此操作
val v1 = new org.apache.spark.mllib.linalg.DenseVector(aVec)

for((synonym, cosineSimilarity) <- synonyms) {

  val v2 = new DenseVector(model.transform(synonym).toArray)

  val s = Vectors.dense((v1 + v2).toArray)
}

但是我收到的编译错误v1 + v2导致Array[Char]而非Array[Double] ..

1 个答案:

答案 0 :(得分:0)

你的第二个例子不起作用,因为你的synonym是一个字符串 - 它被转换为一个字符数组:

model.transform(synonym).toArray

因此v1 + v2会向字符数组添加一个浮点数 - 就像你发现的那样Array[Char]

至于原始问题:是的,您需要从Array[Float]转换为Array[Double]