我正在训练一个单词矢量模型,现在我想对这些矢量做一些操作。
目前我试图找出如何添加一些像下面的向量,然后从结果向量中获取一些同义词。问题是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]
..
答案 0 :(得分:0)
你的第二个例子不起作用,因为你的synonym
是一个字符串 - 它被转换为一个字符数组:
model.transform(synonym).toArray
因此v1 + v2
会向字符数组添加一个浮点数 - 就像你发现的那样Array[Char]
。
至于原始问题:是的,您需要从Array[Float]
转换为Array[Double]