使用Levenshtein距离进行文本聚类

时间:2014-02-02 14:38:46

标签: r matlab cluster-analysis levenshtein-distance hierarchical-clustering

我有一组(2k - 4k)小字符串(3-6个字符),我想将它们聚类。由于我使用字符串,How does clustering (especially String clustering) work?上的先前答案告诉我Levenshtein distance可以用作字符串的距离函数。此外,由于我事先并不知道群集的数量,hierarchical clustering是要走的路,而不是k-means。

虽然我以抽象的形式得到问题,但我不知道实际做什么的简单方法。例如,MATLAB或R是使用自定义函数(Levenshtein距离)实际实现层次聚类的更好选择。 对于这两种软件,人们可以很容易地找到Levenshtein距离实现。聚类部分似乎更难。例如Clustering text in MATLAB计算所有字符串的距离数组,但我无法理解如何使用距离数组实际获得聚类。你能不能向大家们展示如何在MATLAB或R中使用自定义函数实现层次聚类的方法?

4 个答案:

答案 0 :(得分:36)

这可能有点简单,但这里是一个代码示例,它使用基于R中Levenshtein距离的层次聚类。

set.seed(1)
rstr <- function(n,k){   # vector of n random char(k) strings
  sapply(1:n,function(i){do.call(paste0,as.list(sample(letters,k,replace=T)))})
}

str<- c(paste0("aa",rstr(10,3)),paste0("bb",rstr(10,3)),paste0("cc",rstr(10,3)))
# Levenshtein Distance
d  <- adist(str)
rownames(d) <- str
hc <- hclust(as.dist(d))
plot(hc)
rect.hclust(hc,k=3)
df <- data.frame(str,cutree(hc,k=3))

在这个例子中,我们在3组中人工创建了一组30个随机char(5)字符串(以“aa”,“bb”和“cc”开头)。我们使用adist(...)计算Levenshtein距离矩阵,并使用hclust(...)运行heirarchal聚类。然后我们使用cutree(...)将树形图切割成三个簇,并将簇ID附加到原始字符串。

答案 1 :(得分:4)

ELKI包括Levenshtein距离,并提供多种高级聚类算法,例如OPTICS聚类。

文本聚类支持由Felix Stahlberg提供,作为他的工作的一部分:

  

Stahlberg,F.,Schlippe,T.,Vogel,S。,&amp; Schultz,T。通过跨语言单词到音素对齐进行分词。
语言技术研讨会(SLT),2012 IEEE。 IEEE,2012。

我们当然会欣赏其他贡献。

答案 2 :(得分:3)

虽然答案取决于字符串含义的程度,但一般来说,问题是通过序列分析系列技术解决的。更具体地说,最佳匹配分析(OMA)。

OMA通常分三步进行。首先,定义序列。根据您的描述,我可以假设每个字母都是一个单独的“状态”,即序列中的构建块。其次,您将使用几种算法中的一种来计算数据集中所有序列之间的距离,从而获得距离矩阵。最后,您将该距离矩阵提供给聚类算法,例如分层聚类或Partitioning Around Medoids(PAM),由于有关聚类质量的附加信息,这似乎越来越受欢迎。后者指导您选择簇的数量,这是序列分析中的几个主观步骤之一。

R TraMineR中包含大量功能的最方便的包TraMineR,可以找到该网站here。它的用户指南非常易于访问,开发人员也或多或少都对SO有效。

您可能会发现群集不是最困难的部分,除了关于群集数量的决定。 clusterward1 <- agnes(dist.om1, diss = TRUE, method = "ward") 指南显示语法非常简单,结果很容易根据视觉序列图解释。以下是用户指南中的示例:

dist.om1

clusterward1是OMA获得的距离矩阵,群集成员资格包含在diss=TRUE对象中,您可以随意执行此操作:绘图,重新编码为变量等。{{1} }选项表示数据对象是不相似(或距离)矩阵。容易,嗯?最困难的选择(在语法上,但在方法上)是选择适合您特定应用的正确距离算法。一旦你有了这个,能够证明这个选择的合理性,剩下的就很容易了。祝好运!

答案 3 :(得分:2)

如果您想要清楚地解释如何使用分区聚类(肯定会更快)来解决您的问题,请查看本文:使用聚类算法的有效拼写检查方法。 https://www.researchgate.net/publication/255965260_Effective_Spell_Checking_Methods_Using_Clustering_Algorithms?ev=prf_pub

作者解释了如何使用iK-Means的修改(类似PAM)版本对字典进行聚类。

最好的运气!