Near Duplicate Documents Detection - aragorn/home GitHub Wiki
์์ต๊ฑด ์ด์์ ๋ฌธ์ ์งํฉ์์ ์ ์ฌ ๋ฌธ์๋ฅผ ์ฐพ์ ๊ณ ์ ํ ์ค๋ณตID๋ฅผ ํ ๋นํ๋ ์์คํ ์ ์ด๋ป๊ฒ ๊ตฌํํ ๊ฒ์ธ์ง ์ดํด๋ณธ๋ค.
๋ฐฐ๊ฒฝ
๋ด์ค, ๋ธ๋ก๊ทธ, ์น๋ฌธ์, ์ด๋ฏธ์ง, ์ผํ์ํ ๋ฑ์ ๋์์ผ๋ก ํ๋ ๊ฒ์์๋น์ค๋ฅผ ๊ตฌํํ ๋, ์์ต๊ฑด ์ด์์ ๋ค์ ๋ฌธ์๋ฅผ ๊ฒ์์์ง์ ์์ธํ์ฌ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ฒ ๋๋ค. ๋ค์์ ๋ฐ์ดํฐ๋ฅผ ์์ธํ๋ ๊ฒฝ์ฐ, ์ค์ง์ ์ผ๋ก ๋์ผํ ๋ฌธ์ ๋๋ ์ ์ฌํ ๋ฌธ์๊ฐ ๋ค์ ์กด์ฌํ๊ฒ ๋๋ฉฐ, ์ด๋ฌํ ์ค๋ณต ๋ฌธ์๋ค์ ๊ฒ์๊ฒฐ๊ณผ์ ํ์ง์ ๋จ์ด๋จ๋ฆฌ๋ ์์ธ์ด ๋๋ค. ๋์์ ๋ฌธ์์ ์ค๋ณต์ ๋น ๋ฅด๊ณ ์ ํํ๊ฒ ํ๋ณํ๋ ์ ์ฒ๋ฆฌ ์์คํ ์ ๊ฐ์ถ๊ฒ ๋๋ฉด, ์ค๋ณต๋ ๋ฌธ์์ ์ ๋ณด๋ฅผ ์ด์ฉํด ์ฃผ์ ๋ญํน ์์๋ก ์ฌ์ฉํ ์ ์๋ค.
๊ฐ์
์์ต๊ฑด ์ด์์ ๋ฌธ์๋ฐ์ดํฐ์ ๋ํด ์ ์ฌ๋ฌธ์ ์์ ์ฐพ์๋ด๊ณ ๊ณ ์ ID ๋๋ ์๋ณธ ๋ฌธ์๋ฅผ ์ฐพ์๋ด๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์์คํ ์ ๊ตฌํ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค. ์๊ณ ๋ฆฌ์ฆ ์ธก๋ฉด์์ ๋ค์ฐจ์ ๊ณต๊ฐ์์ ๋ค์์ ๋ฒกํฐ๊ฐ ์ฃผ์ด์ง ๊ฒฝ์ฐ, ๋ชจ๋ ๋ฒกํฐ๋ค์ ๋ํด Nearest neighbour search ๊ฒฐ๊ณผ๋ฅผ ๋์ถํด ๋ด๋ ์์คํ ์ ๊ตฌํํ๋ ๊ฒ์ด๋ค. Locality sensitive hashing, Permutation and prefix matching ์ ์ ์ฉํ์ฌ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ฎ์ถ๋ ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค. ๋์ ์ ํ๋, ์ฌํ๋ฅ ์ ๋ณด์ฅํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๊ธฐ ์ํด, Locality sensitive hashing ๊ณผ ๋ณํํ์ฌ ๊ณ์ฐ ๋น์ฉ์ด ๋์ ๋น๊ต ์๊ณ ๋ฆฌ์ฆ์ ์กฐํฉํ๋ ๊ธฐ์ ์ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค. ์์ธ๋ฌ, ์๊ณ ๋ฆฌ์ฆ๊ณผ ์์คํ ์ ํ์ง์ ์ธก์ ํ๊ธฐ ์ํด ์ํ ๋ฐ์ดํฐ์ ๋ํ ์์์ ์ ๋ต๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑํ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํ๋ฅ , ์ฌํ๋ฅ ์ ์ธก์ ํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค.
๋ชฉ์ฐจ
- ๋ฌธ์ ๋จ์๋ก ์ ์ฌ ์ค๋ณต์ ํ๋ณํ๋ ๋ฐฉ๋ฒ - 1์ฐจ ์๋ฃ
- ์ฌ๋ฌ ๋ฌธ์์ ์ ์ฌ ์ค๋ณต ๊ณ์ฐ์ ๋ณต์ก๋ - 1์ฐจ ์๋ฃ
- SimHash ๊ณ์ฐ ๋ฐฉ๋ฒ - 1์ฐจ ์๋ฃ
- Hamming distance of hash value - 1์ฐจ ์๋ฃ
- Large scale similarity calculation by permutation and prefix matching - 1์ฐจ ์๋ฃ
- Hadoop ๊ธฐ๋ฐ Map-Reduce ์ฒ๋ฆฌ๋ฅผ ์ํ ์
์ถ๋ ฅ ์ค๊ณ - ์์ฑ ์ค
- ์ ์ฐจ 1) ์ค๋ณต์ ์ฐพ๊ธฐ, 2) ์ ์ฌ ์ค๋ณต์ ์ฐพ๊ธฐ, 3) ์ ์ฌ ์ค๋ณต์์ ์ค๋ณต์ ๊ฑฐ, 4) ์๋ณธ๋ฌธ์ ์ฐพ๊ธฐ, 5) ์ค๋ณต์๊ณผ ์ ์ฌ ์ค๋ณต์์ ๋ณํฉ
- ์ค๋ณต ํด์๊ฐ์ ์ ์ฒ๋ฆฌ
- LSH ์ Uncompressed text ์ ๋ณํฉ
- Online Processing of Streaming Data - ์ค๋น ์ค
- ๋ฐ์ดํฐ๊ฐ ์ง์์ ์ผ๋ก ์ฆ๊ฐ
- Streaming Data ๊ฐ single node ์ ์ฉ๋์ ๋์ด์๋ ๊ฒฝ์ฐ
- ์ ์ฌ ์ค๋ณต์์์ ๋ํ ์ ์ ํ๊ธฐ - ์ค๋น ์ค
- ์ค๋ณต์์ ํ์ง ํ๊ฐ
- ์ํ ํ ์คํธ ๊ตฌ์ฑ
- ์์์ ์ค๋ณต๊ฒ์ฌ ๋๊ตฌ
- SimHash ํ๊ฐ
- ๋ ํผ๋ฐ์ค
๋ฌธ์ ๋จ์๋ก ์ ์ฌ ์ค๋ณต์ ํ๋ณํ๋ ๋ฐฉ๋ฒ
ํ ์คํธ๋ก ๊ตฌ์ฑ๋ ๋ฌธ์์์ ์ ์ฌ ์ค๋ณต์ ํ๋ณํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ค. ์ด ๊ฐ์ด๋ฐ, ๋จผ์ ํ ์์ ๋ฌธ์์ ๋ํด ์ ์ฌ ์ค๋ณต์ ํ๋ณํ๋๋ฐ ์์ด, ๋์ ์ ํ๋ฅ (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 ๊ณ์ฐ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ ์ ๋ฆฌํ๋ฉด ๋ค์์ ์ฌ๋ผ์ด๋๋ก ์์ฝ๋๋ค.
-
๋ฌธ์์์ 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 ์ด๋ผ๊ณ ์ง์นญํ๋ ๊ฒ์ด ์ ๋นํ ๊ฒ์ผ๋ก ์๊ฐ๋๋ค.
๊ตฌ์ฒด์ ์ธ ์์์ ํจ๊ป ์ด ์๊ณ ๋ฆฌ์ฆ์ ์๋ ๋ฐฉ์์ ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
-
64bit fingerprint ์์ 4๊ฐ ์ด๋ด์ ๋นํธ๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ฅผ ์ฐพ๊ณ ์ ํ๋ค.
-
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
-
fingerprint d1, d2 ๊ฐ ์ฃผ์ด์ง ๊ฒฝ์ฐ, ์ด ๋์ด ์ ์ฌ ์ค๋ณต์ด๋ผ๋ฉด, ์๋ก ๋ค๋ฅธ 4๊ฐ ์ด๋ด์ ๋นํธ๊ฐ a, b, c, d, e ์์ญ์ ์์นํ ์ ์๋ค. ์ด๋ ์์ญ์ ์๊ฐ 5๊ฐ ์ด๋ฏ๋ก, 5๊ฐ์ ์์ญ ๊ฐ์ด๋ฐ ์ ์ด๋ ํ๋๋ d1, d2 ๊ฐ ์๋ก ์ผ์นํ๊ฒ ๋๋ค. ๋ค๋ฅด๊ฒ ํํํ๋ฉด, ๋น๋๊ธฐ ์ง์ ์๋ฆฌ์ ๋ฐ๋ผ, 4๊ฐ ์ด๋ด์ ๋นํธ๊ฐ 5๊ฐ ์์ญ์ ์์นํ ๊ฒฝ์ฐ, ์ ์ด๋ 1๊ฐ ์ด์์ ์์ญ์ ํด๋น ๋นํธ๊ฐ ์กด์ฌํ์ง ์๋๋ค. ๋ฐ๋ผ์, d1, d2 ๋ a, b, c, d, e ์ค ์ ์ด๋ ํ๋์ ์์ญ์ ๊ฐ์ด ์ผ์นํ๋ค.
-
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๋ฅผ ๊ณ์ฐํ๋ค.
- ๋๋จธ์ง ์กฐํฉ์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ณ์ฐํ๋ค.
- ๊ฐ 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 ๋ฌธ์์์ฑ์๊ฐ ```
- ์ถ๋ ฅ ๋ฐ์ดํฐ
์์ฑ ์ค
๋ ํผ๋ฐ์ค
- Efficient Similarity Query Processing (http://www.cse.unsw.edu.au/~weiw/project/simjoin.html)
- Bilegsaikhan Naidan; Leonid Boytsov; Eric Nyberg, 2015, "Permutation Search Methods are Efficient, Yet Faster Search is Possible" (http://www.vldb.org/pvldb/vol8/p1618-naidan.pdf)
- Longest Common Subsequence - Lianโen Huang et al, 2008, "Achieving both High Precision and High Recall in Near-duplicate Detection" (http://sewm.pku.edu.cn/TianwangLiterature/2008/2008-CIKM-Achieving%20both%20high%20precision%20and%20high%20recall%20in%20near-duplicate%20detection.pdf)
- Moses S. Charikar, "Similarity Estimation Techniques from Rounding Algorithms", In proceedings of the 34th Annual ACM Symposium on Theory of Computing, pp. 380-388, 2002 (http://www.cs.princeton.edu/courses/archive/spr04/cos598B/bib/CharikarEstim.pdf)
- 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)
- Detecting Near-Duplicates for Web Crawling (http://infolab.stanford.edu/~manku/papers/07www-duplicates.pptโ)
- Tanguy Urvoy, Emmanuel Chauveau, Pascal Filoche, Thomas Lavergne, "Tracking Web spam with HTML style similarities", ACM Transactions on the Web (TWEB), v.2 n.1, pp.1-28, February 2008 (http://oniros.org/papers/urvoy2008acmtweb.pdf)
- Bingfeng Pi, Shunkai Fu, Weilei Wang , and Song Han, "SimHash-based Effective and Efficient Detecting of Near-Duplicate Short Messages", Proceedings of the Second Symposium International Computer Science and Computational Technology(ISCSCT โ09) Huangshan, P. R. China, pp.020-025, 26-28,Dec. 2009 (http://www.academypublisher.com/proc/iscsct09/papers/iscsct09p20.pdf)
- Chuan Xiao , Wei Wang , Xuemin Lin , Jeffrey Xu Yu , Guoren Wang, "Efficient similarity joins for near-duplicate detection", ACM Transactions on Database Systems (TODS), v.36 n.3, pp.1-41, August 2011 (http://www.cse.unsw.edu.au/~lxue/WWW08.pdf)
- Bayardo, R. J., Ma, Y., & Srikant, R. (2007), "Scaling up all pairs similarity search", In Proceedings of the 16th international conference on World Wide Web (WWW โ07), pp. 131โ140, New York, NY. ACM. (http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.102.2601&rep=rep1&type=pdf)