Near Duplicate Documents Detection - aragorn/home GitHub Wiki

์ˆ˜์–ต๊ฑด ์ด์ƒ์˜ ๋ฌธ์„œ ์ง‘ํ•ฉ์—์„œ ์œ ์‚ฌ ๋ฌธ์„œ๋ฅผ ์ฐพ์•„ ๊ณ ์œ ํ•œ ์ค‘๋ณตID๋ฅผ ํ• ๋‹นํ•˜๋Š” ์‹œ์Šคํ…œ์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ๊ฒƒ์ธ์ง€ ์‚ดํŽด๋ณธ๋‹ค.

๋ฐฐ๊ฒฝ

๋‰ด์Šค, ๋ธ”๋กœ๊ทธ, ์›น๋ฌธ์„œ, ์ด๋ฏธ์ง€, ์‡ผํ•‘์ƒํ’ˆ ๋“ฑ์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒ€์ƒ‰์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, ์ˆ˜์–ต๊ฑด ์ด์ƒ์˜ ๋‹ค์ˆ˜ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰์—”์ง„์— ์ƒ‰์ธํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ฒŒ ๋œ๋‹ค. ๋‹ค์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ‰์ธํ•˜๋Š” ๊ฒฝ์šฐ, ์‹ค์งˆ์ ์œผ๋กœ ๋™์ผํ•œ ๋ฌธ์„œ ๋˜๋Š” ์œ ์‚ฌํ•œ ๋ฌธ์„œ๊ฐ€ ๋‹ค์ˆ˜ ์กด์žฌํ•˜๊ฒŒ ๋˜๋ฉฐ, ์ด๋Ÿฌํ•œ ์ค‘๋ณต ๋ฌธ์„œ๋“ค์€ ๊ฒ€์ƒ‰๊ฒฐ๊ณผ์˜ ํ’ˆ์งˆ์„ ๋–จ์–ด๋œจ๋ฆฌ๋Š” ์›์ธ์ด ๋œ๋‹ค. ๋™์‹œ์— ๋ฌธ์„œ์˜ ์ค‘๋ณต์„ ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ํŒ๋ณ„ํ•˜๋Š” ์ „์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์„ ๊ฐ–์ถ”๊ฒŒ ๋˜๋ฉด, ์ค‘๋ณต๋œ ๋ฌธ์„œ์˜ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์ฃผ์š” ๋žญํ‚น ์š”์†Œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐœ์š”

์ˆ˜์–ต๊ฑด ์ด์ƒ์˜ ๋ฌธ์„œ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์œ ์‚ฌ๋ฌธ์„œ ์Œ์„ ์ฐพ์•„๋‚ด๊ณ  ๊ณ ์œ ID ๋˜๋Š” ์›๋ณธ ๋ฌธ์„œ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์‹œ์Šคํ…œ์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•œ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ธก๋ฉด์—์„œ ๋‹ค์ฐจ์› ๊ณต๊ฐ„์—์„œ ๋‹ค์ˆ˜์˜ ๋ฒกํ„ฐ๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, ๋ชจ๋“  ๋ฒกํ„ฐ๋“ค์— ๋Œ€ํ•ด Nearest neighbour search ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•ด ๋‚ด๋Š” ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Locality sensitive hashing, Permutation and prefix matching ์„ ์ ์šฉํ•˜์—ฌ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•œ๋‹ค. ๋†’์€ ์ •ํ™•๋„, ์žฌํ˜„๋ฅ ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด, Locality sensitive hashing ๊ณผ ๋ณ‘ํ–‰ํ•˜์—ฌ ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋†’์€ ๋น„๊ต ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์กฐํ•ฉํ•˜๋Š” ๊ธฐ์ˆ ์  ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•œ๋‹ค. ์•„์šธ๋Ÿฌ, ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์‹œ์Šคํ…œ์˜ ํ’ˆ์งˆ์„ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ˆ˜์ž‘์—… ์ •๋‹ต๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •ํ™•๋ฅ , ์žฌํ˜„๋ฅ ์„ ์ธก์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•œ๋‹ค.

๋ชฉ์ฐจ

๋ฌธ์„œ ๋‹จ์œ„๋กœ ์œ ์‚ฌ ์ค‘๋ณต์„ ํŒ๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ…์ŠคํŠธ๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์„œ์—์„œ ์œ ์‚ฌ ์ค‘๋ณต์„ ํŒ๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ๋‹ค. ์ด ๊ฐ€์šด๋ฐ, ๋จผ์ € ํ•œ ์Œ์˜ ๋ฌธ์„œ์— ๋Œ€ํ•ด ์œ ์‚ฌ ์ค‘๋ณต์„ ํŒ๋ณ„ํ•˜๋Š”๋ฐ ์žˆ์–ด, ๋†’์€ ์ •ํ™•๋ฅ (Precision), ์žฌํ˜„๋ฅ (Recall) ์„ ๋ณด์—ฌ์ฃผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•œ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์„œ๋ฅผ ๋‹จ์–ด ๋‹จ์œ„๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ Bag of Words ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, ์ด๋Š” ๋ฌธ์žฅ ๋‚ด์˜ ๋‹จ์–ด ๊ตฌ์„ฑ์ด ์œ ์‚ฌํ•˜๋ฉด, ์‹ค์งˆ์ ์œผ๋กœ ์ƒ๋‹นํžˆ ๋‹ค๋ฅธ ๋ฌธ์žฅ์ด๋”๋ผ๋„ ์œ ์‚ฌ๋„๊ฐ€ ๋†’๊ฒŒ ์ธก์ •๋˜๋Š” ์ œ์•ฝ์ด ์žˆ๋‹ค.

ํ‘œ์ ˆ, ์Šคํฌ๋žฉ, ์ผ๋ถ€ ๋‹จ์–ด๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์–ด๋ทฐ์ง• ํฌ์ŠคํŒ…, ๋ฏธ๋Ÿฌ๋ง ํŽ˜์ด์ง€ ๋“ฑ ์‹ค์งˆ์ ์œผ๋กœ ๋ฌธ์žฅ ๊ตฌ์„ฑ์ด ๊ฑฐ์˜ ์œ ์‚ฌํ•œ ํ…์ŠคํŠธ์˜ ์ค‘๋ณต์„ ํŒ๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์–ด์ ˆ ๋‹จ์œ„์˜ Shingle ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ๋‹นํ•˜๋‹ค. ํ•œ๊ตญ์–ด ํ…์ŠคํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‹คํ—˜ํ•œ ๊ฒฐ๊ณผ, ๋ฌธ์žฅ๋ถ€ํ˜ธ๋ฅผ ์ œ๊ฑฐํ•œ ์–ด์ ˆ ๋‹จ์œ„ Trigram Shingle ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์ •ํ™•์œจ๊ณผ ์žฌํ˜„์œจ์ด ๋ชจ๋‘ ๋†’๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์–ด์ ˆ ๋‹จ์œ„ Trigram Shingle ์„ ์ ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฌธ์„œ ๋‚ด์—์„œ ๊ฐœ๋ณ„ feature ๋Š” Trigram Shingle ์„ ์‚ฌ์šฉํ•˜๊ณ , ์œ ์‚ฌ๋„๋Š” ์ด feature๋“ค์„ ๋Œ€์ƒ์œผ๋กœ Jaccard similarity coefficient๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

Jaccard similarity coefficient ๋Š” ์œ ์‚ฌ๋„ ๊ณ„์‚ฐ ๊ณผ์ •์„ ์ง์ ‘ ํ™•์ธํ•˜๊ณ , ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค.

