2

我正在尝试实现 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 sentence] ,...., 'cluster n' : [list of sentence]})。cluster_dict 包含句子的 100d 向量表示。我必须为每个集群计算句子相似度矩阵。由于它很耗时,因此希望使用 spark 将其并行化。

4

1 回答 1

1

余弦相似度的大规模矩阵计算实验在这里写得很好!

为了实现速度并且不影响准确性,您还可以尝试使用 Min-Hash 等哈希方法并评估 Jaccard 距离相似度。它带有一个很好的 Spark ML-lib 实现,文档中有非常详细的示例供参考:http ://spark.apache.org/docs/latest/ml-features.html#minhash-for-jaccard-distance

于 2020-07-20T16:24:48.800 回答