我有1000多个关键字的列表,我希望通过相似性将它们组合在一起。
例如:
我喜欢"家具"和"椅子"聚集在一起的术语。
我知道我能做到的一种方法是指定一些预先选择的"质心"术语,然后计算Levenshtein与每个的距离,并使用kmeans对它们进行聚类。
但是我有兴趣发现的是,如果不预先指定像#34; chair"这样的质心术语,我怎么能这样做呢?和"家具"。
感谢。
答案 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