์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฃผ์š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • Cosine similarity

    ์ข์€ ์˜๋ฏธ์˜ cosine similarity๋Š” ๋‘ ๋ฒกํ„ฐ์˜ ๋‚ด์ ์„ ๋‘ ๋ฒกํ„ฐ์˜ ์ ˆ๋Œ€๊ฐ’์œผ๋กœ ๋‚˜๋ˆˆ ๊ฐ’์ด๋‹ค. ๋‘ ๋ฒกํ„ฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฐฉํ–ฅ์ด ์ผ์น˜ํ•˜๋Š”์ง€ ์ •๋„๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ฐ’์ด๋‹ค. ํ…์ŠคํŠธ ๋ฌธ์„œ๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, cosine similarity ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ ๋ฌธ์„œ ๋‚ด์˜ ๋‹จ์–ด๋ฅผ ๋ฒกํ„ฐ ๊ณต๊ฐ„์˜ ๊ธฐ์ €(base)๋กœ ๊ฐ„์ฃผํ•˜๊ณ , ์ด ๋‹จ์–ด๋“ค์˜ ์ถœํ˜„ ๋นˆ๋„๋ฅผ ๋ฒกํ„ฐ ์„ฑ๋ถ„(vector component)์˜ ํฌ๊ธฐ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค๋ฅธ ๋ง๋กœ ํ‘œํ˜„ํ•˜๋ฉด, term frequency vector ๋ผ ํ‘œํ˜„ํ•œ๋‹ค.

    Cosine similarity ์˜ ํŠน์ง•์€ ๋ฒกํ„ฐ ์„ฑ๋ถ„์˜ ํฌ๊ธฐ๊ฐ€ ๋น„์Šทํ•œ ์ •๋„๋ฅผ ์กด์ค‘ํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ๋ฌธ์„œ๋“ค์—์„œ ๋™์ผ ๋‹จ์–ด๊ฐ€ ๋‚˜ํƒ€๋‚ฌ๋”๋ผ๋„, ๊ทธ ์ถœํ˜„ ๋นˆ๋„๊ฐ€ ์œ ์‚ฌํ•œ ๊ฒฝ์šฐ, ๋” ๋†’์€ ์œ ์‚ฌ๋„ ์ ์ˆ˜๋ฅผ ๊ฐ–๋Š” ํŠน์ง•์„ ๊ฐ–๋Š”๋‹ค. ๋ฐ˜๋ฉด์— ๋‹จ์–ด์˜ ์ถœํ˜„ ์ˆœ์„œ๋Š” ์œ ์‚ฌ๋„์— ๋ฌด๊ด€ํ•˜๋‹ค.

    Cosine similarity ๋Š” 0 ~ 1 ์‚ฌ์ด์˜ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.

  • Edit distance

    ๋‘ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด์— ๋ช‡ ๋ฒˆ์˜ ์ˆ˜์ • ์—ฐ์‚ฐ์„ ์ ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ˜•์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ด์–ด, ๊ทธ ์ตœ์†Œ ์ˆ˜์ • ์—ฐ์‚ฐ์˜ ํšŸ์ˆ˜๋กœ ๋ฌธ์ž์—ด์˜ ๋‹ค๋ฅธ ์ •๋„ ๋˜๋Š” ๋น„์Šทํ•œ ์ •๋„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํŽธ์ง‘ ๊ฑฐ๋ฆฌ(Edit distance)๋ผ๊ณ  ํ•œ๋‹ค.

    Edit distance ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ์—๋Š” ๋ฌธ์ž์—ด์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฌธ์ž ๋˜๋Š” ๊ธฐํ˜ธ์˜ ์ตœ์†Œ๋‹จ์œ„๊ฐ€ ์ •์˜๋˜์–ด์•ผ ํ•œ๋‹ค. ํ•œ๊ธ€์˜ ๊ฒฝ์šฐ๋Š” ์ž์†Œ, ์Œ์ ˆ, ์–ด์ ˆ ๋‹จ์œ„๋ฅผ ์ตœ์†Œ๋‹จ์œ„๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜์–ด์˜ ๊ฒฝ์šฐ์—๋Š” ์•ŒํŒŒ๋ฒณ, ๋‹จ์–ด๋ฅผ ์ตœ์†Œ๋‹จ์œ„๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ํŽธ์ง‘ ์—ฐ์‚ฐ์„ ์ ์ ˆํžˆ ์ •์˜ํ•˜๋Š” ๊ฒƒ๋„ ํ•„์š”ํ•˜๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” Levenshtein distance์˜ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, edit distance ๋ผ๊ณ  ํ•˜๋ฉด ๋ณดํ†ต์€ Levenshtein distance ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. Levenshtein distance ์—์„œ๋Š” ๊ธฐํ˜ธ์— ๋Œ€ํ•œ ์‚ฝ์ž…, ์‚ญ์ œ, ๋Œ€์ฒด, ์„ธ ๊ฐ€์ง€ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฐ ์—ฐ์‚ฐ์˜ ๋น„์šฉ์„ ๋™์ผํ•˜๊ฒŒ ๋ณผ ์ˆ˜๋„ ์žˆ๊ณ , ์ ๋‹นํ•œ ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

    Edit distance ๋ฅผ ์ด์šฉํ•ด ๋‘ ์ž…๋ ฅ์˜ ์œ ์‚ฌ๋„๋ฅผ 0 ~ 1 ์‚ฌ์ด๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ˆ˜ํ•™์ ์œผ๋กœ ์˜๋ฏธ๊ฐ€ ์—†์–ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. Edit distance ๋Š” 0 ์ด์ƒ์˜ ๊ฐ’์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค.

  • Longest common subsequence

    ์—ฌ๋Ÿฌ ์•„์ดํ…œ์„ ๊ฐ–๋Š” ์ˆœ์„œ๋ฅผ ๊ฐ€์ง„ ๋‚˜์—ด(์ˆœ์„œ์—ด, sequence)์ด ๋‘ ๊ฐœ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์•„์ดํ…œ์ด ์ถœํ˜„ํ•œ ์ˆœ์„œ๊ฐ€ ๋‘ ๋‚˜์—ด์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์กด์žฌํ•˜๋ฉด์„œ, ๊ฐ€์žฅ ๊ธธ์ด๊ฐ€ ๊ธด ์ˆœ์„œ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์ง๊ด€์ ์œผ๋กœ ๊ฐ„๋‹จํžˆ ์ดํ•ดํ•˜๊ฒ ๋‹ค๋ฉด, ์œ ๋‹‰์Šค์˜ ํ‘œ์ค€ ๋„๊ตฌ์ธ diff(1)์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด๋ฉด ๋œ๋‹ค. Edit distance ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ, ์‚ฝ์ž…, ์‚ญ์ œ, ๋‘ ๊ฐ€์ง€ ์—ฐ์‚ฐ๋งŒ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™๋“ฑํ•œ ๋ฌธ์ œ์ด๊ธฐ๋„ ํ•˜๋‹ค.

    diff(1)์˜ ๊ฒฝ์šฐ, ์•„์ดํ…œ ๋‹จ์œ„๋ฅผ ํ…์ŠคํŠธ ํŒŒ์ผ์˜ ์ค„(line)๋กœ ๋ณด๋Š” ๊ฒƒ์ด๋‹ค. ๋‘ ํ…์ŠคํŠธํŒŒ์ผ์—์„œ ์–ด๋–ค ์ค„์˜ ๋ฌธ์ž์—ด์ด ์ผ์น˜ํ•˜๋ฉด ๋™์ผํ•œ ์•„์ดํ…œ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ , ์ค„ ๋‹จ์œ„๋กœ ์‚ฝ์ž…, ์‚ญ์ œ ์—ฐ์‚ฐ์„ ๊ณ„์‚ฐํ•˜๊ฒŒ ๋œ๋‹ค. ํ…์ŠคํŠธ์˜ ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ, ์˜์–ด๋Š” ๋‹จ์–ด๋‚˜ ์•ŒํŒŒ๋ฒณ, ํ•œ๊ตญ์–ด๋Š” ์–ด์ ˆ, ์Œ์ ˆ, ์ž์†Œ ๋“ฑ์„ ์•„์ดํ…œ ๋‹จ์œ„๋กœ ์‚ผ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ ์œ ์‚ฌ๋„ ๊ณ„์‚ฐ๊ฐ’์ด ๋‹ฌ๋ผ์งˆ ๊ฒƒ์ด๋ฏ€๋กœ, ์˜๋„ํ•˜๋Š” ๋ชฉ์ ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์•„์ดํ…œ ๊ธฐ์ค€์„ ์žก์•„์•ผ ํ•œ๋‹ค.

    diff(1) ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜ต์…˜์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ, ๋‘ ํŒŒ์ผ์˜ Longest common subsequence ๋งŒ์„ ์ถœ๋ ฅํ•ด์„œ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    diff --old-line-format='' --new-line-format='' --unchanged-line-format='%L' file1.txt file2.txt

    Longest common subsequence๋Š” Longest common substring ๊ณผ ๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ, ๋‹ค๋ฅธ ๋ฌธ์ œ์ด๋‹ค. ์ „์ž๋Š” ์•„์ดํ…œ์˜ ์ถœํ˜„ ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•˜๋ฉด ๋˜๊ณ , ๊ทธ ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ์•„์ดํ…œ์ด ์‚ฝ์ž…๋˜์–ด ์žˆ์–ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ํ›„์ž๋Š” substring ์ด๊ธฐ์—, ์•„์ดํ…œ์˜ ์ถœํ˜„ ์‚ฌ์ด์— ๋‹ค๋ฅธ ์•„์ดํ…œ์ด ์‚ฝ์ž…๋˜์–ด ์žˆ์œผ๋ฉด ์•ˆ ๋œ๋‹ค.

    Longest common subsequence ๋ฅผ ๊ตฌํ•œ ๊ฒฝ์šฐ, ์ˆœ์„œ์—ด x์˜ ๊ธธ์ด๋ฅผ |x|๋ผ ํ‘œํ˜„ํ•  ๋•Œ, Resemblance(A, B) = |LCS| / ( |A| + |B| - |LCS| ) ๊ฐ€ ๋œ๋‹ค. ์ฆ‰, LCS๊ธธ์ด๋ฅผ (A๊ธธ์ด + B๊ธธ์ด - LCS๊ธธ์ด) ๋กœ ๋‚˜๋ˆˆ ๊ฐ’์ด๋‹ค.

    Longest common subsequence ๊ธฐ๋ฐ˜์˜ Resemblance ๋Š” 0 ~ 1 ์‚ฌ์ด์˜ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.

  • Hamming distance

    ๊ธธ์ด๊ฐ€ ๋™์ผํ•œ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ๊ฐ ์œ„์น˜์˜ ๋ฌธ์ž๊ฐ€ ๋™์ผํ•˜์ง€ ์•Š์€ ๊ฒƒ์˜ ๊ฐฏ์ˆ˜๋ฅผ Hamming distance๋ผ ํ•œ๋‹ค. ์ด๋ก ์ ์œผ๋กœ๋Š” ๋น„๊ตํ•˜๋Š” ๋Œ€์ƒ์ด ๋ฌธ์ž ๋˜๋Š” ๊ธฐํ˜ธ์ด๊ณ , ๋ฌธ์ž๋‚˜ ๊ธฐํ˜ธ(symbol)๋ฅผ ํ•„์š”์— ๋”ฐ๋ผ ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์‘์šฉ์‚ฌ๋ก€์—์„œ๋Š” ์ด์ง„ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋ฉฐ, bit ๋‹จ์œ„๋กœ ๋™์ผํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค. ์ฆ‰, ๊ธฐํ˜ธ๋ฅผ bit ๋กœ ๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

    long d1  = 0b0100_1010_1000_1110_1001_0100_1001_0010
    long d2  = 0b1100_1110_1000_1010_1001_0100_1011_0010
    
    d1 ^ d2 == 0b1000_0100_0000_0100_0000_0000_0010_0000
    hamming_distance(d1, d2) == hamming_weight( d1 ^ d2 ) == 4
    

    ์œ„์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ๊ธธ์ด๊ฐ€ ๋™์ผํ•œ ๋‘ ๊ฐ’์„ Binary String ๊ฐ„์ฃผํ•˜๊ณ , ๋‘ ๋ฌธ์ž์—ด์˜ XOR ์„ ๊ณ„์‚ฐํ•œ ํ›„, ๋น„ํŠธ๊ฐ’ 1์˜ ๊ฐฏ์ˆ˜๋ฅผ ์„ผ ๊ฐ’์ด Hamming distance ์ด๋‹ค.

  • Jaccard index

    ์ฃผ์–ด์ง„ ๋‘ ์ง‘ํ•ฉ์—์„œ ํ•ฉ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ ๋Œ€๋น„ ๊ต์ง‘ํ•ฉ์˜ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•œ ๊ฐ’์ด๋‹ค. Jaccard(A, B) = | ๊ต์ง‘ํ•ฉ(A,B) | / | ํ•ฉ์ง‘ํ•ฉ(A,B) |๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•  ๋•Œ์—๋Š” ๋ฌธ์ž์—ด์„ ์ ์ ˆํ•œ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์›์†Œ๋กœ ๊ฐ„์ฃผํ•˜์—ฌ, ์ด ์›์†Œ๋“ค์˜ ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์˜๋ฌธ์˜ ๊ฒฝ์šฐ์—๋Š” ๋‹จ์–ด๋ฅผ ์›์†Œ๋กœ ๊ฐ„์ฃผํ•˜๋Š” ๋ฐฉ์‹์„ ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๋ฌธ์ž์—ด์„ ์ง‘ํ•ฉ์œผ๋กœ ์น˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฌธ์ž์—ด ๋‚ด์˜ ๋‹จ์–ด ์ถœํ˜„ ์ˆœ์„œ๋ฅผ ๋ฌด์‹œํ•˜๊ฒŒ ๋˜๋Š” ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

    Jaccard index ๋Š” 0 ~ 1 ์‚ฌ์ด์˜ ๊ฐ’์„ ๊ฐ€์ง€๋ฉฐ, ๋™์ผํ•œ ๋‘ ์ง‘ํ•ฉ์˜ Jaccard index ๋Š” 1 ์ด ๋œ๋‹ค.

  • Euclidean distance

    2์ฐจ์› ๊ณต๊ฐ„ ๋˜๋Š” 3์ฐจ์› ๊ณต๊ฐ„์—์„œ ์ผ์ƒ์ƒํ™œ์—์„œ ์ธ์ง€ํ•˜๋Š” ๋‘ ์žฅ์†Œ์˜ ๊ฑฐ๋ฆฌ์ด๋‹ค. ๋‹ค์ฐจ์› ๊ณต๊ฐ„์„ ๋‹ค๋ฃฐ ๋•Œ์—๋Š” Euclidean distance ๊ฐ€ ์œ ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋ณดํ†ต ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ž์„ธํ•œ ๊ฒƒ์€ Why is Euclidean distance not a good metric in high dimensions? ๋ผ๋Š” ์งˆ์˜ ์‘๋‹ต์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋„์›€์ด ๋œ๋‹ค.

  • ์š”์•ฝ

    ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์œ ์‚ฌ๋„ ๊ณ„์‚ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉฐ, ์ด ๊ฐ€์šด๋ฐ ์–ด๋А ๊ฒƒ์ด ์šฐ์›”ํ•˜๊ฑฐ๋‚˜ ๋” ์ข‹๋‹ค๊ณ  ์ผ๋ฐ˜ํ™”ํ•  ์ˆ˜ ์—†๋‹ค. ํ•„์š”ํ•œ ์‘์šฉ ์‚ฌ๋ก€์— ๊ฐ€์žฅ ์ ์ ˆํ•œ ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํŠน์ง•์„ ์ž˜ ํŒŒ์•…ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

    ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์œ ์‚ฌ๋„๊ฐ’ ์ˆœ์„œ ๋นˆ๋„ ๊ธธ์ด ์ œ์•ฝ
    Cosine similarity 0 ~ 1 Ignored Respected No
    Levenshtein distance 0 ์ด์ƒ ๊ฑฐ๋ฆฌ Respected Respected No
    Longest common subsequence 0 ~ 1 Respected Respected No
    Hamming distance 0 ์ด์ƒ ๊ฑฐ๋ฆฌ Respected Respected Yes
    Jaccard index 0 ~ 1 Ignored Ignored No

    ์œ„ ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    • ์œ ์‚ฌ๋„๊ฐ’ : 0 ~ 1 ์‚ฌ์ด์˜ ์œ ์‚ฌ๋„๊ฐ’์„ ์–ป๋Š”์ง€, ๋˜๋Š” 0 ์ด์ƒ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์–ป๋Š”์ง€ ์—ฌ๋ถ€.
    • ์ˆœ์„œ : ์œ ์‚ฌ๋„๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ๊ฐœ๋ณ„ feature ๋“ค์˜ ์ถœํ˜„ ์ˆœ์„œ๊ฐ€ ์œ ์‚ฌ๋„์— ๋ฐ˜์˜๋˜๋ฉด Respected, ์•„๋‹ˆ๋ฉด Ignored.
      • Jaccard index ๋Š” ์ง‘ํ•ฉ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ์— feature ์˜ ์ถœํ˜„ ์ˆœ์„œ๋ฅผ ๋ฌด์‹œํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, Shingle ๊ณผ ๊ฐ™์€ ๊ธฐ๋ฒ•์œผ๋กœ feature ์˜ ์ถœํ˜„ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋ฌถ์Œ์„ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด, feature ์˜ ์ถœํ˜„ ์ˆœ์„œ๋ฅผ ์œ ์‚ฌ๋„์— ๋ฐ˜์˜ํ•˜๊ฒŒ ๋˜๋Š” ํšจ๊ณผ๋ฅผ ์–ป๊ฒŒ ๋œ๋‹ค.
    • ๋นˆ๋„ : ์œ ์‚ฌ๋„๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ๊ฐœ๋ณ„ feature ๋“ค์˜ ์ถœํ˜„ ๋นˆ๋„๊ฐ€ ์œ ์‚ฌ๋„์— ๋ฐ˜์˜๋˜๋ฉด Respected, ์•„๋‹ˆ๋ฉด Ignored.
      • ์ˆœ์„œ๊ฐ€ ์œ ์‚ฌ๋„์— ๋ฐ˜์˜๋˜๋ฉด, ๋นˆ๋„๊ฐ€ ์œ ์‚ฌ๋„์— ๋ฐ˜์˜๋˜๋Š” ๊ฒƒ์€ ๋‹น์—ฐํ•˜๋‹ค.
    • ๊ธธ์ด ์ œ์•ฝ : ๋น„๊ต ๋Œ€์ƒ ๊ฐ’์˜ ๊ธธ์ด๊ฐ€ ๊ฐ€๋ณ€ ๊ธธ์ด์ด๊ฑฐ๋‚˜ ์„œ๋กœ ๋‹ฌ๋ผ๋„ ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋กœ Hamming distance ๋Š” ๊ธธ์ด๊ฐ€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.

