句子嵌入的 KMeans

KMeans for Sentence Embeddings

K-MEANS 聚类 b/w 二维 NUMPY 数组

我一直在寻找解决方案一段时间,我能感觉到一定有一些愚蠢的东西我可能会遗漏,所以就开始吧。 我在使用 Keras Sequential Layers 训练嵌入层后获得了句子嵌入。

虚拟示例

假设我们有如下所示的嵌入:

Sentence 1 : np.array ([[6, 2], [3, 1], [7, 4], [8, 1], [5, 4], [9, 3], [5, 1]])

Sentence 2 : np.array ([[2, 5], [5, 7], [6, 5], [3, 1], [1, 1], [6,2], [2, 1]])

基本上,在一个包含多个句子的文件中,我希望将这样的句子嵌入聚类,以便将相似的句子聚类在一起。

我知道这是我们用来聚类一维数组的方法

from sklearn.cluster import KMeans
import numpy as np

X = np.array([[1, 1], [-1, -1], [1, -1]])

kmeans = KMeans(n_clusters=3, random_state=0).fit(X)

我试过这个:

x = np.array([ [[6, 2], [3, 1], [7, 4], [8, 1], [5, 4], [11, 3], [5, 1]] , 
               [[6, 5], [8, 1], [7, 4],[8, 1], [5, 4], [11, 3], [5, 1]] ])

kmeans = KMeans(n_clusters=k, random_state=0).fit(x)

抛出 ValueError:找到暗淡 3 的数组。预计估计器 <= 2。

是否有可能对此类数据进行 k 表示聚类,或者是否有任何其他我应该遵循的方法?

一个也是我唯一能想到的解决方案是平均句子嵌入并使用np.squeeze在聚类之前将每个句子的维度压缩到一维数组,但这意味着丢失所有位置信息一个句子中的单词。

"I am a dog" 和 "Am I a dog" 是一样的 这是错误的

x = np.array([ [[6, 2], [3, 1], [7, 4], [8, 1], [5, 4], [11, 3], [5, 1]] , 
               [[6, 5], [8, 1], [7, 4],[8, 1], [5, 4], [11, 3], [5, 1]] ])

参考这个,我只是猜测问题是 scikit-learn 期望 2d NumPy 数组用于拟合函数的训练数据集,但您传入的数据集是 3d 数组,因此您需要将数组重塑为 2d.

正如 QUANG HOANG 在评论中正确建议的那样,这个想法只是 展平 密集句子嵌入矩阵。

根据需要,这还可以完整保留有关单词的位置信息!

sent1 = np.ndarray.flatten(np.array([[1, 3], [7,5], [8, 1]]))
sent2 = np.ndarray.flatten(np.array([[3, 2], [4, 2], [2, 2]]))
sent3 = np.ndarray.flatten(np.array([[1, 1], [2, 7], [3, 5]]))
sent4 = np.ndarray.flatten(np.array([[1, 1], [2, 6], [3, 5]]))

X = np.array((s1,s2,s3,s4))

print (X)

输出:

array([[1, 3, 7, 5, 8, 1],
       [3, 2, 4, 2, 2, 2],
       [1, 1, 2, 7, 3, 5],
       [1, 1, 2, 6, 3, 5]])