集群(尤其是字符串集群)如何工作?

时间:2011-11-19 18:48:05

标签: string cluster-analysis data-mining

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

我有一张超过100,000字的表格。

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

识别群集中的相似性并对每个单词进行分组需要什么?为此更推荐哪种算法?

3 个答案:

答案 0 :(得分:44)

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

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

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

其中一个是expectation maximization算法。它的优点是它可以自动找到多个簇。然而,在实践中,它通常会提供比其他算法更不精确的结果,因此在EM 之上使用 k-means是正常的,也就是说,先用EM找到簇的数量及其中心然后使用k-means调整结果。

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:-1)

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

  

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

进行一些测试并找出每个单词的相似度阈值,以确定您的小组。