Jaro-Winkler와 Levenshtein 거리의 차이점은 무엇입니까? [닫은]


82

여러 파일에서 수백만 개의 레코드를 퍼지 매칭해야하는 사용 사례가 있습니다. 이를 위해 Jaro-WinklerLevenshtein 편집 거리 라는 두 가지 알고리즘을 식별했습니다 .

둘 다 탐구하기 시작했을 때 둘의 정확한 차이점이 무엇인지 이해할 수 없었습니다. Levenshtein은 두 문자열 사이의 편집 횟수를 제공하고 Jaro-Winkler는 0.0에서 1.0 사이의 정규화 된 점수를 제공합니다. 알고리즘을 이해하지 못했습니다.

두 알고리즘 중 하나를 사용해야하므로이 두 알고리즘의 근본적인 차이점이 무엇인지 알아야합니다.

둘째,이 두 알고리즘의 성능 차이에 대해 알고 싶습니다.

답변:


173

Levenshtein은 한 문자열을 다른 문자열로 변환하는 데 필요한 편집 (삽입, 삭제 또는 대체) 수를 계산합니다. Damerau-Levenshtein은 조옮김을 단일 편집으로 간주하는 수정 된 버전입니다. 출력은 정수 편집 수이지만 공식으로 유사성 값을 제공하도록 정규화 할 수 있습니다.

1 - (edit distance / length of the larger of the two strings)

Jaro 알고리즘은 조옮김을 고려하여 거리가 더 긴 문자열 길이의 절반 이하인 공통 문자 척도입니다. Winkler는 문자열 시작 부분의 차이가 문자열 끝 부분의 차이보다 더 중요하다는 생각을 지원하기 위해이 알고리즘을 수정했습니다. Jaro 및 Jaro-Winkler는 단어 및 이름과 같은 작은 문자열을 비교하는 데 적합합니다.

어떤 것을 사용할지 결정하는 것은 성능의 문제가 아닙니다. 비교하는 문자열의 특성에 적합한 방법을 선택하는 것이 중요합니다. 그러나 일반적으로 언급 한 두 알고리즘 모두 비용이 많이들 수 있습니다. 각 문자열을 다른 모든 문자열과 비교해야하고 데이터 세트에있는 수백만 개의 문자열과 비교해야하기 때문에 엄청난 수의 비교입니다. 이는 각 문자열에 대한 음성 인코딩을 계산 한 다음 동일한 인코딩을 공유하는 문자열을 그룹화하는 것과 같은 것보다 훨씬 비쌉니다.

인터넷에 이러한 알고리즘 및 기타 퍼지 문자열 일치 알고리즘에 대한 자세한 정보가 많이 있습니다. 이것은 당신에게 시작을 줄 것입니다.

개인 이름 일치 비교 : 기술 및 실제 문제

그 논문에 따르면 내가 언급 한 네 가지 Jaro 및 Levenshtein 알고리즘의 속도는 가장 빠른 것에서 가장 느린 것까지입니다.

  • 자로
  • Jaro-Winkler
  • Levenshtein
  • Damerau-Levenshtein

가장 느린 것은 가장 빠른 것보다 2 ~ 3 배 더 오래 걸립니다. 물론 이러한 시간은 문자열의 길이와 구현에 따라 다르며 사용되지 않았을 수있는 이러한 알고리즘을 최적화하는 방법이 있습니다.


5
Hatchet의 대답은 훌륭하지만 언급 할 가치가 있다면 Elasticsearch와 같은 것을 사용하여 퍼지 (Levenshtein) 쿼리와 음성 기반 쿼리를 모두 수행 할 수 있으며 많은 노력없이 빠른 평가를 수행 할 수 있습니다.
ppearcy

1
저도 비슷한 생각을했습니다. 많은 단어가있을 수있는 object.description 필드를 비교해야합니다. Levenshtein에 ES를 사용하기 위해 이미 이와 같이 수행 된 것이 있습니까?
Wexoni 2015 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.