거리 유사성 측정 기반 문자열 비교
소개:
전산 언어학과 자연어 처리에서 두 문자열 간의 유사성을 결정하는 것은 다양한 응용 분야에서 매우 중요합니다. 널리 사용되는 메트릭 중 하나는 거리 유사성 메트릭으로, 한 문자열을 다른 문자열로 변환하는 데 필요한 수정 횟수를 정량화합니다. 이 문서에서는 성능 최적화에 초점을 맞춰 주어진 두 문자열 간의 거리 유사성 측정을 계산하는 방법을 포괄적으로 소개하는 것을 목표로 합니다.
Damerau-Levenshtein 알고리즘:
Damerau-Levenshtein 알고리즘은 두 문자열 간의 거리 유사성 척도를 계산하는 데 널리 채택되는 기술입니다. 삽입, 삭제, 교체, 전치 등의 작업을 고려합니다. 이 알고리즘은 한 문자열을 다른 문자열로 변환하는 데 필요한 이러한 작업의 최소 수를 계산합니다. 예를 들어, "hospital"과 "haspita" 사이의 Damerau-Levenshtein 거리는 2입니다(대체 1개와 전치 1개).
성능 고려 사항:
성능에 민감한 애플리케이션의 경우 Damerau-Levenshtein 알고리즘 구현을 최적화하는 것이 중요합니다. 주요 고려사항은 다음과 같습니다.
코드 구현:
다음 코드는 C#에서 Damerau-Levenshtein 알고리즘의 최적화된 구현을 제공합니다.
<code class="language-c#">public static int DamerauLevenshteinDistance(int[] source, int[] target, int threshold) { if (Math.Abs(source.Length - target.Length) > threshold) return int.MaxValue; if (source.Length > target.Length) Swap(ref target, ref source); int maxi = source.Length; int maxj = target.Length; int[] dCurrent = new int[maxi + 1]; int[] dMinus1 = new int[maxi + 1]; int[] dMinus2 = new int[maxi + 1]; int[] dSwap; for (int i = 0; i <= maxi; i++) dCurrent[i] = i; for (int j = 1; j <= maxj; j++) { dMinus2 = dMinus1; dMinus1 = dCurrent; dCurrent = new int[maxi + 1]; dCurrent[0] = j; for (int i = 1; i <= maxi; i++) { int cost = (source[i - 1] == target[j - 1]) ? 0 : 1; int del = dMinus1[i] + 1; int ins = dCurrent[i - 1] + 1; int sub = dMinus1[i - 1] + cost; int min = (del < ins) ? (del < sub ? del : sub) : (ins < sub ? ins : sub); if (i > 1 && j > 1 && source[i - 2] == target[j - 1] && source[i - 1] == target[j - 2]) min = Math.Min(min, dMinus2[i - 2] + cost); dCurrent[i] = min; if (min > threshold) return int.MaxValue; } } return (dCurrent[maxi] > threshold) ? int.MaxValue : dCurrent[maxi]; } static void Swap<T>(ref T arg1, ref T arg2) { T temp = arg1; arg1 = arg2; arg2 = temp; }</code>
이 구현은 이전에 설명한 성능 향상 고려 사항을 따릅니다. 문자열을 정수 배열로 표현하고 회전된 배열을 사용하면 계산 속도가 크게 빨라집니다.
위 내용은 문자열 유사성 비교를 위해 Damerau-Levenshtein 알고리즘을 어떻게 최적화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!