如何使用MapReduce计算相似度

作者: 朱小虎XiaohuZhu | 来源:发表于2014-10-13 14:30 被阅读998次

    Neil Zhu,简书ID Not_GOD,University AI 创始人 & Chief Scientist,致力于推进世界人工智能化进程。制定并实施 UAI 中长期增长战略和目标,带领团队快速成长为人工智能领域最专业的力量。
    作为行业领导者,他和UAI一起在2014年创建了TASA(中国最早的人工智能社团), DL Center(深度学习知识中心全球价值网络),AI growth(行业智库培训)等,为中国的人工智能人才建设输送了大量的血液和养分。此外,他还参与或者举办过各类国际性的人工智能峰会和活动,产生了巨大的影响力,书写了60万字的人工智能精品技术内容,生产翻译了全球第一本深度学习入门书《神经网络与深度学习》,生产的内容被大量的专业垂直公众号和媒体转载与连载。曾经受邀为国内顶尖大学制定人工智能学习规划和教授人工智能前沿课程,均受学生和老师好评。

    Cosine similarity


    image

    由于在索引中的数据结构是倒排索引,其结构如下:

    倒排索引(<word doc_i1 doc_i2 doc_ik ...>

    举例如下:

    Word occurrence@DocID........
    cat 6@Doc1 3@Doc2 4@Doc3... etc
    Hot 9@Doc1 2@Doc3 10@Doc5... etc 
    

    倒排索引是MapReduce的关键部分。我们需要解决的问题是将两个文档向量(也就是将要进行比较的文档)输入到reducer中。

    我们要考虑的是<Doc1, Doc3>的相似性。如何获得他们对应的向量并传给reducer?

    相当简单~

    Mapper的输出应该是这样的:

    Key:<Document_one, Document_two> Value:<occurrence, occurrence>
    

    所以对上面的两个文档,<Doc1, Doc3>对应第一个word cat将是:

    Key:<doc1, doc3> Value:<6, 3>
    

    通过这样的方法,在reducer中,你们会有这些值的一个list,对两个文档中出现的word的向量,这就可以在reducer中计算相似度了。

    当然,也可以将occurrence改称TF或者TF-IDF向量或者其他什么东西。这里的关键就是要得到正确的KEY-VALUE。

    在reducer这儿,你可以获得:

    Key: <doc1, doc3> Value: [<6, 4>, <9, 2>]
    

    因此,余弦相似度可以直接通过doc1 (6, 9)doc3 (4, 2)点乘获得:

    (6*4)+(9*2)... etc for larger vectors
    

    分母部分可以这样计算:

    sqrt(6^2 + 9^2) * sqrt(4^2 + 2^2) * ...
    

    你可以在reducer中进行这个计算,因为你有两个文档的向量。当然在你的值计算完后,你可以以任何方式从reducer中输出他们

    相关文章

      网友评论

        本文标题:如何使用MapReduce计算相似度

        本文链接:https://www.haomeiwen.com/subject/cmrptttx.html