본문으로 건너뛰기
AZ Tools

문자열 거리 계산기

두 문자열을 Levenshtein·Damerau-Levenshtein·Hamming 거리로 비교. 퍼지 매치 임계값으로 사용 가능한 유사도 %.

유사도

57.1%

Levenshtein

3

Damerau-Lev.

3

Hamming

n/a

Damerau-Levenshtein은 ab → ba(전치)를 한 번의 편집으로 보고, 일반 Levenshtein은 두 번으로 셉니다. Hamming은 길이가 같은 문자열에만 쓸 수 있습니다.

사용법

  1. 두 문자열 입력/붙여넣기.
  2. 각 거리 지표와 유사도 % 확인.
  3. 퍼지 중복 제거 시작 임계값 ~85%+, 오타 허용 검색은 더 낮게.

자세한 설명

펼치기

문자열 두 개를 입력하면 여러 편집 거리 지표로 얼마나 떨어져 있는지 한꺼번에 보여 줍니다. 레벤슈타인은 삽입·삭제·치환을 셉니다. 맞춤법 검사에 쓰이는 고전적인 척도로, kitten과 sitting은 세 번의 편집만큼 떨어져 있습니다. 다메라우-레벤슈타인은 인접한 두 글자의 자리바꿈까지 한 번의 편집으로 셉니다. 사람이 실제로 오타를 내는 방식과 더 잘 맞습니다. ac와 ca는 레벤슈타인으로는 2, 다메라우로는 1입니다. 해밍은 자리별 불일치를 세며 길이가 같을 때만 정의됩니다. 고정 길이 코드에는 알맞고 자유 문장에는 맞지 않는 도구라는 뜻입니다. 유사도 백분율은 (1 − 레벤슈타인 / 더 긴 쪽 길이) × 100으로, 레코드를 중복 제거할 때 기준선으로 삼게 되는 숫자입니다.

비교는 UTF-16 코드 단위 위에서 이뤄지고, 거리를 믿기 전에 알아 둘 만한 결과가 따라옵니다. 기본 다국어 평면 바깥의 이모지는 코드 단위 두 개이므로, 하나를 지우면 편집 1이 아니라 2로 계산됩니다. 더 곤란한 것은, 화면에서 똑같아 보이는 두 문자열의 거리가 0이 아닐 수 있다는 점입니다. 완성형 é로 쓴 café는 4단위이고, 같은 단어를 e 뒤에 결합 악센트를 붙여 쓰면 5단위여서, 어떤 독자도 다르다고 말하지 않을 두 문자열 사이에 거리 1이 생깁니다. 출처가 다른 텍스트를 비교하기 전에는 양쪽을 String.prototype.normalize('NFC')로 정규화하세요. 맥에서 복사한 글, 데이터베이스에서 꺼낸 값, 웹 폼으로 들어온 입력은 이 점에서 저절로 일치하지 않습니다.

임계값을 조정하는 것보다 올바른 지표를 고르는 일이 더 중요합니다. 편집 거리는 모든 글자를 똑같이 중요하게 취급하므로, Smith와 Smyth의 점수가 Smith와 Smith.의 점수와 같아집니다. 한쪽은 다른 이름이고 다른 쪽은 문장부호인데도 그렇습니다. 사람 이름을 대조하는 데는 공통 접두어에 더 큰 가중치를 주는 자로-윙클러가 낫고, 문장을 대조하는 데는 글자 기반보다 토큰 기반 지표가 확실히 낫습니다. 그리고 원시 거리 값은 길이가 다르면 서로 비교할 수 없습니다. 다섯 글자 문자열에서의 세 번 편집과 백 글자 문자열에서의 세 번 편집은 전혀 다른 사건이고, 백분율은 정확히 그것을 보정하려고 있는 값입니다.

자주 묻는 질문

어떤 지표 사용?

사람이 인접 문자를 바꾸는 타이핑 텍스트는 Damerau-Levenshtein 사용. 단백질 서열·고정 길이 코드는 Hamming. 그 외 모든 것(URL 슬러그·이름·자유 텍스트)은 Levenshtein이 안전한 기본 — 대부분 맞춤법 라이브러리가 내부적으로 사용.

유사도 %와 거리 관계?

정규화된 Levenshtein: 100%는 동일·0%는 모든 문자 교체 필요. 분모는 두 문자열 중 더 긴 것 — cat 대 dog은 0%(3 편집/3 문자)·cat 대 catt는 75%(1 편집/4 문자).

Hamming이 가끔 'n/a'인 이유?

Hamming 거리는 같은 길이 문자열에만 정의. 길이가 다르면 의미 있는 쌍별 위치 비교 불가 — Levenshtein 사용.

대소문자 구분?

예. Cat 대 cat은 Levenshtein 거리 1. 대소문자 무시 비교 원하면 두 입력 모두 소문자화 먼저.

관련 도구