有几种方法可以计算Spark ML向量与Spark DataFrame列中的每个ML向量之间的余弦相似度,然后进行排序以获得最高结果。但是,我想不出一种比在Spark ML Word2Vec模型中替换/data/
然后再使用.findSynonyms()
更快的方法。问题是Word2Vec模型完全保留在驱动程序中,如果我要比较的数据集太大,则会导致内存问题。
有没有比下面显示的方法更有效的方法?
是否可以将Word2Vec模型的数据分布在整个群集中?
是否可以将.findSynonyms()
Scala code修改为一个可以在整个Spark DataFrame上有效运行的spark sql函数?
我尝试过的方法:
# vecIn = vector of same dimensions as 'vectors' column
def cosSim(row, vecIn):
return (
tuple(( Vectors.dense( Vectors.dense(row.vectors.dot(vecIn)) /
(Vectors.dense(np.sqrt(row.vectors.dot(row.vectors))) *
Vectors.dense(np.sqrt(vecIn.dot(vecIn)))))
).toArray().tolist()))
df.rdd.map(lambda row: cosSim(row, vecIn)).toDF(['CosSim']).show(truncate=False)
.toIndexedRowMatrix().columnSimilarities()
然后过滤结果(未显示):spark.createDataFrame(
IndexedRowMatrix(df.rdd.map(lambda row: (row.vectors.toArray())))
.toBlockMatrix()
.transpose()
.toIndexedRowMatrix()
.columnSimilarities()
.entries)
/data/
替换,然后加载“修订”模型并使用.findSynonyms()
:df_words_vectors.schema
## StructType(List(StructField(word,StringType,true),StructField(vector,ArrayType(FloatType,true),true)))
df_words_vectors.write.parquet("exiting_Word2Vec_model/data/", mode='overwrite')
new_Word2Vec_model = Word2VecModel.load("exiting_Word2Vec_model")
## vecIn = vector of same dimensions as 'vector' column in DataFrame saved over Word2Vec model /data/
new_Word2Vec_model.findSynonyms(vecIn, 20).show()