本篇blog主要记录一下SentHive上面的聚合优化分析,以及一些模块化技巧

cluster_by_similarity_flexible优化 该函数用到了CPU以及GPU两个版本,在这个标题里面,我想分享一下的是我优化这个聚合算法的一个过程,以及最终的结果,还有未来可以拓展再优化的空间。 首先先来说明一下这个算法的思路,来说一下他是输入什么东西,然后得到什么东西,内部是怎么做到的。 输入: 一个字典,{关键句-人数},这个字典是经过了简单聚合,意思就是如果我在一个大文本库中,有些句子一模一样,但是发言的用户不一样,就会把他们合一起,例如“我爱机器学习”: 5642(id),“我爱深度学习”:5643(id),“我爱机器学习”5644(id), 其中“我爱机器学习”有两个人说,所以这个字典是{“我爱机器学习”: 2,“我爱深度学习”: 1}. 输出: 类似如此,输入到该聚合算法的是一个简单聚合后的字典,但是我们想要更近一步地把一些相近的句子合并,这里就用到了 SentenceTransformer 加载的模型,使用他把句子转换为向量,然后使用util.cos_sim方法来获取句子间的相似度,根据他们的相似度聚合。最终输出更加“聚合”的字典,形式类似上面。 内部黑盒: 我是边于运行边写出的这个算法,所以最终的这个呈现的结果肯定没有我分享出这个过程的对比有代表性,先来说一下比较关心的时间复杂度:O(n^2),这个我自己还是有点不满意的, 但是就根据他的核心逻辑:我需要把所有句子向量都和其他句子对比,然后根据他们的相似度合并,也就是一个句子要和N-1个句子对比,每个都要,也就是N(N-1) ,最终看起来也貌似还不错,所以优化的方案留到等下讲,先来说一下我报错/优化的历程。 在最开始的时候,这个算法是这么做的: 1.将字典转换成有序列表,然后提取句子,向量化,得到一个embedding_list,然后再初始化一个processed_words,这个用来记录已经聚类过的句子,初始化一个new_dic,用来输出。 2.外层循环 i ,遍历每一个句子向量,如果他还没有被聚类,则放进字典new_dic,内层...