我有一组句子,我已使用 SBERT 嵌入将其转换为向量。我想对这些向量进行聚类。
在网上查找信息时,我不断看到帖子告诉我做一些经典的聚类,要么使用KMeans(然后使用欧几里得距离),要么使用(1-cosine)作为距离(例如 nltk.cluster.cosine_distance() )这绝对不是一个距离。 我不明白这些方法的有效性:在第一种情况下,使用的距离不是对相似性有意义的距离,而在第二种情况下,它不是距离。
这些方法有效吗?如果是,为什么?如果没有,什么是好的集群方法?
一旦句子被转换成表示其语义嵌入的向量,使用 KMeans 就可以了。该向量空间中的两个点彼此距离越远,它们的语义相似度就越低,并且进入同一簇的机会也就越低。所以这个方法有效,我以前这样做过,它对我有用。 SentenceTransformers 基础教程之一甚至建议使用它。
如果由于句子数量非常多而导致运行时间成为问题,您可以使用 faiss 之类的东西来加速 KMeans,如本笔记本中所做的那样。