Java MapReduce中的SimHash重复数据消除输出

Java MapReduce中的SimHash重复数据消除输出,java,hadoop,mapreduce,deduplication,Java,Hadoop,Mapreduce,Deduplication,我正在使用MapReduce实现SimHash算法[1]来消除数据集的重复数据 例如,如果我有3个文档Doc1、Doc2、Doc3、Doc4。假设Doc1与Doc3相似,汉明距离小于3。然后,执行重复数据消除后,输出的“唯一”数据集应为Doc1、Doc2和Doc4 我的实现涉及将每个文档哈希转换为64位字符串,然后将该位字符串划分为多个带,以便进一步匹配。 为了简单起见,让我们这样说: Doc1 = band0+{101},band1+{110} Doc2 = band0+{100},band1

我正在使用MapReduce实现SimHash算法[1]来消除数据集的重复数据

例如,如果我有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
所以现在我要做的就是计算单个集合中每个候选人之间的汉明距离

我尝试在其中实现映射器:

输入:

键是可长写的偏移量

值是文档文本

输出:

键是band#+位字符串

值是文档文本

但现在我对减速机感到困惑。我不想在最终的数据集中出现冲突,但有什么保证呢。我对什么应该是关键值输出感到困惑


更新(更多说明) 如果reducer输入键是band#+位字符串,值是具有相同频带的文档。 比如说

Band0+{101} = Doc1,Doc3
可以计算汉明距离以了解重复文档。但是每个组(集合)在一个或多个文档中可能会有冲突,因为不能保证相同的文档最终会出现在同一个缩减器中

例如,如果第一组为Doc1、Doc2、Doc3,第二组为Doc2、Doc3、Doc4。Doc2和Doc3是重复的我如何将唯一的文档输出为Doc1、Doc3和Doc4

我遇到了这些问题,但它们对我帮助不大:


  • [1] M.Charikar,“取整算法的相似性估计技术”,Proc。第34届计算理论年会(STOC),2008年,第380-388页

    对于每个可以发出0或更多输出的文档,可以执行以下操作:

    Input1: Doc1
    Outputs
      key1: band0101, value1: Doc1
      key2: band1110, value2: Doc1
    
    (one output for each band)
    
    Input2: Doc2
    Outputs
      key1: band0100, value1: Doc2
      key2: band1110, value2: Doc2
    .
    .
    .
    

    在reducer中使用这种方法,您将得到一个包含键字符串band0101的所有文档的列表。band0100、band1110等也一样。

    谢谢您的回答。你说得对,然后我可以测量每组之间的汉明距离来知道重复的文档。但是每个组在一个或多个文档中可能会有冲突,因为不能保证相同的文档最终会出现在同一个缩减器中。例如,如果第一组为Doc1、Doc2、Doc3,第二组为Doc2、Doc3、Doc4。Doc2和Doc3是重复的。如何将唯一的文档输出为Doc1、Doc3和Doc4?一个选项是拥有多个MapReduce作业。在第一个作业中,您可以识别重复的文档,在第二个作业中,您可以过滤重复的文档以在输出中删除它们。挑战在于始终保留同一个文档并删除另一个。在您的示例中:OutputGroup1->(Doc1ID,Doc1),(Doc2ID,),(Doc3ID,Doc3)uuuuuOutputGroup2->(Doc2ID,