【问题标题】:Unsupervised clustering of strings字符串的无监督聚类
【发布时间】:2014-06-13 18:15:17
【问题描述】:

我有 1000 多个关键字的列表,我想按相似度将它们组合在一起。

例如:

  • “露台家具”
  • “客厅家具”
  • “用过的椅子”
  • “新椅子”

我希望将“家具”和“椅子”这两个术语组合在一起。

我知道我可以做到这一点的一种方法是指定一些预先选择的“质心”项,然后计算到每个项的 Levenshtein 距离并使用 kmeans 对它们进行聚类。

但我感兴趣的是,如果不预先指定“椅子”和“家具”等质心术语,我怎么能做到这一点。

谢谢。

【问题讨论】:

    标签: r machine-learning nlp cluster-analysis k-means


    【解决方案1】:

    您可以使用stringdist 包计算距离矩阵:

    str <- c("patio furniture", 
      "living room furniture",
      "used chairs",
      "new chairs")
    
    library(stringdist)
    d <- stringdistmatrix(str, str)
    

    stringdist 支持许多距离函数。默认值为“受限的 Damerau-Levenshtein 距离”。然后您可以使用hclust 中的这个距离矩阵来执行层次聚类:

    cl <- hclust(as.dist(d))
    plot(cl)
    

    hclust 有许多不同的方法。见?hclust。要创建固定数量的组(此处为 2):

    cutree(cl, 2)
    

    但是,这可能是许多可能的解决方案之一。

    【讨论】:

      【解决方案2】:

      基本上,使用层次聚类可以像这样工作:

      library(tm)
      library(arules) # or other package with (dis)similarity measures... 
      docs <- c("patio furniture", "living room furniture", "used chairs", "new chairs")
      dtm <- as.matrix(DocumentTermMatrix(Corpus(VectorSource(docs))))
      # comparse & choose measure, e.g. Jaccard vs Dice Distance
      plot(hc <- hclust(dist(dtm, method="binary")), main="Jaccard Dist")
      plot(hc <- hclust(dissimilarity(dtm, method="Dice")), main="Dice Dist")
      # determine cutting distance (e.g. 0.6)_
      clusters <- cutree(hc, h=.6)
      # result
      cbind.data.frame(docs, clusters)
      #                    docs clusters
      # 1       patio furniture        1
      # 2 living room furniture        1
      # 3           used chairs        2
      # 4            new chairs        2
      

      【讨论】:

        猜你喜欢
        • 2020-07-21
        • 2017-05-01
        • 2012-04-25
        • 2014-08-06
        • 2019-05-09
        • 2012-05-14
        • 2019-10-22
        • 2014-07-05
        • 2018-12-31
        相关资源
        最近更新 更多