键值对的聚类

时间:2013-07-16 18:32:04

标签: java hadoop k-means hierarchical-clustering

我有这个问题。 我有一个非常大的集合(以百万计)的键值对,其中一个唯一的id作为键,一个字符串作为一个值(两个或更多键的字符串可能完全相似)。我必须将这些键值对组合在一起,因为组1包含一些id-string对,group 2包含一些其他对等。 需要对字符串之间的相似性进行分组,这些字符串实际上是对的值。我已经在这些字符串之间实现了Levenshtein距离,并将距离小于阈值距离的对分组在一起。我用传统的(非常糟糕的)方式实现了它:将每个字符串与其他字符串进行比较。

我需要一些有关如何优化此功能的提示。我可以在Hadoop中使用Map-Reduce将键值对实际组合在一起吗?我认为map和reduce函数的输入是个体的和独立的,因此不能“分组”在一起。这是一个k-means聚类问题吗? 你能建议一些其他更快更有效的技术吗? 感谢。

1 个答案:

答案 0 :(得分: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概念将有助于您已有解决方案的性能?