【问题标题】: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