두 문자열을 일치 시키지만 어느 정도의 오차를 허용


10

두 문자열을 어떻게 일치시킬 수 있지만 동시에 X 문자 수가 일치하지 않을 수 있습니다. 오류 수는 제어 가능한 변수 여야합니다.

문자열에서 X 개의 문자 수가 일치하지 않지만 시퀀스에서 실행되는 문자 수에 대한 제한이 있어야합니다. 두 개의 문자열이 주어지면 5 문자를 다르게 할 수 있지만 행에서 2자를 넘지 않아야합니다.

이 두 문자열을 비교하기 위해 권장되는 알고리즘을 찾고 있거나 이미 알려진 해결책이 있습니다.


4
Levenshtein 거리 '더 이상 연속 2 이상'의 세부 사항은 그 알고리즘의 일부가 아닙니다하지만, 보는 일 수 있습니다. see also 페이지에는 찾고있는 다른 관련 알고리즘이 많이 있습니다.

@MichaelT 그런 것이 있다면 내 요구에 꼭 맞을 것입니다. 감사.
Reactgular

@MichaelT 전>이 발견 dotnetperls.com/levenshtein 이 내 문제를 해결 원인 당신은 대답으로 그것을 놓아야합니다.
Reactgular

Soundex 매칭을보고 싶을 수도 있습니다. en.wikipedia.org/wiki/Soundex
길버트 르 블랑

답변:


12

대략적인 문자열 검색 시작 지점은 Levenshtein 거리 의 시작 지점입니다 . 이 알고리즘은 한 단어를 다른 단어로 변경하기 위해 단일 문자 편집 (삽입, 삭제 및 대체) 수를 계산합니다.

예를 들어 kitten-> sitting는 편집 거리가 3입니다.

  1. k itten-> s itten ( 'k'를 's'로 대체)
  2. sitt e n-> sitt i n ( 'e'대신 'i'대체)
  3. 앉아서-> 앉아서 g (끝에 'g'를 추가하십시오)

이 알고리즘에는 특히 Damerau–Levenshtein 거리가 있으며 두 개의 인접한 문자 ( 'hte'에서 'the'까지의 DL 거리가 1이고 Levenshtein 거리가 2 임)를 바꿀 수 있으므로 종종 더 적합합니다. 철자 검사. 간격이 중요한 애플리케이션 (DNA 스트링)에 대한 다른 변형이 존재합니다.

Levenshtein 거리는 잘 알려져 있고 찾기가 너무 어렵지 않습니다 ( Oracle 에서 함수 로 구현을 추적하는 원인이 한 번있었습니다. 모든 데이터를 풀다운 한 다음 쿼리 코드 쪽을 실행하는 것보다 훨씬 빠릅니다). Rosettacode에는 Levenshtein 거리 의 수많은 구현 (54)이 있습니다 (일부 언어는 이것을 문자열 라이브러리의 일부로 사용합니다. Java를 수행하는 경우 apache commons lang을보십시오 ). Wikibooks 에는 31 개의 구현이 있으며 두 언어를 한 눈에 볼 때 동일한 언어에 대해 동일한 코드가 표시되지 않습니다.

이것이 작동하는 방식은 두 문자열 사이의 관계에 해당하는 행렬을 만드는 것입니다.

 .kitten
.0123456
s1123456
i2212345
t3321234
t4432123
i5543223
n6654332
g7765443

.행과 열은 그냥 '빈 문자열에서 각 문자를 삽입하여 목표 문자열로 얻을 수 있음을 나타냅니다. 이상적인 경우는 아니지만 알고리즘을 시드해야합니다.

값이 스팟과 동일하면 ( 'i'== 'i'), 값은 대각선까지 왼쪽의 값과 같습니다. 두 지점이 서로 다르면 ( 's'! = 'k') 값은 최소값입니다.

  • 대각선 위와 왼쪽 + 1 (대체)
  • 바로 위에 + 1 (삽입)
  • 직접 왼쪽 + 1 (삭제)

편집 거리 반환 값은 행렬의 오른쪽 아래에있는 값입니다.

오른쪽 하단에서 왼쪽 상단을 따라 가면 편집이 완료된 것을 볼 수 있습니다.

 .kitten
.0.   .
s.1   .
i  1  .
t   1 .
t    1.
i.....2
n      2
g......3

이것은 메모리를 많이 사용하는 접근 방법입니다. 전체 행렬을 작성하지 않음으로써 메모리 범위를 줄일 수 있습니다. 모든 알고리즘은 데이터의 서브 세트이며 이전 행을 저장하여 공간 에서 N*M공간 으로 줄일 수 있습니다. 2*max(N,M)열). 코드 프로젝트 에서는이를 수행하는 방법을 보여줍니다 (C # 코드를 사용하여 다운로드).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.