Sas*_*een 6 cosine-similarity apache-spark pyspark spark-dataframe
我有Spark Dataframe两列:id和hash_vector.该id是为一个文件的ID和hash_vector一个SparseVector单词的计数对应于文件(并有大小30000).在...中有大约100000行(每个文档一行)Dataframe.
现在,我想找到每对文档之间的相似之处.为此,我想从列中计算余弦相似度hash_vector.我可能还想尝试其他相似性度量,如Jaccard指数.这样做的好方法是什么?我正在使用PySpark.我有一些想法:
columnSimilarities用来找到成对点产品.但我读到对于具有size_of_vocabulary >> number_of_documents的语料库来说效率更高(这里不是这种情况)Dataframe行,对于第i行,将第i行作为列添加new_column到其中Dataframe,然后编写一个udf在两列上找到相似性(余弦或Jaccard):hash_vector和new_column.但我读到循环遍历行打败了使用Spark的所有目的.我知道这是一个广泛的问题.但我有兴趣了解专家如何考虑这个问题.我很欣赏任何方向.
您是否尝试过表与自身的交叉连接?例如
# table alias can be used to disambiguate identically named columns
df_a = df_original.alias('a')
df_b = df_original.alias('b')
# list all possible combinations
# then ignore where it's the same line on both sides
# ordered, so we don't process both (A,B) and then (B,A)
df_cross = df_a.crossJoin(df_b).filter('a.id < b.id')
# now apply a udf
df_similar = df_cross.withColumn('similarity', similarity_udf(col('a.hash_vector'), col('b.hash_vector')))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
751 次 |
| 最近记录: |