Spark中的有效余弦相似度计算

时间:2019-09-17 18:56:43

标签: apache-spark pyspark apache-spark-ml

有几种方法可以计算Spark ML向量与Spark DataFrame列中的每个ML向量之间的余弦相似度,然后进行排序以获得最高结果。但是,我想不出一种比在Spark ML Word2Vec模型中替换/data/然后再使用.findSynonyms()更快的方法。问题是Word2Vec模型完全保留在驱动程序中,如果我要比较的数据集太大,则会导致内存问题。

  1. 有没有比下面显示的方法更有效的方法?

  2. 是否可以将Word2Vec模型的数据分布在整个群集中?

  3. 是否可以将.findSynonyms() Scala code修改为一个可以在整个Spark DataFrame上有效运行的spark sql函数?

我尝试过的方法:

  • rdd函数:
# 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)
  • 用我自己的Word2Vec模型/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()

0 个答案:

没有答案