无监督的字符串聚类

时间:2014-04-28 09:13:56

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

我有1000多个关键字的列表,我希望通过相似性将它们组合在一起。

例如:

  • "庭院家具"
  • "客厅家具"
  • "用过椅子"
  • "新主席"

我喜欢"家具"和"椅子"聚集在一起的术语。

我知道我能做到的一种方法是指定一些预先选择的"质心"术语,然后计算Levenshtein与每个的距离,并使用kmeans对它们进行聚类。

但是我有兴趣发现的是,如果不预先指定像#34; chair"这样的质心术语,我怎么能这样做呢?和"家具"。

感谢。

2 个答案:

答案 0 :(得分:3)

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

str <- c("patio furniture", 
  "living room furniture",
  "used chairs",
  "new chairs")

library(stringdist)
d <- stringdistmatrix(str, str)

stringdist支持多种距离函数。默认值是限制Damerau-Levenshtein距离&#39;。然后,您可以在hclust中使用此距离矩阵来执行分层聚类:

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

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

cutree(cl, 2)

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

答案 1 :(得分: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