집합의 최소 해시 표현 두 분 해시 세트간에 공유 해시의 상대 번호로 주어진 인 Jaccard 유사성을 추정하는 효율적인 수단이다
import random
def minhash():
d1 = set(random.randint(0, 2000) for _ in range(1000))
d2 = set(random.randint(0, 2000) for _ in range(1000))
jacc_sim = len(d1.intersection(d2))/len(d1.union(d2))
print("jaccard similarity: {}".format(jacc_sim))
N_HASHES = 200
hash_funcs = []
for i in range(N_HASHES):
hash_funcs.append(universal_hashing())
m1 = [min([h(e) for e in d1]) for h in hash_funcs]
m2 = [min([h(e) for e in d2]) for h in hash_funcs]
minhash_sim = sum(int(m1[i] == m2[i]) for i in range(N_HASHES))/N_HASHES
print("min-hash similarity: {}".format(minhash_sim))
def universal_hashing():
def rand_prime():
while True:
p = random.randrange(2 ** 32, 2 ** 34, 2)
if all(p % n != 0 for n in range(3, int((p ** 0.5) + 1), 2)):
return p
m = 2 ** 32 - 1
p = rand_prime()
a = random.randint(0, p)
if a % 2 == 0:
a += 1
b = random.randint(0, p)
def h(x):
return ((a * x + b) % p) % m
return h
if __name__ == "__main__":
minhash()
LSH 단지 TLA이다. –
감사합니다. LSH와 Min Hash를 3 주 동안 읽었으므로 문제는 Google 뉴스 용지와 같이 손이 w explanation 거리는 설명이 아닙니다. –
내가 의미 한 바는 평균 3 글자 약자가 5 개 또는 6 개의 확장을 사용하므로 "LSH"가 의미하는 것을 정의해야합니다. –