【发布时间】:2021-01-21 15:23:09
【问题描述】:
K-MEANS 聚类 b/w 2D 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: Found array with dim 3. Estimator expected
是否有可能对此类数据进行 k 均值聚类,或者我应该遵循任何其他方法?
我能想到的一个解决方案是平均句子嵌入并使用 np.squeeze 在聚类之前将每个句子的维度压缩到一维数组,但这意味着丢失单词的所有位置信息一句话。
“我是一只狗”会和“我是一只狗”一样这是错误的
【问题讨论】:
-
扁平化你的句子嵌入。
-
@Quang Hoang,谢谢你。正是我所缺少的。
-
保存位置信息的方式过于严格,最好对词向量进行平均。因为它只能处理相同长度的句子,不同位置的相同单词不会被认为是相似的。
-
@polm23 你的意思是因为这种严格性可能会导致更糟糕的结果吗?我认为,如果我对句子嵌入进行聚类而不进行平均,与对单个嵌入进行平均然后聚类相比,我认为它总是会在文本相似性识别方面提供更好的结果
-
我的意思是,这取决于您对相似性的定义,但平均词向量是标准基线。请参阅“一个简单但难以击败的句子嵌入基线”semanticscholar.org/paper/…
标签: python numpy nlp k-means sentence-similarity