聚类(尤其是字符串聚类)如何工作?

Posted

技术标签:

【中文标题】聚类(尤其是字符串聚类)如何工作?【英文标题】:How does clustering (especially String clustering) work? 【发布时间】:2012-01-02 00:58:20 【问题描述】:

我听说过通过聚类对相似数据进行分组。我想知道它在 String 的特定情况下是如何工作的。

我有一张包含超过 100,000 个单词的表格。

我想识别有一些差异的同一个词(例如:house, house!!, hooouse, HoUse, @house, "house", etc...)。

需要什么来识别相似度并将每个单词分组到一个集群中?对此更推荐什么算法?

【问题讨论】:

【参考方案1】:

要了解什么是聚类,请想象一张地图。您可以看到许多不同的对象(例如房屋)。它们中的一些彼此靠近,而另一些则很远。基于此,您可以将所有对象分成组(例如城市)。聚类算法正是这样做的——它们允许您将数据分成组,而无需事先指定组边界。

所有聚类算法均基于 2 个对象之间的距离(或可能性)。在地理地图上是正常的2个房子之间的距离,在多维空间中它可能是欧几里得距离(其实地图上2个房子之间的距离也是欧几里得距离)。对于字符串比较,您必须使用不同的东西。这里有两个不错的选择是Hamming 和Levenshtein distance。在您的特定情况下,Levenshtein distance 如果更可取(汉明距离仅适用于相同大小的字符串)。

现在您可以使用现有的聚类算法之一。它们有很多,但并非所有都能满足您的需求。例如,这里已经提到的纯 k-means 对您几乎没有帮助,因为它需要找到初始数量的组,并且对于大型字符串字典,它可能是 100、200、500、10000 - 您只是不知道数字.所以其他算法可能更合适。

其中之一是expectation maximization 算法。它的优点是它可以自动找到簇的数量。然而,在实践中,它给出的结果往往不如其他算法精确,因此在 EM 之上使用 k-means 是正常的,即首先用 EM 找到簇的数量及其中心,然后使用 k-means 调整结果。

另一个可能适合您任务的算法分支是hierarchical clustering。在这种情况下,聚类分析的结果不是一组独立的组,而是树(层次结构),其中几个较小的聚类组合成一个较大的聚类,所有聚类最终都属于一个大聚类。在您的情况下,这意味着所有单词在某种程度上都彼此相似。

【讨论】:

很好的解释。太感谢了。但我现在有一个疑问。一个字符串到另一个字符串的距离必须为另一个每个单词计算吗?示例:如果我有 100 个单词,我会将每个单词与 99 个单词进行比较?还是根据算法的变化(例如,仅与聚类中心进行比较)? 是的,这取决于算法,但通常它们中的大多数会多次比较元素。聚类算法本身在计算上非常困难(例如,k-means 是一项 NP-hard 任务),但其中许多具有启发式改进,使其更易于执行。有关您感兴趣的特定算法,请参阅文档。 k-means 在 EM 之上?从来没有听说过。例如给出的建议Bishop(''模式识别和机器学习'',Springer 2006)正好相反:EM 更好,但启动速度慢,所以用几轮 k-means 优化来引导它。 另外,建议将 EM 或 k-means 与字符串编辑距离结合使用是没有意义的。 k-means 不仅需要距离度量,还需要一组样本的定义明确的均值,这对于编辑距离下的字符串是不可能定义的。 @larsmans:基于 k-means 的 EM 提供了更快的收敛速度并更好地防止了局部最小值。 EM 之上的 k-means 提供了自动类别计数发现和 k-means 的所有优点。我在这里看不出矛盾。 EM优于k-means?对不起,但是没有具体的任务和数据集,这样的声明对我来说毫无意义。无论如何,我并不是说 k-means 肯定会更好地用于字符串聚类,我想强调的是可以轻松地将两者结合起来,而 Bishop 的引用证实了这一点。【参考方案2】:

有一个名为stringdist 的包允许使用多个different methods 进行字符串比较。从该页面复制粘贴:

汉明距离:两个字符串中具有相同符号的位置数。只为相等长度的字符串定义。 Levenshtein 距离:将字符串 a 转换为字符串 b 所需的最少插入、删除和替换次数。 (完整)Damerau-Levenshtein 距离:类似于 Levenshtein 距离,但允许相邻符号的换位。 最佳字符串对齐/受限 Damerau-Levenshtein 距离:类似(完整)Damerau-Levenshtein 距离,但每个子字符串只能编辑一次。 最长公共子字符串距离:在两个字符串中必须删除的最小符号数,直到结果子字符串相同。 q-gram 距离:两个字符串的 N-gram 向量之间的绝对差之和。 余弦距离:1 减去两个 N-gram 向量的余弦相似度。 Jaccard 距离:共享 N-gram 与所有观察到的 N-gram 的商除以 1。 Jaro 距离:Jaro 距离是 4 个值的公式,实际上是 Jaro-Winkler 距离 p = 0 的特例。 Jaro-Winkler 距离:此距离是由 5 个参数组成的公式,由从 [0, 0.25] 中选择的两个比较字符串 (A,B,m,t,l) 和 p 确定。

这会给你距离。您可能不需要执行聚类分析,也许按字符串距离本身排序就足够了。我创建了一个脚本来提供基本功能here...随时根据需要改进它。

【讨论】:

【参考方案3】:

您可以使用Levenshtein distance 等算法进行距离计算,使用k-means 进行聚类。

Levenshtein 距离是一个字符串度量,用于测量两个序列之间的差异量

做一些测试并找到每个单词的相似度阈值,这将决定你的组。

【讨论】:

字符串聚类更推荐什么算法? 什么意思更推荐? 有一些聚类算法,对吧?以问题中的房子为例,什么算法可以更充分地获得这种类型的结果?我想把所有的词放在同一个集群中。 您可以使用k-means 进行聚类,使用Levenshtein 距离进行距离计算。 你将如何计算平均值?

以上是关于聚类(尤其是字符串聚类)如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何聚类一组字符串?

数据聚类如何帮助图像或模式识别

顺序/在线kmeans聚类,它是如何工作的?现有代码?

我如何从熊猫绘制 k 均值聚类?

分类,回归,聚类

“余弦”度量在 sklearn 聚类算法中如何工作?