【问题标题】:KMeans for Sentence Embeddings用于句子嵌入的 KMeans
【发布时间】: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


【解决方案1】:
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 数组,因此您需要重塑二维数组。

【讨论】:

    【解决方案2】:

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

    根据需要,这也将保持单词的位置信息不变!

    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]])
    

    【讨论】:

      猜你喜欢
      • 2020-12-26
      • 2020-01-29
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 2020-12-27
      • 2019-05-16
      • 2021-12-04
      • 2021-02-11
      相关资源
      最近更新 更多