Levenshtein 거리

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2025.09.03
조회수
8
버전
v1

Levenshtein 거리

Levenshtein 거리(LD, 레벤슈타인 거리)는 두 문자열 간의 유사도를정하는 데 사용 편집 거리Edit Distance)의 형태로, 하나 문자열을 다른 문자로 변환하는 필요한 최소 편집 연산수를 나타냅니다. 이 개념 1965년 러시아 수학자블라디미르 레슈타인(ladimir Levenshtein)에 의해 제안되었으며, 자연어 처리, 철자 교정, 생물정보학, 데이터 정제 등 다양한 분야에서 널리 활용됩니다.


개요

Levenshtein 거 두 문자열 사이의 차이를 정량화하는 중요한 지표입니다. 이 거리는 다음과 같은 세 가지 기본 편집 연산만을 허용합니다:

  • 삽입(Insertion): 한 문자를 문자열에 추가
  • 삭제(Deletion): 한 문자를 문자열에서 제거 치환(Substitution): 한 문자를 다른 문자로 변경

이 연산 각각은 비용 1을 가지며, 두 문자열을 동일하게 만들기 위해 필요한 총 연산 횟수를 Levenshtein 거리로 정의합니다 결과 값이 작을수록 두 문자열은 더 유사하다고 판단할 수 있습니다.

예를 들어, "kitten"과 "sitting"의 Levenshtein 거리는 3이며, 다음과 같은 변환 과정을 거칩니다:

  1. ks (치환): kitten → sitten
  2. ei (치환): sitten → sittin
  3. n 끝에 g 삽입: sittin → sitting

알고리즘 원리

Levenshtein 거리는 다이나믹 프로그래밍(Dynamic Programming)을 기반으로 계산됩니다. 두 문자열 AB의 길이를 각각 mn이라고 할 때, (m+1) × (n+1) 크기의 2차원 배열 dp를 생성하여 점진적으로 거리를 계산합니다.

DP 테이블 구성

  • dp[i][j]: 문자열 A의 첫 i개 문자와 문자열 B의 첫 j개 문자 사이의 Levenshtein 거리
  • 초기 조건:
  • dp[0][j] = j: 빈 문자열에서 Bj번째 문자까지 만들기 위해 j번 삽입 필요
  • dp[i][0] = i: Ai번째 문자까지를 빈 문자열로 만들기 위해 i번 삭제 필요
  • 점화식:
      dp[i][j] = min(
          dp[i-1][j] + 1,           // 삭제
          dp[i][j-1] + 1,           // 삽입
          dp[i-1][j-1] + cost       // 치환 (A[i-1] == B[j-1]이면 cost = 0, 아니면 1)
      )
      

예시 계산

A = "cat", B = "car"의 경우:

"" c a r
"" 0 1 2 3
c 1 0 1 2
a 2 1 0 1
t 3 2 1 1

결과: Levenshtein리 = 1 (tr 치환)


응용 분야

1. 철자 교정 및 오타 감지

입력된 단어가 사전에 없을 경우, 기존 단어들과의 Levenshtein 거리를 계산하여 가장 가까운 단어를 제안합니다.
예: "speling" → "spelling" (거리: 1)

2. 자연어 처리(NLP)

3. 생물정보학

DNA 또는 단백질 서열 간의 유사성을 분석할 때 사용. 유전자 변이를 정량화하는 데 유용합니다.

4. 데이터 정제 및 중복 제거

데이터베이스에서 "New York"과 "New-York" 같은 변형을 동일한 엔티티로 인식하기 위해 활용됩니다.


변형 및 확장


장점과 한계

장점 한계
간단하고 직관적인 정의 긴 문자열에서 계산 비용이 큼 (O(m×n))
다양한 오류 유형을 포괄 의미적 유사성은 반영하지 못함
구현이 비교적 쉬움 대소문자, 공백 등 전처리에 민감함

관련 알고리즘 및 도구

  • Wagner-Fischer 알고리즘: Levenshtein 거리의 표준 DP 구현
  • 비타비 알고리즘: 확률 기반 편집 거리 계산
  • Python 라이브러리: [python-Levenshtein](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Python/python-Levenshtein), [textdistance](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%20%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC/textdistance), [NLTK](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%20%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC/NLTK)

Python 예제 코드

def levenshtein_distance(s1, s2):
    m, n = len(s1), len(s2)
    dp = [[0] * (n + 1) for _ in range(m + 1)]
    
    for i in range(m + 1):
        dp[i][0] = i
    for j in range(n + 1):
        dp[0][j] = j

    for i in range(1, m + 1):
        for j in range(1, n + 1):
            cost = 0 if s1[i-1] == s2[j-1] else 1
            dp[i][j] = min(
  dp[i-1][j] + 1,      # 삭제
                dp[i][j-1] + 1,      # 삽입
                dp[i-1][j-1] + cost  # 치환
            )
    
    return dp[m][n]

# 사용 예
print(levenshtein_distance("kitten", "sitting"))  # 출력: 3


참고 자료

  • Levenshtein, V. I. (1966). "Binary codes capable of correcting deletions, insertions, and reversals". Soviet Physics Doklady.
  • Gusfield, D. (1997). Algorithms on Strings, Trees, and Sequences. Cambridge University Press.
  • Wikipedia - Levenshtein Distance

Levenshtein 거리는 문자열 비교의 기초이자 핵심 도구로서, 정확성과 실용성을 모두 갖춘 알고리즘으로 평가받고 있습니다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?