์—ฌ๋Ÿฌ ๋ฌธ์„œ์˜ ์œ ์‚ฌ ์ค‘๋ณต ๊ณ„์‚ฐ์˜ ๋ณต์žก๋„

Bag of Words ๋ฅผ ์ ์šฉํ•˜๋“ , Trigram Shingle ์„ ์ ์šฉํ•˜๋“ , ๋ฌธ์„œ ๋‹จ์œ„์˜ ์œ ์‚ฌ ์ค‘๋ณต ๊ณ„์‚ฐ ๋ฐฉ์‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฃผ์–ด์ง„ ํ•œ ์Œ์˜ ๋ฌธ์„œ์— ๋Œ€ํ•ด ์œ ์‚ฌ๋„๋ฅผ ์ธก์ •ํ•œ๋‹ค. N๊ฐœ์˜ ๋ฌธ์„œ์ง‘ํ•ฉ์ด ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, ๋ชจ๋“  ๋ฌธ์„œ์— ๋Œ€ํ•ด ์„œ๋กœ ์œ ์‚ฌ๋„๋ฅผ ์ธก์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด๋ฉฐ, ์ด ๊ฒฝ์šฐ N x ( N - 1 )์˜ time complexity ๋ฅผ ๊ฐ–๋Š” ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ์ˆ˜๋งŒ ๊ฑด ์ด์ƒ์˜ ๋ฌธ์„œ ์ง‘ํ•ฉ์— ๋Œ€ํ•ด์„œ๋Š” ์‹ค์งˆ์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์—†๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๋‹ค์ฐจ์› ๊ณต๊ฐ„์—์„œ Nearest neighbor search ๋ฌธ์ œ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ฐ€์šด๋ฐ, ์‹ค์šฉ์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ Locality sensitive hashing์ด ์ž˜ ์•Œ๋ ค์ ธ ์žˆ๋‹ค. Locality sensitive hashing ์€ ๋‹ค์ฐจ์› ๋ฒกํ„ฐ์˜ ์ฐจ์›์„ ์ถ•์†Œ์‹œ์ผœ ๊ณ„์‚ฐ๋Ÿ‰์„ ์ค„์ด๋Š” ๊ธฐ๋ฒ•์ด๋ฉฐ, ์ฐจ์›์„ ์ถ•์†Œ์‹œํ‚ค๋Š” hash function ์„ ์ ์šฉ์‹œํ‚ฌ ๋•Œ, ์•”ํ˜ธํ™” hash ์™€ ๋‹ฌ๋ฆฌ, ์œ ์‚ฌํ•œ ํ•ญ๋ชฉ๋“ค์˜ ์ถฉ๋Œ ํ™•๋ฅ ์ด ๋†’์ด๋Š” hash function ์„ ์ ์šฉํ•œ๋‹ค. hash value ์„ ๋„์ถœํ•œ ํ›„์—๋Š”, ์ด hash value ์‚ฌ์ด์˜ hamming distance ๊ฐ€ ๊ฐ€๊นŒ์šด ๊ฒƒ์„ ์œ ์‚ฌํ•œ ํ•ญ๋ชฉ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Locality sensitive hashing ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์œผ๋กœ MinHash(min-wise independent permutations), SimHash ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์•Œ๋ ค์ ธ ์žˆ๋Š”๋ฐ, ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๋ฉด์„œ ์ถฉ๋ถ„ํžˆ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ SimHash ๊ฐ€ ์ ๋‹นํ•˜๋‹ค.

