键值对的聚类
Posted
技术标签:
【中文标题】键值对的聚类【英文标题】:Clustering of key-value pairs 【发布时间】:2013-07-15 02:16:18 【问题描述】:我有这个问题。 我有一个非常大的键值对集合(以百万计),其中某个唯一 id 作为键,一个字符串作为值(对于 2 个或更多键,字符串可能完全相同)。我必须将这些键值对组合在一起,因为第 1 组包含一些 id-string 对,第 2 组包含一些其他对等。 需要根据字符串之间的相似性进行分组,这些字符串实际上是对的值。我已经在这些字符串之间实现了 Levenshtein 距离,并将距离小于阈值距离的对组合在一起。我用传统的(非常糟糕的)方式实现了它:将每个字符串相互比较。
我需要一些关于如何优化它的提示。我可以在 Hadoop 中使用 Map-Reduce 将键值对组合在一起吗?我认为 map 和 reduce 函数的输入是单独的和独立的,因此不能“组合”在一起。这是一个k-means聚类问题吗? 你能推荐一些其他更快更有效的技术吗? 谢谢。
【问题讨论】:
【参考方案1】:拼写检查器使用 Burkhard-Keller 树 (BK-Tree),这里有一个示例 https://github.com/mkarlesky/csharp-bk-tree。这在针对现有列表测试一个新词时非常快,而且还给出了一个“距离”度量,该度量基于将字符串更改为下一个所需的操作数。与给您一个布尔值的简单“包含”测试不同,这为您提供了一种组织可用选项的方法。您可以在此处阅读更多信息:http://blog.notdot.net/2007/4/Damn-Cool-Algorithms-Part-1-BK-Trees。我怀疑您可以使用距离来帮助进行聚类。
我想关于 bk 树的主要事情是你可以继续使用 Levenshtein 距离。但也许你已经在使用它了?这种技术并不适合像 k-means 那样选择任意数量的集群。但我确实看到了一篇关于在 k-means 上下文中利用一些新的并行处理的有趣文章,这可能有助于您在 C# 中加快速度:
http://www.codethinked.com/multi-threaded-k-means-clustering-in-net-40
该示例未使用字符串,但我也许 AsParallel 概念将有助于提高您已有解决方案的性能?
【讨论】:
谢谢。但是我需要这样的树吗?我不想用其他字符串查询数据或做任何其他处理。我只想要每对字符串之间的距离小于 50 的对组(这些字符串也有超过 1000 个字符)。制作这样一棵树会使“分组”更快吗? 因此,假设您最终拥有数千个组和数百万个条目。对每个新字符串做的第一件事是通过针对所有现有组测试新成员并找到“最接近”的现有组来测试是否存在适当的组。您可以线性地进行并测试所有组,但我认为如果您构建 BK-tree 并在每次找到无法分组的单词时将新成员添加到树中会更快。 这肯定会更快地找到距离最近的现有组。但是,例如,它不能很好地保证您最终获得固定数量的最佳组。对于固定数量的优化输出,我认为您需要使用不同的聚类方法以上是关于键值对的聚类的主要内容,如果未能解决你的问题,请参考以下文章