【发布时间】:2015-09-04 12:36:32
【问题描述】:
我正在实施 SimHash 算法 [1] 以使用 MapReduce 对数据集进行重复数据删除。
例如,如果我有 3 个文档 Doc1、Doc2、Doc3、Doc4。假设 Doc1 与 Doc3 相似,汉明距离小于 3。那么在进行重复数据删除之后,输出的“唯一”数据集应该是 Doc1、Doc2 和 Doc4。
我的实现涉及将每个文档哈希转换为 64 位字符串,然后将该位字符串划分为带以进行进一步匹配。 为简单起见,让我们这样说:
Doc1 = band0+{101},band1+{110}
Doc2 = band0+{100},band1+{110}
Doc3 = band0+{101},band1+{110}
Doc4 = band0+{100},band1+{101}
如果我按照相似的波段对文档进行分组,那么相似的候选将是:
1st set: Doc1, Doc3
2nd set: Doc2, Doc4
3rd set: Doc1, Doc2, Doc3
所以现在我要做的就是计算单个集合中每个候选者之间的汉明距离。
我尝试在其中实现映射器:
输入:
Key 是 LongWritable 偏移量
值是文档文本
输出:
键是带#+位串
值是文档文本。
但现在我对减速器感到困惑。我不想在最终数据集中发生冲突,但有什么保证。我对键值输出应该是什么感到困惑?
更新(更多解释) 如果reducer输入Key是band#+位串,Value是具有相同band的文档。 例如
Band0+{101} = Doc1,Doc3
可以计算汉明距离以了解重复文档。但是每个组(集合)可能在一个或多个文档中存在冲突,因为不能保证相同的文档最终会出现在同一个 reducer 中。
例如,如果第一组是 Doc1,Doc2,Doc3,第二组是 Doc2,Doc3,Doc4。并且 Doc2 和 Doc3 是重复的 如何将唯一的文档输出为 Doc1、Doc3 和 Doc4?
我遇到了这些问题,但它们对我没有多大帮助:
[1] M. Charikar,“舍入算法的相似度估计技术”,Proc。第 34 届计算理论年度研讨会 (STOC),2008 年,第 380-388 页。
【问题讨论】:
标签: java hadoop mapreduce deduplication