大规模文档相似度计算—基于MapReduce框架

来源:互联网 发布:手机版数据库 编辑:程序博客网 时间:2024/06/05 23:46
现有Doc-word矩阵,采用余弦计算两两文档之间的相似度。在实际问题中,矩阵通常是很稀疏的,为了减少计算量,通常采用倒排索引的数据结构[1], 将包含相同word的doc映射到同一个节点上, 这样只需计算相似度不为0的文档之间的相似度, 从而减少计算量,具体过程如图1所示。


        图1. 建立倒排索引计算文档相似度(来源于参考文献[1])

        上述方法虽然避免了计算相似度为0的文档之间的相似度,但是当有些word对应的文档数很大时,就会出现严重的数据倾斜问题。如果如图2所示中word “B” 对应文档数有8个, 在该节点下需计算8*(8-1)/2=28个文档对之间的相似度。

                                                                图2  建立倒排索引


      当某个word对应的文档个数很多时,一种解决思路是采用矩阵分块的思想,将其打散到多个节点,分别进行处理[2]。令M表示一个节点上最多可以处理的文档对个数,blocksize表示一个块中有多少个文档,blocknum表示分多少块,docnumi表示wordi对应的文档个数,则有:


      令doc_vec表示包含word的文档-权重向量,di表示向量第i个元素。Bi表示di划分到块的序号, 计算公式为:


         

然后依次遍历分块,对每个di重新构造blocknum个(newkey,newvalue)对,其中


具体过程参见图2. 这样每个节点保证不会超过M个文档对需要处理,提升了运算效率。然后在reduce阶段对相同文档对之间的相似度相加,最终得到相似度不为0的两两文档之间的相似度。

                                图3 分块索引

                                   图4 reduce阶段计算文档之间的相似度

参考文献

1.      Tamer Elsayed, Jimmy Lin, Douglas W. Oard. Pairwise Document Similarityin Large Collections with MapReduce. Proceedings of ACL-08:HLT, pp265-268.

2.      http://blog.csdn.NET/lilyth_lilyth/article/details/9269693

原创粉丝点击