zoukankan      html  css  js  c++  java
  • 推荐算法之去重策略

    一、背景

    推荐系统中,有一个刚需就是去重,去重主要涉及两块:

    1)内容源去重,即有些抓取的文章基本是讲的一件事。

    2)给用户推荐的内容去重,即不能重复推荐。

    对于第一种去重,可以采用Google公布的去重算法Simhash,该算法适合海量数据去重。对于常规的文本相似度计算,需要分词,组合成一个向量,不适合海里文本。

    第二种去重可以采用BloomFilter算法,该算法与Bitmap位图算法有相似之处。

    二、Simhash去重算法

    simhash的核心思想是为每一篇文本生成一个整数表示的指纹,然后用这个指纹去进行去重或者相似度检测。对于一些主要内容不变,有一些不太重要的词句不同的文本,simhash仍然能够得到相似或者相同的指纹。

    1、首先,对原始内容分词,得到每个词的权重

    2、对每个词hash成一个整数,并且把这个整数对应的二进制中的0变成-1,1还是1。

    3、每个词hash后的二进制向量乘以权重,形成新的加权向量。

    4、把每个词的加权向量相加,得到最终的加权向量,这个向量中元素有正有负。

    5、把最终的这个向量正值设置为1,负值设置为0,形成了一个二进制序列,也就最终变成了一个整数,就是该内容的指纹。

      该算法的奇妙之处在于,最后加的一个无关紧要的词“了”,可以看出这个词很难改变最终生成的整数,因为其权重比较小,所以其在向量的每一位上,很难改变原有的正负值。所以不太重要的词,就不太影响内容之间的重复检测。

            得到每个内容的simhash指纹值之后,可以两两计算之间的海明距离(一个二进制序列变成另外一个二进制序列需要翻转的次数),其实就是两个指纹的异或运算,异或运算结果包含3以下的1,则认为两条内容重复。

    三、BloomFilter算法

    对于用户量不大的场景,可以把用户推荐过的资讯ID,以K-V的形式存储起来;但是如果用户量巨大,这种做法的消耗不容小视。

    该算法如下:

     假如是3个hash函数,必须3个hash函数后对应的3个位置都为1,才表示在集合内,有一个是0,就说明元素不在集合内。

    需要说明的是,BloomFilter不保证百分之百准确,有很小的概率会把原本不属于集合中的元素判断存在于集合中,当然概率会比较小,hash函数的个数k越多,这种概率就越低。

  • 相关阅读:
    项目
    Cache Code
    是什么限制了我们面向对象
    程序设计语言本质
    不要迷失在技术的海洋中
    程序是给自己看的还是给别人看的
    程序员的春天
    新手如何学习一门新的语言
    无废话C#设计模式之二十:Mediator
    (原创)代码分析-DataGrid实现增删(带提示)改和分页
  • 原文地址:https://www.cnblogs.com/gczr/p/11232171.html
Copyright © 2011-2022 走看看