SimHash ๊ณ„์‚ฐ ๋ฐฉ๋ฒ•

SimHash ๊ณ„์‚ฐ ๋ฐฉ๋ฒ•์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ์˜ ์Šฌ๋ผ์ด๋“œ๋กœ ์š”์•ฝ๋œ๋‹ค.

Detecting Near-Duplicates for Web Crawling - Kunwar Aditya Raghuwanshi

  • ๋ฌธ์„œ์—์„œ feature, weight ๋ฅผ ์ถ”์ถœํ•œ๋‹ค. ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ feature, weight ๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ํ•œ๊ตญ์–ด ๋ฌธ์„œ์˜ ๊ฒฝ์šฐ, ๋ฌธ์žฅ๋ถ€ํ˜ธ๋ฅผ ์ œ์™ธํ•œ Trigram Shingle ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ, weight ๋Š” ์˜๋ฏธ๊ฐ€ ์—†์–ด์ง„๋‹ค. ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” Inverse Document Frequency ์™€ ๊ฐ™์€ weight๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, Trigram Shingle ์˜ ๊ฒฝ์šฐ์—๋Š” IDF ๊ฐ€ ์˜๋ฏธ๊ฐ€ ์—†์–ด์ง€๊ธฐ์— 1 ๋กœ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, weight ๋ฅผ ์ ์ ˆํžˆ ํ• ๋‹นํ•˜์—ฌ ์„ฑ๋Šฅ์ผ ๋†’์ด๊ฒ ๋‹ค๋ฉด, ์‹คํ—˜์„ ํ†ตํ•ด ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

    • "SimHash ๊ณ„์‚ฐ ๋ฐฉ๋ฒ•์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ์˜ ์Šฌ๋ผ์ด๋“œ๋กœ ์š”์•ฝ๋œ๋‹ค."๋ผ๋Š” ๋ฌธ์žฅ์ด ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, Trigram Shingle์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

      ```Groovy
      [
        'SimHash ๊ณ„์‚ฐ ๋ฐฉ๋ฒ•์„',
        '๊ณ„์‚ฐ ๋ฐฉ๋ฒ•์„ ๊ฐ„๋‹จํžˆ',
        '๋ฐฉ๋ฒ•์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๋ฉด',
        '๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ์˜',
        '์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ์˜ ์Šฌ๋ผ์ด๋“œ๋กœ',
        '๋‹ค์Œ์˜ ์Šฌ๋ผ์ด๋“œ๋กœ ์š”์•ฝ๋œ๋‹ค'
      ]
      ```
      
  • feature ์— ๋Œ€ํ•ด ์ ๋‹นํ•œ hash function ์„ ์ ์šฉํ•œ๋‹ค. ์ตœ์ข…์ ์œผ๋กœ 64bit fingerprint ๋ฅผ ์–ป๊ฒ ๋‹ค๋ฉด, ์ด ๋‹จ๊ณ„์—์„œ 64bit hash value๋ฅผ ์–ป์–ด์•ผ ํ•œ๋‹ค. MD5, SHA1 ๋“ฑ ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ๋ ค์ง„ ์•”ํ˜ธํ™” hash๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Trigram Shingle์— MD5๋ฅผ ์ ์šฉํ•˜๊ฒ ๋‹ค๋ฉด, 'SimHash ๊ณ„์‚ฐ ๋ฐฉ๋ฒ•์„'์™€ ๊ฐ™์€ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด MD5 digest๋ฅผ ์–ป์€ ํ›„, ์ƒ์œ„ 64bit ๋˜๋Š” ํ•˜์œ„ 64bit ์„ ์„ ํƒํ•˜๋ฉด ๋œ๋‹ค.

  • ์—ฌ๋Ÿฌ feature ์— ๋Œ€ํ•ด ์–ป์€ 64bit hash value ์— ๋Œ€ํ•ด, ๋น„ํŠธ ๋‹จ์œ„๋กœ 0 ๋˜๋Š” 1 ์˜ ๊ฐ’์„ ๊ฐ–๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค. 64bit hash value๋ฅผ ๊ณ„์‚ฐํ•˜์˜€์œผ๋ฏ€๋กœ, 64๊ฐœ์˜ 0 ๋˜๋Š” 1์˜ ๊ฐ’์„ ๊ฐ–๋Š” ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ฐ feature ๋ณ„๋กœ ๋งŒ๋“ค์–ด์งˆ ๊ฒƒ์ด๋‹ค.

  • ์—ฌ๋Ÿฌ feature ์˜ 0 ๋˜๋Š” 1์˜ ๊ฐ’์„ ๊ฐ–๋Š” ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด, 1์€ +weight, 0์€ -weight๋กœ ๊ฐ„์ฃผํ•˜์—ฌ, ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ™์€ ์œ„์น˜์˜ ๊ฐ’๋“ค์„ ํ•ฉ์‚ฐํ•œ๋‹ค. ์Šฌ๋ผ์ด๋“œ์˜ ์˜ˆ์‹œ๋ฅผ ์„ค๋ช…ํ•œ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    • 13 = +w1 + w2 + ... - wn
    • 108 = -w1 + w2 + ... - wn
    • -22 = -w1 - w2 + ... + wn
    • -5 = +w1 - w2 + ... - wn
    • -32 = +w1 - w2 + ... - wn
    • 55 = -w1 - w2 + ... + wn
  • ํ•ฉ์‚ฐ๋œ ๊ฐ’๋“ค์„ ๋‹ค์‹œ 1, 0 ์˜ ๋น„ํŠธ๋ฒกํ„ฐ๋กœ ์ „ํ™˜ํ•œ๋‹ค. 0 ์ด์ƒ์˜ ๊ฐ’์€ 1, 0 ๋ฏธ๋งŒ์˜ ๊ฐ’์€ 0 ์œผ๋กœ ์น˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์„ ์ ์šฉํ•˜๋ฉด ๋œ๋‹ค. ๊ฒฝ๊ณ„๊ฐ’์ธ 0์— ๋Œ€ํ•ด 1 ๋˜๋Š” 0 ์–ด๋А ๊ฒƒ์„ ํ• ๋‹นํ•˜์—ฌ๋„ ๋ฌด๋ฐฉํ•˜๋‚˜, ๋ณดํ†ต์€ 0 ์ด์ƒ์˜ ๊ฐ’์— ๋Œ€ํ•ด 1์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค.

  • ์ด ๋น„ํŠธ๋ฒกํ„ฐ๋ฅผ SimHash fingerprint ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

