我使用数据帧应用Spark的word2vec。这是我的代码:
val df2 = df.groupBy("LABEL").agg(collect_list("TERM").alias("TERM"))
val word2Vec = new Word2Vec()
.setInputCol("TERM")
.setOutputCol("result")
.setMinCount(0)
val model = word2Vec.fit(df2)
val result = model.transform(df2)
val synonyms = model.findSynonyms("4", 10)
//synonyms.foreach(println)
for((synonym, cosineSimilarity) <- synonyms) {
println(s"$synonym $cosineSimilarity")
}
但是,当我使用synonyms.foreach(println)
代码时,返回的结果不会根据它们的相似性得分进行排序。相反,我尝试了在代码底部看到的for循环。应用它时,抛出了以下错误:
Error:(52, 40) missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: ?
for((synonym, cosineSimilarity) <- synonyms) {
^
从其他类似的stackoverflow问题和错误,似乎需要确切的参数类型。在for循环中synonyms
是一个数据帧,返回的值分别具有String和Double类型。所以我的所有试验都失败了。我该如何解决这个问题?
答案 0 :(得分:0)
findSynonyms
的结果是非物化的Spark内部DataFrame
。你不能简单地迭代结果。
def findSynonyms(word: Vector, num: Int): DataFrame = {
..
sc.parallelize(wordVectors.findSynonyms(word, num)).toDF("word", "similarity")
}
请注意,foreach
工作的原因是DataFrame
上明确定义的具体化方法