표절 검사기와 중복 콘텐츠 탐지는 어떻게 작동할까?
부스트키워드 팀
검색 데이터로 키워드의 검색량, 트렌드, 검색 의도를 파악하고 마케팅 의사결정을 돕는 도구 부스트키워드를 만듭니다.
누군가 다른 사람의 글을 그대로 베끼지 않고, 몇몇 단어만 살짝 바꾸거나 문장 순서를 조금 조정해서 올린다면 어떨까요? 완전히 똑같지는 않지만 원본과 매우 흡사한 이런 문서를, 표절 검사기나 검색엔진은 어떻게 정확히 찾아낼까요? 이 글에서는 완전히 일치하지 않아도 '거의 비슷한' 문서를 찾아내는 기술의 원리를 예제와 함께 살펴봅니다.
완전히 같지 않아도 '거의 같은' 문서를 찾아야 하는 이유
글자 하나까지 완전히 똑같은 경우는 오히려 드물다
인터넷에는 완전히 똑같이 복사된 문서보다, 살짝 손질된 형태로 재가공된 문서가 훨씬 더 많습니다. 예를 들어 하나의 보도자료가 여러 언론사를 통해 살짝 다른 표현으로 재배포되거나, 같은 상품 페이지가 옵션값만 다른 여러 개의 URL로 존재하는 경우가 대표적입니다. 이런 문서들은 완전히 일치하지는 않지만 내용의 대부분이 겹치는, 이른바 '거의 중복(near-duplicate)'된 문서입니다.
검색엔진과 표절 검사기가 똑같이 마주치는 문제
검색엔진 입장에서는 이런 거의 중복된 문서들을 검색 결과에 모두 노출시키면, 사용자에게 같은 내용을 여러 번 반복해서 보여주는 셈이 되어 검색 품질이 떨어집니다. 표절 검사기 입장에서는 원문과 완전히 똑같지 않다고 해서 표절이 아니라고 판단해버리면, 실제로는 명백한 표절인 문서를 놓치게 됩니다. 두 시스템 모두 "완전히 같지는 않지만 실질적으로 매우 비슷한 문서를 어떻게 찾아낼 것인가"라는 동일한 문제를 마주하고 있습니다.
문서를 통째로 비교하면 안 되는 이유
모든 문서 쌍을 하나하나 비교하면 얼마나 오래 걸릴까
가장 단순하게 생각하면, 모든 문서를 서로 하나하나 짝지어 비교하면 될 것 같습니다. 하지만 문서가 100만 개만 있어도, 모든 쌍을 비교하려면 약 5,000억 번에 가까운 비교가 필요합니다. 웹 전체를 대상으로 한다면 문서의 수는 수십억 개에 달하므로, 이런 방식은 현실적으로 계산이 불가능합니다.
더 빠르고 실용적인 방법이 필요한 이유
그래서 문서 전체를 통째로 비교하는 대신, 문서를 작은 조각으로 나누고 그 조각들만 비교해서 유사도를 빠르게 추정하는 방법이 필요합니다. 이러한 필요에서 등장한 대표적인 기법이 시밍글링(Shingling)입니다.
시밍글링(Shingling): 문서를 조각으로 쪼개어 비교하기
문서를 몇 단어씩 겹치는 조각(shingle)으로 나누기
시밍글링은 문서를 연속된 몇 개의 단어씩 묶어서, 서로 겹치도록 조각을 내는 방법입니다. 예를 들어 3개 단어씩 묶는다면(이를 3-shingle이라고 부릅니다), 첫 번째 조각은 1~3번째 단어, 두 번째 조각은 2~4번째 단어, 세 번째 조각은 3~5번째 단어처럼 한 칸씩 이동하며 겹치게 조각을 만듭니다.
간단한 예제 문장으로 시밍글링 직접 해보기
"제주도 흑돼지 맛집을 소개합니다"라는 문장을 예로 들어보겠습니다. 이 문장을 단어 단위로 나누면 "제주도 / 흑돼지 / 맛집을 / 소개합니다"가 됩니다. 여기서 2개 단어씩 묶는 2-shingle을 만들면 다음과 같은 조각들이 나옵니다.
- 제주도-흑돼지
- 흑돼지-맛집을
- 맛집을-소개합니다
이제 만약 다른 문서에서 "흑돼지 맛집을 이곳에서 소개합니다"라는, 단어 순서를 살짝 바꾼 비슷한 문장이 있다면, 이 문장에서도 "흑돼지-맛집을"이라는 조각이 그대로 발견됩니다. 이렇게 문서 전체를 비교하는 대신, 잘게 쪼갠 조각들이 얼마나 겹치는지를 확인하면 문서 전체를 처음부터 다시 비교하지 않고도 두 문서가 얼마나 비슷한지를 효율적으로 가늠할 수 있습니다.
두 문서의 유사도는 어떻게 계산할까
조각들의 집합을 비교하는 방법
두 문서를 각각 조각(shingle)의 집합으로 표현했다면, 이제 두 집합이 얼마나 겹치는지를 계산해서 유사도로 삼을 수 있습니다. 이때 널리 쓰이는 계산 방법이 자카드 유사도입니다. 자카드 유사도는 "두 집합에 공통으로 들어 있는 조각의 수"를 "두 집합을 합쳤을 때 존재하는 전체 조각의 수"로 나눈 값입니다. 이 값이 1에 가까울수록 두 문서가 거의 동일하다는 뜻이고, 0에 가까울수록 겹치는 부분이 거의 없다는 뜻입니다.
예제로 두 문서의 유사도 직접 계산해보기
문서 X에서 추출한 조각의 집합이 {A, B, C, D}이고, 문서 Y에서 추출한 조각의 집합이 {B, C, D, E}라고 가정해봅시다. 두 집합에 공통으로 들어 있는 조각은 B, C, D로 총 3개이고, 두 집합을 합친 전체 조각은 A, B, C, D, E로 총 5개입니다. 따라서 자카드 유사도는 3/5, 즉 0.6이 됩니다. 만약 이 값이 미리 정해둔 기준(예를 들어 0.5)보다 높다면, 두 문서를 '거의 중복'된 문서로 판단할 수 있습니다.
조각이 너무 많을 때는 어떻게 할까: 빠르게 비교하는 요령
모든 조각을 다 저장하지 않고 대표값(지문)만 남기는 아이디어
긴 문서는 조각(shingle)의 수가 수천, 수만 개에 이를 수 있어 이 조각들을 모두 저장하고 비교하는 것도 여전히 부담스러운 작업입니다. 그래서 실제 시스템에서는 이 많은 조각들 중에서 대표성을 가지는 일부 값만 골라내어 훨씬 작은 크기의 '지문(fingerprint)'으로 압축해 저장하는 방법을 사용합니다.
대표값끼리만 비교해도 유사도를 추정할 수 있는 이유
수학적으로 잘 설계된 방식으로 대표값을 골라내면, 원래 조각 집합 전체를 비교했을 때와 거의 비슷한 수준으로 두 문서의 유사도를 추정할 수 있다는 것이 알려져 있습니다. 이 방법을 활용하면 문서 하나당 저장해야 하는 데이터의 양을 크게 줄이면서도, 수십억 개의 문서 쌍을 실용적인 시간 안에 비교할 수 있게 됩니다.
실제로 어디에 쓰일까
검색엔진의 중복 페이지 걸러내기
검색엔진은 웹을 크롤링하는 과정에서 수집한 방대한 페이지들 중, 이러한 방식으로 거의 중복된 페이지들을 미리 걸러내어 색인에서 제외하거나 하나의 대표 페이지만 남깁니다. 이를 통해 사용자에게 같은 내용이 여러 번 반복해서 노출되는 것을 방지합니다.
대학 과제·논문 표절 검사, 뉴스 기사 재배포 탐지
같은 원리가 학교 과제나 논문의 표절 검사 시스템에도 활용됩니다. 제출된 글과 기존에 존재하는 수많은 문서를 시밍글링 방식으로 비교해, 표현을 일부 바꾸었더라도 상당 부분이 겹치는 문서를 찾아내 표절 의심 부분으로 표시해줍니다. 또한 하나의 보도자료가 여러 매체에 어떻게 재배포되었는지를 추적하는 데에도 비슷한 기법이 활용됩니다.
정리하며
완전히 똑같지 않아도 실질적으로 비슷한 문서를 찾아내는 일은, 문서 전체를 통째로 비교하는 대신 잘게 쪼갠 조각들의 겹침 정도를 계산하는 방식으로 효율적으로 해결할 수 있습니다. 시밍글링과 자카드 유사도, 그리고 이를 더 빠르게 만들어주는 지문 압축 기법 덕분에, 검색엔진은 방대한 웹 속의 중복 페이지를 효과적으로 걸러내고, 표절 검사기는 교묘하게 손질된 표절 문서까지 찾아낼 수 있습니다.
Q.문장을 살짝 바꿔 써도 표절 검사기가 잡아내나요?
Q.중복 콘텐츠는 왜 SEO에 불리한가요?
Q.시밍글링은 이미지나 동영상에도 쓰일 수 있나요?
Written by

부스트키워드 팀
검색 데이터로 키워드의 검색량, 트렌드, 검색 의도를 파악하고 마케팅 의사결정을 돕는 도구 부스트키워드를 만듭니다.