Hamming distance of hash value

SimHash fingerprint ๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด, ์ด fingerprint ๋ฅผ ์ด์šฉํ•ด ์œ ์‚ฌํ•œ ์ •๋„ ๋˜๋Š” ๋‹ค๋ฅธ ์ •๋„๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‘ fingerprint์˜ Hamming distance๋ฅผ ๋‹ค๋ฅธ ์ •๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ฃผ์–ด์ง„ ๋‘ ํ•ด์‹œ๊ฐ’์˜ hamming distance ๋Š” ๋‘ ๊ฐ’์˜ XOR ๊ฐ’์—์„œ hamming weight ๋˜๋Š” population count ๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด ๋œ๋‹ค.

long d1  = 0b0100_1010_1000_1110_1001_0100_1001_0010
long d2  = 0b1100_1110_1000_1010_1001_0100_1011_0010

d1 ^ d2 == 0b1000_0100_0000_0100_0000_0000_0010_0000
hamming_weight( d1 ^ d2 ) == 4

SimHash fingerprint ๊ฐ€ ์ข‹์€ ํ’ˆ์งˆ์˜ locality sensitive hashing ์ด๋ผ๋Š” ๊ฒƒ์˜ ์˜๋ฏธ๋Š”, 64bit fingerprint๋ฅผ ๊ธฐ์ค€์œผ๋กœ hamming distance 3~4 ์ด๋‚ด์ธ ์Œ์„ ์œ ์‚ฌ์ค‘๋ณต์œผ๋กœ ๊ฐ„์ฃผํ•  ๋•Œ, Precision๊ณผ Recall์ด ๋†’๊ฒŒ ๋‚˜์˜จ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์‹ค์ œ ๊ตฌํ˜„ํ•œ SimHash fingerprint ๊ฐ€ ๊ทธ๋Ÿฐ ํŠน์„ฑ์„ ๊ฐ–๋Š”์ง€, ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ๊ฒ€์ฆํ‰๊ฐ€ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” 64bit fingerprint ๋ฅผ ๊ธฐ์ค€์œผ๋กœ hamming distance 3, 4 ๋˜๋Š” 5 ์ด๋‚ด์ธ ๊ฒƒ์„ ์œ ์‚ฌ ์ค‘๋ณต์œผ๋กœ ๊ฐ„์ฃผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ์–ด๋–ค ๊ฐ’์„ threshold ๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€๋Š” ํ’ˆ์งˆ ์ธก์ •์„ ํ†ตํ•ด ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋‚˜, Recall ์„ ๋†’์ด๊ฒ ๋‹ค๋ฉด ํฐ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ , Precision ์„ ๋†’์ด๊ฒ ๋‹ค๋ฉด ์ž‘์€ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

