String 对一长串单词进行聚类

String 对一长串单词进行聚类,string,cluster-analysis,k-means,levenshtein-distance,pattern-recognition,String,Cluster Analysis,K Means,Levenshtein Distance,Pattern Recognition,我手头有以下问题:我有一个很长的单词列表,可能是名字、姓氏等。我需要对这个单词列表进行聚类,以便相似的单词,例如具有相似编辑(Levenshtein)距离的单词出现在同一个聚类中。例如,“algorithm”和“alogrithm”应该很有可能出现在同一个集群中 我非常了解模式识别文献中的经典无监督聚类方法,如k-means聚类、EM聚类。这里的问题是这些方法适用于向量空间中的点。我手上拿着字串。根据我迄今为止的调查,如何在数值向量空间中表示字符串以及如何计算字符串簇的“平均值”的问题似乎没有得

我手头有以下问题:我有一个很长的单词列表,可能是名字、姓氏等。我需要对这个单词列表进行聚类,以便相似的单词,例如具有相似编辑(Levenshtein)距离的单词出现在同一个聚类中。例如,“algorithm”和“alogrithm”应该很有可能出现在同一个集群中

我非常了解模式识别文献中的经典无监督聚类方法,如k-means聚类、EM聚类。这里的问题是这些方法适用于向量空间中的点。我手上拿着字串。根据我迄今为止的调查,如何在数值向量空间中表示字符串以及如何计算字符串簇的“平均值”的问题似乎没有得到充分的回答。解决这个问题的一种简单方法是将k-Means聚类与Levenshtein距离相结合,但问题仍然是“如何表示字符串的“平均值”。有一个称为TF-IDF weigt的权重,但它似乎主要与“文本文档”聚类相关,而不是单个单词的聚类。似乎存在一些特殊的字符串聚类算法,比如


我在这方面的研究还在继续,但我也想从这里得到一些想法。在这种情况下,有人知道解决此类问题的方法吗?

不要寻找集群。这是误导。无论发生什么情况,大多数算法都会(或多或少地强制)将数据分成预定义数量的组。k-means不是解决问题的正确算法,这一点应该很明显,不是吗

这听起来很相似;区别在于规模。聚类算法将生成“宏”聚类,例如,将数据集划分为10个聚类。您可能希望的是,您的许多数据根本不是群集的,但您希望合并接近重复的字符串,这可能是由错误引起的,对吗

带阈值的Levenshtein距离可能是您需要的。例如,您可以尝试使用散列技术来加速这一过程


同样,TF-IDF是错误的工具。它用于聚类文本,而不是字符串。TF-IDF是分配给较大文档中单个单词(字符串;但假定该字符串不包含拼写错误!)的权重。它在短文档上不能很好地工作,在单字字符串上也不能工作。

我也遇到过同样的问题。我的方法是创建一个图,其中每个字符串都是一个节点,每条边将连接两个节点,权重为这两个字符串的相似性。可以使用“编辑距离”或“Sorensen”进行编辑。我还将阈值设置为0.2,这样我的图就不会完整,因此计算量非常大。形成图后,可以使用社区检测算法检测节点社区。每个社区都是由彼此有很多边的节点组成的,因此它们彼此非常相似。您可以使用networkx或igraph来形成图形并标识每个社区。因此,每个社区都是一组字符串。我用我想要集群的字符串测试了这种方法。以下是一些已确定的集群

大学集群 理事会集群 委员会集群 我用gephi工具将图形可视化。
即使已经很晚了,也希望能有所帮助。

谢谢您的回复!我知道你在说TF-IDF。但是关于聚类,如果我把聚类的K参数设置得很高会怎么样?我还考虑了一个简单的Levenshtein+阈值方法,但是现在还不清楚如何开始生成集群。我将得到一个以百万为单位的单词列表,因此任何成对的O(N^2)比较方法都不起作用。你能详细介绍一下这种散列技术吗?我应该如何开始设计一种非聚类方法呢;我之所以需要这样做,是因为以下原因:这一步需要作为更大算法的另一步的“性能提升剂”,这一步需要将很可能属于同一实体的字符串聚集在一起。对不起,我没有准备好散列的链接。本质上,您需要构造散列函数,以便拼写错误发生冲突。例如,散列时不考虑字母顺序,或随机跳过字母。查找minhash。K-means真的不适合你,抱歉。这是最小二乘法,它只适用于连续的数值数据;我将研究这种散列方法。最后,关于k-medoids方法呢?它不使用欧几里德距离,不需要计算聚类的平均值;它接受到群集中所有其他点的总距离最小的数据点作为群集中心。你知道这种方法吗?k-medoids仍然会将你的数据强制压缩到k组中,而不会检测拼写错误和变化。您可以尝试使用Levenshtein距离的k-medoids,但A)它的缩放效果非常差,B)结果几乎令人信服(可能先尝试50个例子,看看结果是否符合您的期望结果。)