simhash--ドキュメントの重み付けアルゴリズム

2763 ワード

最初に数学の美しさを読んだとき、本の中でこのアルゴリズムに言及しました.当時は関連する仕事をしたことがなく、具体的な印象はありませんでした.1年前に転職したときの面接でこのアルゴリズムに言及され、simhashがウェブページなど大量のデータの重複問題を解決できることを知り、効率的でした.
そして自分はたぶんこのアルゴリズムのpythonバージョンを実現して、試してみて、感じは悪くない、mark下
# coding=utf-8
import os

single_bits = {}
for x in xrange(32):
    single_bits[x] = 1 << x

print single_bits
def simhash(str):
    simhash_map = {}
    for x in xrange(32):
        simhash_map[x] = 0
    for c in str:
        h = hash(c)
        for bit in single_bits:
            if h & single_bits[bit] == 0:
                simhash_map[bit] -= 1
            else:
                simhash_map[bit] += 1
    result = 0
    for x in xrange(32):
        if simhash_map[x] > 0:
            result |= single_bits[x]

    return result

def haiming_dis(simhash1, simhash2):
    dis = 0
    sh = simhash1 ^ simhash2
    for x in xrange(32):
        if sh & (1 << x) > 0:
            dis += 1
    return dis

if __name__ == "__main__":
    str = "   ,              ,          ,            ,         、            。            ,               ,           。  ,   Google                      ,                          ,                              ,          。"
    str2 = "   ,              ,          ,            ,                 。            ,               ,           。  ,   baidu                      ,                          ,                              ,          。"
    sh1 = simhash(str)
    sh2 = simhash(str2)
    print sh1
    print sh2
    print haiming_dis(sh1, sh2)

出力結果:
3544471205
3540285093
2