๊ฐ€๋ณ€๊ธธ์ด์ธ ๋ณธ๋ฌธ ์ „์ฒด์— ๋Œ€ํ•ด Bag of Words ๋˜๋Š” Trigram Shingle ๊ธฐ๋ฐ˜์œผ๋กœ Jaccard index ๋ฅผ ์ด์šฉํ•ด ์ค‘๋ณต ์ •๋„๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋‹ฌ๋ฆฌ, Fingerprint ์˜ Hamming distance ๋กœ ์œ ์‚ฌ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์„œ ๋‹จ์œ„๋กœ 8byte ์ •๋„์˜ ์งง์€ ๊ณ ์ •๊ธธ์ด ๊ฐ’์„ ์ด์šฉํ•ด ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ์—ฌ๋Ÿฌ ๋ฌธ์„œ์— ๋Œ€ํ•ด ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๋‹จ์ˆœํ•˜๊ฒŒ ์ ‘๊ทผํ•  ๊ฒฝ์šฐ N x ( N - 1 )์˜ time complexity๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ๋™์ผํ•˜๋‹ค.

Hamming weight ๊ณ„์‚ฐ์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜, POPCNT ๋“ฑ์˜ CPU hardware instruction์ด ์•Œ๋ ค์ ธ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Hadoop์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์„ฑ๋Šฅ ์ฐจ์ด๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

Large scale similarity calculation by permutation and prefix matching

