使用spark实现textrank算法(使用spark计算余弦相似矩阵)

zkure5ic  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(733)

我正在尝试实现textrank算法,计算所有句子的余弦相似度矩阵。我想使用spark并行创建相似度矩阵的任务,但不知道如何实现。下面是代码:

cluster_summary_dict = {}
    for cluster,sentences in tqdm(cluster_wise_sen.items()):
        sen_sim_matrix = np.zeros([len(sentences),len(sentences)])
        for row in range(len(sentences)):
            for col in range(len(sentences)):
                if row != col:
                    sen_sim_matrix[row][col] = cosine_similarity(cluster_dict[cluster]  
                                               [row].reshape(1,100), cluster_dict[cluster] 
                                               [col].reshape(1,100))[0,0]
        sentence_graph = nx.from_numpy_array(sen_sim_matrix)
        scores = nx.pagerank(sentence_graph) 
        pagerank_sentences = sorted(((scores[k],sent) for k,sent in enumerate(sentences)), 
                             reverse=True)
        cluster_summary_dict[cluster] = pagerank_sentences

这里,cluster_wise_sen是一个字典,它包含不同簇的句子列表({'cluster 1':[list of statemens],…..'cluster n':[list of statemens]})。聚类包含句子的100d向量表示。我必须计算每个聚类的句子相似度矩阵。由于它是耗时的,因此希望使用spark将其并行化。

lstz6jyr

lstz6jyr1#

用大规模矩阵计算余弦相似性的实验在这里写得很好!
为了达到速度和不影响精度,您还可以尝试像min hash和evaluate jaccard distance similarity这样的散列方法。它附带了一个很好的spark ml lib实现,文档中有非常详细的示例供参考:http://spark.apache.org/docs/latest/ml-features.html#minhash-对于jaccard距离

相关问题