最近在使用倒排索引来计算文档之间的相似度,这里说的文档并不是通常意义上说的文档形式,而是来源于互联网上面的页面,通过渲染得到DOM树之后,对页面进行前序遍历和后序遍历,最终产生页面的视觉块序列,然后基于一定的策略来对视觉块进行划分,得到每个页面的一系列视觉块序列作为页面的签名元素,根本的目的是为了计算页面之间的相似度,方法是基于字符串序列,之前的算法中匹配相似程度都比较低,究其原因是因为使用倒排索引Whoosh库的时候,使用的是完全匹配的策略,比如:如果说两个页面的序列完全相同的时候才把它加入到相似序列里面,这其实就相当于了文本相似度计算里面的,暴力关键字匹配的策略了,这样做其实是很不科学的,结果不好也是必然的了,很早就考虑了使用模糊匹配的方法来计算块之间的相似度,从而得到页面之间的相似度,只是总感觉这样做没有足够的科学依据,在这里,块序列将会作为最终的页面签名元素,但是块序列的产生并非可以足够充分地代表页面的内容,如果单纯地只是来计算两个字符串之间的相似度的话,比如“11000101”和“00001111”这两个序列之间的相似度的话,那么就可以使用两个序列对应位置的元素相同的数量来大致作为相似度的度量,这是可以接受的,这也就是简单的字符串序列的异或操作,我还在考虑,如何来更加有科学依据的计算两个签名元素之间的相似度。

    今天写这篇文章是因为看到网上的一道题目就是一个异或的题目,其实本质上还是计算字符串之间的相似度,实质是一样的,在这里,简单写了一个小程序,可以计算我上面提到的块序列之间的相似度:

#!/usr/bin/env python
#coding:utf-8
from __future__ import division
def similarity_cal():
    str_list = raw_input().split()
    str1=str_list[0]
    str2=str_list[1]
    counte=0
    for i in range(len(str1)):
        if str1[i]==str2[i]:
            counte+=1
    print 'similarity_cal result is:', counte/len(str1) 


while 1:
    similarity_cal()


下面是一些简单的结果:

123456 123459
similarity_cal result is: 0.833333333333
1100101000001111 1111000001011100
similarity_cal result is: 0.5
10101010101010101010 00001111111100000101
similarity_cal result is: 0.4