나는 최근 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 개의 삭제입니다.
지금, 나는 이것을 처음으로 생각한 사람이 될 수 없습니다 . 그래서 왜 내가 그것을 뛰어 넘지 않았습니까? 방금 오래 검색하지 않았습니까? 아니면 실제로 작동하지 못하게하는 미묘한 결함이 있습니까?