聚类后如何测量簇内句子相似度以过滤高重复短文本簇?
你没有遗漏HDBSCAN的文档内容,HDBSCAN本身没有直接提供现成的簇内平均相似度属性,你可以通过两种方式获取簇聚合度指标:一是直接基于原始文本的embedding计算余弦相似度,二是用HDBSCAN输出的probabilities_属性计算单个簇内所有样本的平均归属概率,该值越高说明簇内样本聚合度越高、相似度越高。
以下是可落地的过滤方案,可根据你的现有开发进度选择:
方案1:基于簇内embedding相似度过滤(最匹配你的假设)
你已经生成了每条消息对应的SBERT embedding,对每个簇单独做如下计算:
- 取出该簇内所有消息的embedding矩阵
- 计算矩阵中所有向量两两之间的余弦相似度平均值
- 设定阈值(可参考初始值0.9,根据你的数据分布调整),平均相似度高于阈值的簇直接过滤
参考实现代码:
from sklearn.metrics.pairwise import cosine_similarity import numpy as np def calculate_cluster_avg_sim(cluster_embeddings): # 计算两两余弦相似度,取上三角值避免重复计算 sim_matrix = cosine_similarity(cluster_embeddings) upper_triangle = sim_matrix[np.triu_indices_from(sim_matrix, k=1)] return upper_triangle.mean() # 调用示例,cluster_embeds为当前簇所有样本的embedding列表 avg_sim = calculate_cluster_avg_sim(cluster_embeds) if avg_sim > 0.9: # 标记为待过滤簇 pass
方案2:基于关键词多样性过滤(适合已完成TF-IDF关键词提取的场景)
你已经输出了每个簇的TOP TF-IDF关键词,可直接基于关键词分布判断:
- 对每个簇的拼接文本,统计排名第一的关键词的词频占所有TOP关键词总词频的比例
- 如果占比超过阈值(可参考初始值70%),说明整个簇基本只围绕单个词/短语展开,属于无意义簇直接过滤
该方案不需要回溯原始embedding,计算成本更低。
方案3:辅助规则过滤(可搭配前两个方案使用)
对所有簇先做基础规则校验,符合以下任一特征的簇可直接过滤:
- 簇内所有样本的平均文本长度小于阈值(可参考初始值3个字符,hello、ok等无意义短句普遍长度较短)
- 簇内去重后的不同文本数量占簇总样本量的比例低于阈值(可参考初始值10%,说明簇内存在大量完全重复的消息)
内容的提问来源于stack exchange,提问作者reedvoid
相关产品推荐
相关产品推荐

