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