์ฐธ๊ณ  : Gurmeet Singh, Manku; Das Sarma, Anish (2007), "Detecting near-duplicates for web crawling", Proceedings of the 16th international conference on World Wide Web. ACM,. (http://www.wwwconference.org/www2007/papers/paper215.pdf)

์—ฌ๋Ÿฌ ๋ฌธ์„œ์˜ 64bit fingerprint ๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, hamming distance 4 ์ด๋‚ด๋ฅผ ์œ ์‚ฌ ์ค‘๋ณต์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž. 5 ์ด์ƒ์˜ ๊ฐ’์„ ๊ฐ–๋Š” ๊ฒฝ์šฐ๋Š” ์œ ์‚ฌ ์ค‘๋ณต์ด ์•„๋‹ˆ๋ฏ€๋กœ, ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. 5 ์ด์ƒ์˜ ๊ฐ’์„ ๊ฐ–๋Š” ์Œ๋“ค์— ๋Œ€ํ•ด ์œ ์‚ฌ๋„๋ฅผ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š๊ณ , 4 ์ด๋‚ด์˜ ๊ฐ’์„ ๊ฐ–๋Š” ์Œ์˜ ํ›„๋ณด๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•ด ๋ณด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•˜๋ฉด, O ( N log(N) ) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„์— ๋ชจ๋“  ์ค‘๋ณต์„ ๊ฒ€์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ Permutation and prefix matching ์ด๋ผ๊ณ  ํ•˜๊ฒ ๋‹ค.

Manku ์˜ ๋…ผ๋ฌธ์—์„œ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์ด ์ œ์‹œ๋˜์–ด ์žˆ์œผ๋‚˜, ์ด ๋ฐฉ๋ฒ•์„ ์ง€์นญํ•˜๋Š” ์ด๋ฆ„์ด ๋ถ™์–ด ์žˆ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™๋‹ค. Naidan(2015)์˜ ๋…ผ๋ฌธ์—์„œ๋Š” Permutation Search Method ๋ผ๊ณ  ์ง€์นญํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ์กฐ๊ธˆ ๊ธด ์ด๋ฆ„์ด๊ธฐ๋Š” ํ•˜๋‚˜, Permutation and prefix matching ์ด๋ผ๊ณ  ์ง€์นญํ•˜๋Š” ๊ฒƒ์ด ์ ๋‹นํ•  ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋œ๋‹ค.

๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. 64bit fingerprint ์—์„œ 4๊ฐœ ์ด๋‚ด์˜ ๋น„ํŠธ๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ฅผ ์ฐพ๊ณ ์ž ํ•œ๋‹ค.

  2. 64bit fingerprint ๋ฅผ ์ ๋‹นํžˆ 5๊ฐœ ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค. ์•ž์—์„œ๋ถ€ํ„ฐ 13bit, 13bit, 13bit, 13bit, 12bit ๋กœ ๊ฐ€๋Šฅํ•˜๋ฉด ํฌ๊ธฐ๊ฐ€ ๋น„์Šทํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•œ๋‹ค. ์ด ์˜์—ญ์„ ์•ž์—์„œ๋ถ€ํ„ฐ a, b, c, d, e ๋ผ๊ณ  ์ด๋ฆ„ ๋ถ™์ธ๋‹ค.

    long d1  = 0b01001010_10001110_10010100_10010010_11001110_10001010_10010100_10110010
             ~~~~~~~~~~~~~~_______________~~~~~~~~~~~~~~_______________~~~~~~~~~~~~~
                   a              b              c             d             e
    
  3. fingerprint d1, d2 ๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, ์ด ๋‘˜์ด ์œ ์‚ฌ ์ค‘๋ณต์ด๋ผ๋ฉด, ์„œ๋กœ ๋‹ค๋ฅธ 4๊ฐœ ์ด๋‚ด์˜ ๋น„ํŠธ๊ฐ€ a, b, c, d, e ์˜์—ญ์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ์˜์—ญ์˜ ์ˆ˜๊ฐ€ 5๊ฐœ ์ด๋ฏ€๋กœ, 5๊ฐœ์˜ ์˜์—ญ ๊ฐ€์šด๋ฐ ์ ์–ด๋„ ํ•˜๋‚˜๋Š” d1, d2 ๊ฐ€ ์„œ๋กœ ์ผ์น˜ํ•˜๊ฒŒ ๋œ๋‹ค. ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด, ๋น„๋‘˜๊ธฐ ์ง‘์˜ ์›๋ฆฌ์— ๋”ฐ๋ผ, 4๊ฐœ ์ด๋‚ด์˜ ๋น„ํŠธ๊ฐ€ 5๊ฐœ ์˜์—ญ์— ์œ„์น˜ํ•œ ๊ฒฝ์šฐ, ์ ์–ด๋„ 1๊ฐœ ์ด์ƒ์˜ ์˜์—ญ์€ ํ•ด๋‹น ๋น„ํŠธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ, d1, d2 ๋Š” a, b, c, d, e ์ค‘ ์ ์–ด๋„ ํ•˜๋‚˜์˜ ์˜์—ญ์€ ๊ฐ’์ด ์ผ์น˜ํ•œ๋‹ค.

  4. fingerprint ์˜ 5๊ฐœ ์˜์—ญ์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋Š” ์กฐํ•ฉ, permutation ์„ ๋งŒ๋“ ๋‹ค. ์ด ๊ฒฝ์šฐ๋Š” abcde, bcdea, cdeab, deabc, eabcd ์™€ ๊ฐ™์€ ๋‹ค์„ฏ๊ฐœ ์กฐํ•ฉ์„ ๋งŒ๋“ ๋‹ค.

  • abcde ์กฐํ•ฉ์˜ ๊ฒฝ์šฐ, a๋ฅผ ๊ธฐ์ค€์œผ๋กœ fingerprint๋ฅผ ์ •๋ ฌํ•˜๋ฉด, a๊ฐ€ ์ผ์น˜ํ•˜๋Š” fingerprint๊ฐ’๋“ค์ด ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ ์ค‘ ํ•œ ๊ณณ์— ๋ชฐ๋ฆฌ๊ฒŒ ๋œ๋‹ค. a์˜ ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š” fingerprint๋“ค์— ๋Œ€ํ•ด์„œ bcde ์˜์—ญ์„ ๋Œ€์ƒ์œผ๋กœ hamming weight๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ 4 ์ดํ•˜์ธ ๊ฒฝ์šฐ๋ฅผ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.
  • bcdea ์กฐํ•ฉ์˜ ๊ฒฝ์šฐ, b๋ฅผ ๊ธฐ์ค€์œผ๋กœ fingerprint๋ฅผ ์ •๋ ฌํ•˜๋ฉด, b๊ฐ€ ์ผ์น˜ํ•˜๋Š” fingerprint๊ฐ’์ด ๋“ค์ด ํ•œ ๊ณณ์— ๋ชฐ๋ฆฌ๊ฒŒ ๋œ๋‹ค. cdea ์˜์—ญ์„ ๋Œ€์ƒ์œผ๋กœ hamming weight๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
  • ๋‚˜๋จธ์ง€ ์กฐํ•ฉ์˜ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ณ„์‚ฐํ•œ๋‹ค.
  1. ๊ฐ permutation์— ๋Œ€ํ•ด ์ฒซ๋ฒˆ์งธ ์˜์—ญ์„ prefix๋ผ ํ•˜๊ณ , prefix๊ฐ€ ์ผ์น˜ํ•˜๋Š” fingerprint๊ฐ’๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ hamming weight๋ฅผ N ( N - 1 ) ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ ์šฉํ•˜์—ฌ ๊ณ„์‚ฐํ•œ๋‹ค. ๊ฐ ์กฐํ•ฉ์— ๋Œ€ํ•ด ์œ ์‚ฌ๋„ ๊ฒ€์‚ฌ๋ฅผ ์™„๋ฃŒํ•˜๋ฉด, ์ฃผ์–ด์ง„ fingerprint ์™€ max hamming distance(=4)์— ๋Œ€ํ•ด, ์œ ์‚ฌ์ค‘๋ณต ์Œ์„ ๋น ์ง์—†์ด ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • prefix ๊ฐ€ ์ผ์น˜ํ•˜๋Š” fingerprint ๊ฐ’๋“ค์„ ํšจ๊ณผ์ ์œผ๋กœ ์ฐพ๊ธฐ ์œ„ํ•ด, prefix ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๋ฉด ๋œ๋‹ค.

์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ, prefix๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ๊ฐ€ ํ‰๊ท ์ ์œผ๋กœ ๋ช‡ ๊ฐœ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ธ์ง€ ์˜ˆ์ธกํ•ด ๋ณด์ž. ๋ฌธ์„œ๊ฐ€ 100์–ต๊ฐœ ์ฃผ์–ด์ง€๊ณ , 64bit fingerprint, max hamming distance = 4์ธ ๊ฒฝ์šฐ, ๊ฐ€์žฅ ์ž‘์€ bit๋ฅผ ๊ฐ–๋Š” ์˜์—ญ์˜ ํฌ๊ธฐ๊ฐ€ 12bit ์ด๋‹ค. 12bit ๊ฐ’์˜ cardinality๋Š” 4096 ์ด๋‹ค. 100์–ต๊ฐœ์˜ ๋ฌธ์„œ์— ๋Œ€ํ•ด 12bit prefix๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ๋“ค์˜ ์ˆ˜๋Š” ํ‰๊ท  100์–ต / 4096 = ์•ฝ 24,414 ์ด ๋œ๋‹ค.

์œ„์˜ ๋ฐฉ์‹์œผ๋กœ ์ค‘๋ณต ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ, ํ‰๊ท ์ ์œผ๋กœ 24,414 ๊ฐœ์˜ ๋ฌธ์„œ๋“ค์— ๋Œ€ํ•ด N x ( N - 1 )์˜ hamming weight๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์ค‘๋ณต ์Œ์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค.

Permutation ์ƒ์„ฑ ๋ฐฉ์‹ ๋ณ€๊ฒฝ

์‹ค์ œ ๊ตฌํ˜„์—์„œ๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์˜ ์กฐํ•ฉ์„ ์ ์šฉํ•˜์—ฌ ๋” ํšจ๊ณผ์ ์ธ ๊ตฌํ˜„์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. max hamming distance ๋ฅผ m ์ด๋ผ ํ•˜๋ฉด, m+1 ๊ฐœ์˜ ์˜์—ญ์„ ๋‚˜๋ˆ„์ง€ ์•Š๊ณ , m+2 ๊ฐœ์˜ ์˜์—ญ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. m=4์ธ ๊ฒฝ์šฐ, 6๊ฐœ์˜ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„๊ฒŒ ๋˜๋ฉฐ, ๋ชจ๋“  ์ค‘๋ณต ์Œ์€ ์ ์–ด๋„ 2๊ฐœ ์ด์ƒ์˜ ์˜์—ญ์˜ ๊ฐ’์ด ์ผ์น˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด ๊ฒฝ์šฐ, prefix ์™€ ๋‚˜๋จธ์ง€ ์˜์—ญ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐํ•ฉ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  • ab + cdef, ac + bdef, ad + bcef, ae + bcdf, af + bcde : 5๊ฐœ
  • bc + adef, bd + acef, be + acdf, bf + acde : 4๊ฐœ
  • cd + abef, ce + abdf, cf + abde : 3๊ฐœ
  • de + abcf, df + abce : 2๊ฐœ
  • ef + abcd : 1๊ฐœ

๋„ํ•ฉ 15๊ฐœ์˜ ์กฐํ•ฉ์ด ๋งŒ๋“ค์–ด์ง€๋ฉฐ, ๊ฐ ์˜์—ญ์˜ ํฌ๊ธฐ๋Š” 10~11bit ๊ฐ€ ๋œ๋‹ค. ์ผ๋ฐ˜ํ™”ํ•˜๋ฉด, m+2 ๊ฐœ์˜ ์˜์—ญ์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ, ( m + 2 ) x ( m + 1 ) / 2 ์˜ ์กฐํ•ฉ์ด ๋งŒ๋“ค์–ด์ง€๋ฉฐ, ์˜์—ญ์˜ ํฌ๊ธฐ๋Š” floor( 64 / ( m + 2 ) )๊ฐ€ ๋œ๋‹ค. ์ด๋•Œ, prefix๊ฐ€ 2๊ฐœ ์˜์—ญ์˜ ์กฐํ•ฉ์ด ๋˜๋ฏ€๋กœ, m = 4์ธ ๊ฒฝ์šฐ, prefix์˜ ํฌ๊ธฐ๊ฐ€ ์ตœ์†Œ 20bit ๊ฐ€ ๋œ๋‹ค.

20bit ์˜ cardinality๋Š” 1,048,576 ์ด๋ฉฐ, 100์–ต๊ฐœ์˜ ๋ฌธ์„œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, 20bit prefix๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ์˜ ์ˆ˜๋Š” ํ‰๊ท  100์–ต / 1,048,576 = ์•ฝ 95๊ฐ€ ๋œ๋‹ค. ์ฆ‰, N x ( N - 1 )์˜ ๋น„๊ต๋ฅผ ํ•  ๋ฌธ์„œ์ˆ˜๊ฐ€ 95๊ฐ€ ๋˜๊ธฐ์—, ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ํฌ๊ฒŒ ์ค„์–ด๋“œ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๋Œ€์‹ , ( m + 2 ) x ( m + 1 ) / 2์˜ fingerprint ์กฐํ•ฉ์„ ๋งŒ๋“ค์–ด๋‚ด๊ณ , ๊ฐ ์กฐํ•ฉ์— ๋Œ€ํ•ด prefix matching ์„ ์‹คํ–‰ํ•˜๋Š” ๋ถ€๋‹ด์ด ์ƒ๊ธด๋‹ค.

Permutation ์„ ๋‹ค์–‘ํ•˜๊ฒŒ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ๋Š” Manku(2007)์˜ ๋…ผ๋ฌธ์—์„œ ์ƒ์„ธํžˆ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค.

์žฌ๊ท€์ ์ธ Permutation and prefix matching ๋ฐฉ์‹

Fingerprint๋ฅผ m + 1 ๊ฐœ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒฝ์šฐ, m = 4 ์ด๋ฉด, prefix ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ์กฐ๊ฑด์˜ ๋ฌธ์„œ์ˆ˜๊ฐ€ ํ‰๊ท ์ ์œผ๋กœ ์•ฝ 24,414 ๊ฐœ ๋ฐœ์ƒํ•œ๋‹ค. ์‹ค์ œ๋กœ๋Š” ์ด๋ณด๋‹ค ํ›จ์”ฌ ๋” ํฐ ์ˆ˜์˜ ๋ฌธ์„œ๋“ค์ด ๋ชฐ๋ฆฌ๋Š” ๊ฒฝ์šฐ๋„ ๋ฐœ์ƒํ•œ๋‹ค. ์ˆ˜๋งŒ~์ˆ˜์‹ญ๋งŒ์˜ ๋ฌธ์„œ์˜ prefix๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ, N x ( N - 1 )์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํ•œ ๋ถ€๋‹ด์ด ๋œ๋‹ค.

64bit fingerprint์—์„œ ๊ฐ€์žฅ ์ž‘์€ prefix๋Š” 12bit์ด๋ฉฐ, ๋‚จ์€ fingerprint๋Š” 52bit ์ด๋‹ค. ๋‚จ์€ fingerprint ์— ๋Œ€ํ•ด ๋‹ค์‹œ permutation and prefix matching ๋ฐฉ์‹์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ fingerprint ์กฐํ•ฉ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ์ˆ˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด, ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ถฉ๋ถ„ํžˆ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

52bit ์˜ fingerprint ๋ฅผ ๊ฐ–๋Š” ๋ฌธ์„œ๊ฐ€ 10๋งŒ๊ฐœ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, ์ด ๊ฐ€์šด๋ฐ ๋‹ค์‹œ 4๊ฐœ ์ดํ•˜์˜ hamming distance๋ฅผ ๊ฐ–๋Š” ์ค‘๋ณต ์Œ์„ ์ฐพ์œผ๋ฉด ๋œ๋‹ค. ์ฒ˜์Œ 64bit fingerprint ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, 52bit fingerprint ์— ๋Œ€ํ•ด ์˜์—ญ์„ 5๊ฐœ๋กœ ๋‚˜๋ˆ„๊ณ , permutation and prefix matching ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐ˜๋ณตํ•œ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด fingerprint ์˜์—ญ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

long fp  = 0b01001010_10001110_10010100_10010010_11001110_10001010_1001
             ~~~~~~~~~~~~_____________~~~~~~~~~~~____________~~~~~~~~~~
                   a           b           c           d          e

๊ฐ ์˜์—ญ์€ 10~11bit ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ–๊ฒŒ ๋˜๋ฉฐ, 5๊ฐœ์˜ permutation ์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ, ๊ณต๊ฐ„๋ณต์žก๋„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋œ๋‹ค.

  • fingerprint, document id, datetime, 3๊ฐœ์˜ ์ž…๋ ฅ๊ฐ’์„ ๋‹ค๋ฃฌ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ๊ฐ๊ฐ 8byte ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•˜๋‚˜์˜ ๋ฌธ์„œ๋Š” 24byte ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ํŽธํ•œ alphanumeric ๋ฌธ์ž๋งŒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, base64url encoding ๋“ฑ์„ ์ ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์•ฝ 40๋ฐ”์ดํŠธ ์ด๋‚ด๋กœ ํ•˜๋‚˜์˜ ๋ฌธ์„œ ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 10๋งŒ๊ฐœ์˜ ๋ฌธ์„œ์— ๋Œ€ํ•ด 5๊ฐœ ์กฐํ•ฉ์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ, 10๋งŒ x 5๊ฐœ x 40byte์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ permutation ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋ฉด ์•ฝ 19MB ๊ฐ€ ๋œ๋‹ค.

์ด๋•Œ, prefix ํฌ๊ธฐ์˜ ์ตœ์†Œ๋น„ํŠธ๋Š” 10bit ์ด๋ฉฐ, cardinality๋Š” 1024์ด๋‹ค. prefix ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ์˜ ์ˆ˜๋Š” ํ‰๊ท  10๋งŒ / 1,048 = ์•ฝ 97 ์ด ๋œ๋‹ค.

Fingerprint ์กฐํ•ฉ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ  ์ •๋ ฌํ•˜๋Š” ๋น„์šฉ์€ O( N x log(N) ) ์ด๊ธฐ์— ๋น„์šฉ์ด ์ž‘๊ณ , 10๋งŒ๊ฑด์˜ ๋ฌธ์„œ์— ๋Œ€ํ•ด ์•ฝ 19MB ์ •๋„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด ๊ฒฝ์šฐ, ์กฐํ•ฉ์„ ( m + 2 ) x ( m + 1 ) / 2 ๊ฐœ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์— ๋น„ํ•ด, ์ฒ˜์Œ ์กฐํ•ฉ์„ ์ƒ์„ฑํ•˜๋Š” ์ˆ˜๋Š” m+1 ๊ฐœ๋ฅผ ๋งŒ๋“ค๋ฉด ๋˜๊ธฐ์— ๋ถ€๋‹ด์ด ์ ๊ณ , Hadoop ์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ reduce job ์—์„œ 20MB ์ •๋„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๋ณต๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๊ธฐ์—, ์ „์ฒด ์‹œ์Šคํ…œ ๊ตฌํ˜„์— ์žˆ์–ด์„œ ๋ถ€๋‹ด์ด ์ ๋‹ค. Hadoop map-reduce ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฒฐ๊ตญ reduce job ์˜ hamming distance ๊ณ„์‚ฐ ์ž‘์—…์ด ๋ณ‘๋ชฉ์ด ๋˜๋ฉฐ, CPU Bound ๋˜๋Š” ์ž‘์—…์ด๊ธฐ์— ๋ฌผ๋ฆฌ ์„œ๋ฒ„ ๋‚ด์—์„œ CPU core ์ˆ˜ x 2~3๋ฐฐ ์ •๋„์˜ job์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ ์ตœ์ ์ ์ด ๋œ๋‹ค. ๋™์‹œ์— reduce job ์ด 50๊ฐœ ๊ฐ€๋Ÿ‰ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ, ํ•˜๋‚˜์˜ job ์ด 20MB ์ •๋„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ ์ž์› ์ธก๋ฉด์—์„œ ๋ถ€๋‹ด๋˜์ง€ ์•Š๋Š”๋‹ค.

Hadoop ๊ธฐ๋ฐ˜ Map-Reduce ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ž…์ถœ๋ ฅ ์„ค๊ณ„

Permutation and prefix matching ๊ตฌํ˜„์„ Hadoop ๊ธฐ๋ฐ˜ Map-Reduce ํ”„๋กœ์„ธ์Šค๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์ „์ˆ˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ˆ˜์‹ญ๋ถ„ ์ด๋‚ด์˜ ์งง์€ ์‹œ๊ฐ„์— ์ค‘๋ณต ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ค‘๋ณต ์Œ์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์‹ค์ œ ๊ตฌํ˜„์„ ํ•ด ๋ณด๋ฉด, ์ผ๋ถ€ ๋ฌธ์„œ์— ๋Œ€ํ•ด์„œ๋Š” ์ค‘๋ณต ์Œ์ด ๋‹ค์ˆ˜ ์กด์žฌํ•˜๋Š” ํŠน์„ฑ์ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ธ”๋กœ๊ทธ ๊ฐœ์„ค ์ถ•ํ•˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์ˆ˜์‹ญ๋งŒ๊ฑด ์ด์ƒ ์‹œ์Šคํ…œ์—์„œ ์ƒ์„ฑ๋˜์–ด ์ค‘๋ณต๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ˆ์™ธ์ ์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ๋ถ„ํฌ๊ฐ€ ๊ณจ๊ณ ๋ฃจ ๋ถ„ํฌํ•˜์ง€ ์•Š์•„, ์ผ๋ถ€ Reduce ์ž‘์—…์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ณด๋‹ค ์ˆ˜๋ฐฐ~์ˆ˜์‹ญ๋ฐฐ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ, ๋‹ค์Œ์™€ ๊ฐ™์€ ๋ณตํ•ฉ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ด๋‹ค.

์ž‘์„ฑ ์ค‘

  • ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ์˜ˆ์‹œ

๋ฌธ์„œID \t Fingerprint \t ๋ฌธ์„œ์ž‘์„ฑ์‹œ๊ฐ ```

  • ์ถœ๋ ฅ ๋ฐ์ดํ„ฐ

์ž‘์„ฑ ์ค‘

๋ ˆํผ๋Ÿฐ์Šค