Damerau-Levenshtein 개선 가능?


9

나는 최근 Wikipedia의 의사 코드에서 Damerau-Levenshtein 거리 알고리즘을 구현했습니다. 나는 그것이 작동하는 방법을 정확하게의 설명을 찾을 수 없습니다와 의사처럼 완전히 가치가없는 변수 이름을 사용 DA, DB, i1, 그리고 j1왼쪽이 내 머리를 긁적.

다음은 Python에서 구현 한 것입니다 : https://gist.github.com/badocelot/5327337

파이썬 구현을 통해 프로그램을 살펴보고 무슨 일이 일어나고 있는지 파악하고 변수의 이름을 더 유용한 이름으로 바꿨습니다. 나는 참조 프레임이있는 Levenshtein 거리를 계산하는 Wagner-Fischer 접근 방식에 익숙했습니다.

지나치게 길어질 위험이있는 경우, Damerau-Levenshtein을 이해하는 방법은 다음과 같습니다.

미스터리 변수 :

  • DA( last_row내 코드에서)는 각 요소가 표시된 마지막 행을 보유하는 일종의 맵입니다. 내 코드에서는 실제 파이썬 사전입니다.
  • DB( last_match_col)는 현재 행 의 문자와 b일치 하는 마지막 열을 보유합니다.a
  • i1( last_matching_row)는 DA현재 문자 의 행 번호 입니다.b
  • j1잠재적으로 업데이트되기 전에 DB/ 값의 복사본 일뿐입니다 last_match_col. 내 코드에서 방금 last_match_col업데이트 된 위치로 이동 하고이 변수를 제거했습니다.

조옮김 비용 :

H[i1][j1] + (i-i1-1) + 1 + (j-j1-1)

에 현재의 문자를 교환 비용 계산하는 b마지막 문자 b의 것으로 알려져 a중 하나를 추가 또는 삭제로 사이에있는 모든 문자를 (마지막 일치) 치료를.

비용의 구성 요소 :

  • H[i1][j1] 조옮김을 찾으면 이전 작업이 무효화되므로 기본 원가를 조옮김 전 계산의 포인트로 되돌립니다.
  • (i-i1-1) 현재 문자와 일치하는 현재 행과 마지막 행 사이의 거리이며, 필요한 삭제 수입니다.
  • (j-j1-1) 일치하는 현재 열과 마지막 열 사이의 거리이며 추가 횟수입니다.
  • 여분 + 1은 전치 자체의 비용입니다.

이 분석이 정확하지 않으면 내가 어디로 잘못 갔는지 알고 싶습니다. 내가 말했듯이, 나는 찾을 수 있는 알고리즘이 온라인으로 작동하는 방법에 대한 자세한 설명을.

개선 된 버전?

그 밖을 생각하는 데,하지만, 그것의 비용을 계산하여 저를 쳤다 모두 하나 개 추가 한 삭제이 확인되지 않은 대체,하는 것과 같습니다 추가 및 전치 문자 사이의 삭제를 결함이 보였다.

모든 것이 맞다면 해결책은 사소한 것입니다. 바뀐 문자 사이의 문자 비용은 추가 및 삭제 중 더 높아야 합니다. 가능한 한 많은 수의 대체로 변환하고 남은 추가 또는 삭제를 추가하십시오.

따라서 비용은 다음과 같습니다.

H[i1][j1] + max((i-i1-1), (j-j1-1)) + 1

이 버전에 대한 코드는 다음과 같습니다. https://gist.github.com/badocelot/5327427

몇 가지 간단한 테스트에서 이것은 올바른 것 같습니다. 예를 들어, "abcdef"-> "abcfad"는 편집 거리를 2 ( "d"및 "f"를 바꾸고 "e"를 "a"로 변경)를 제공하지만 원래 알고리즘은 3을 지정합니다 (마지막 3 개) 문자는 대체 또는 1 개의 전치 + 1 개의 추가 + 1 개의 삭제입니다.

지금, 나는 이것을 처음으로 생각한 사람이 될 수 없습니다 . 그래서 왜 내가 그것을 뛰어 넘지 않았습니까? 방금 오래 검색하지 않았습니까? 아니면 실제로 작동하지 못하게하는 미묘한 결함이 있습니까?


DL에 대해 자세히 설명하는 블로그 게시물을 작성하기로 결정했습니다. scarcitycomputing.blogspot.com/2013/04/…
James Jensen

답변:


3

Wikipedia에서 Damerau-Levenshtein 거리를 찾아야했기 때문에 이것이 잘못되면 용서하십시오. 그러나 임의의 문자가 아닌 인접한 문자 만 바꿀 수있는 것처럼 보입니다. 따라서 "abcdef"-> "abcfad"예제는 d와 f를 바꿉니다. 알고리즘 정의를 수정했으며 더 이상 Damerau-Levenshtein 거리를 계산하지 않는 것 같습니다.


흠, 무슨 말인지 알 겠어. DL은 추가 전 또는 삭제 후 조옮김을 허용합니다. 두 가지 모두 발생하는 경우 실제로 인접한 조옮김이 아니므로 비용 급증 및 조옮김 비용이 새 비용으로 선택되지 않습니다. 그것은 비용 최소화의 부작용을 통해 그것들을 피하기 때문에 둘 다 처리하는 것처럼 보였습니다.
James Jensen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.