如何聚类text-embedding-ada-002生成的评论句嵌入?求替代K-means方案
适配text-embedding-ada-002嵌入的无预设聚类数聚类方案
一、DBSCAN聚类(优先推荐)
- 核心优势:无需预先指定聚类数,基于密度识别簇,完美适配高维的text-embedding-ada-002嵌入
- 关键注意点:ada嵌入处于余弦相似度空间,需使用余弦距离作为度量(默认欧氏距离在高维空间区分度差)
- 示例代码:
import numpy as np from sklearn.cluster import DBSCAN from sklearn.metrics.pairwise import cosine_distances # 将ada嵌入转换为numpy数组 embeddings = np.array(df_exploded['ada_v2'].tolist()) # 计算余弦距离矩阵 distance_matrix = cosine_distances(embeddings) # 初始化DBSCAN:eps为余弦距离阈值(对应相似度≥0.8则eps≤0.2),min_samples为簇最小样本数 dbscan = DBSCAN(eps=0.2, min_samples=40, metric='precomputed') cluster_labels = dbscan.fit_predict(distance_matrix)
- 调参提示:eps可根据业务需求调整,比如希望簇内相似度≥0.75,对应eps=0.25;min_samples保持你之前设定的40即可
二、层次聚类(Agglomerative Clustering)
- 核心优势:可通过树状图手动确定聚类数,也能设置距离阈值自动划分簇,无需预设聚类数
- 关键注意点:使用余弦相似度作为距离度量,选择平均链接(average linkage)更适合文本嵌入聚类
- 示例代码:
import numpy as np from sklearn.cluster import AgglomerativeClustering embeddings = np.array(df_exploded['ada_v2'].tolist()) # 设置距离阈值自动划分簇,对应相似度≥0.8则阈值设为0.2 agg_clustering = AgglomerativeClustering( n_clusters=None, distance_threshold=0.2, affinity='cosine', linkage='average' ) cluster_labels = agg_clustering.fit_predict(embeddings)
三、修正你原有的快速聚类(community_detection)
- 问题排查:
sentence_transformers.util.community_detection依赖归一化后的嵌入计算余弦相似度,若你的ada嵌入在数据处理中丢失了归一化,会导致效果不佳 - 修正代码:
import torch from sentence_transformers import util # 加载嵌入并强制归一化 embeddings = torch.Tensor(df_exploded['ada_v2'].tolist()) embeddings = torch.nn.functional.normalize(embeddings, p=2, dim=1) # 调整阈值(ada嵌入的合理相似度阈值通常在0.65-0.75之间) clusters = util.community_detection(embeddings, min_community_size=40, threshold=0.7)
内容的提问来源于stack exchange,提问作者Yana Tautkevyhcius
相关产品推荐
相关产品推荐

