zoukankan      html  css  js  c++  java
  • 大数据读书笔记之第三章——Findding Similar Items

    对于大量的web pages,不可避免的一个问题就是有很多网页是相似的。比如有些网页只是另一网页的剽窃或者镜像。发现这些相似性是大数据处理的一个问题。

    Jaccada距离:

    首先,引入一个Jaccad距离来量度两个集合的相似度。定义如下:

    两个集合S和T之间的相似度为:|S∩T|/|SUT|。例如:

       

    S和T之间的相似度为SIM(S,T)=3/8

    利用这个量度可以很好的解决web pages字面上相似的问题,但是显而易见的问题是,如果逐个字母(或者汉字)对比的话,只是字母层面的相似比较。有可能两篇文章的内容很相似,但是表述的方式不一样,也就是meaning 层面的相似。这在处理新闻等网页时,就很重要了。比如说如果谷歌想显示今天的一个新闻,但是新闻内容一样,各个媒体采用的表述不相同而已(但是相似)。对于这类问题,Jaccad距离就不能胜任了。

    协同过滤

    关于协同过滤参见我在CSDN上转来的一篇文章。需要注意的是,如果Jaccad值越大,我们定义两者之间的相似度越高。对于mirror站点,或许90%以上才能判定为相似。但是对于网上购物,购物行为能达到20%以上就可以判定为具有相似品味的用户了。

     Shingling of Documents

    表示文档最有效的方式是集合,通过把文档划分为像句子或者短语类似的shingling,将文档划分为片段。具有很多这样相同shingling的,不管位置在哪,判定为文档相似。定义长度为k的字符串为k-shingling。

    那么假设有一个文档是abcdabd,选择k为2的话,该文档可用集合{ab,bc,cd,da,bd}表示。注意到ab虽然出现两次但是集合里只记一次。如果遇到空格的话,要忽略掉。

    那么怎么选择k呢,如果k为一的话,所有的web pages都有很高的相似度。如果太大的话,任何一个shingling出现在文档中的概率会非常低。根据经验,一般对于邮件设置k=5,对于研究论文等k=9.

    Hashing shingling

    作为用字符串当shingling的替换,我们可以采用一些哈希函数来把长度为k的字符串映射到一系列的buckets上,然后把bucket当做shingling。

    这样做是有好处的。假设k=9,将9-shingling映射到bucket的值将是2^32-1个,也就是说文档将用4 bytes而不是9bytes来表示。(怎么理解?我是这样理解的,有32个包括标点之类的常用字母,有2^32-1中组合,原来用9位来表示,现在用4位,不仅数据压缩了,而且我们可以对single shingling采用位操作了)

    signature比较

    虽然我们把k-shingling哈希为4bytes的数据,但是要存储一篇文档的空间还是变成了原来的四倍。如果有很多文档的话,这是很耗存储空间的。

    那么怎么办呢?

    我们需要找到一种signature来表示文档,然后比较signature之间的Jaccad距离。首先我们定义一个sets的矩阵表示。

    S1={a,d},S2={c},S3={b,d,e}S4={a,c,d} 也就是值为1的话代表这个字母在该S中有出现过。很明显,如果文档都这么存储的话太耗空间了,这不过是一种很好的数据视觉表示而已。

    我们把这种矩阵叫做characteristic matrix。

    Minhashing

    我们想要构建的signature并不是上面的矩阵。于是引入minhash方法。从简单的例子开始:

    对于这样一个characteristic matrix我们怎么minhash呢?对于S1,从该列的第一行开始,遇到第一个为1的则为哈希值。所以h(S1)=a,同理计算h(S2)=c,h(S3)=b,h(S4)=a.

    这时候会出现一个奇妙的特征:P(h(s1)=h(s2))即两个集合哈希值相等的概率会和两者的SIM(s1,s2)相等。作者是这样证明的:将S1,S2的可能组合分为三种均为1或者一个为零一个为1或者均为0,但是均为0没有意义不予考虑。那么定义均为1的个数为x,一个为1另外一个为0的个数为y。那么h(s1)=h(s2)相等的概率为x/x+y,而SIM(s1,s2)也为x/x+y。这个等式在大数据量并且随机的情况下一般性成立。

    但是实际上并不是这样minhash的。我们有一种近似的minhash方法。处理过程如下:

    第一步初始化如下:

    然后看第一行,发现S1,S4的值为1,则变化,其他的不变。变化的值为右边的两列哈希值。矩阵变化成如下:

    接着看第二行,发现只有S3为1,则只S3变化,矩阵变成如下:

    再往下,依次类推,如果哈希值比原来的数大则不变,否则替换为更小的那个。

    最后变为:

    发现矩阵的列数没变但是行数变为了2,也就是哈希函数的个数。此时SIM(S1,S4)为1,因为两者相同嘛。而原来矩阵中SIM(S1,S4)=2/3,按照x/x+y公式计算来的。两者不是很接近。但是这是小数据量情况下,在大数据量情况下,效果是相当的。也就是说用这个signture可以很好的表征文档,然后计算相似度来衡量两个文档是否相似。

  • 相关阅读:
    sql总结:
    VS2008生成DLL文件的方法、引用dll文件以及意义
    Mysql日期和时间函数
    删除文件后硬盘可用空间为何不增加?
    C# CheckedListBox控件的用法
    SNMP监控一些常用OID的总结
    解决 MariaDB无密码就可以登录的问题
    Cisco路由器用SSH替代Telnet连接
    思科、华为、H3C常用命令对比大全
    转载:关于思科交换机、路由器如何关闭telnet 开启ssh服务
  • 原文地址:https://www.cnblogs.com/ahujack/p/3088790.html
Copyright © 2011-2022 走看看