PHP에서 Levenshtein 함수는 두 줄 사이의 편집 거리를 계산하는 데 사용되는 함수이며, 일반적으로 퍼지 매칭을 구현하는 데 사용됩니다. 한 문자열에서 다른 문자열로 변환하는 데 필요한 작업을 최소 삽입, 삭제 및 교체하여 유사성을 평가합니다. Levenshtein 함수 자체는 매우 유용하지만 일부 복잡한 문자열 일치 시나리오에서는 유연한 퍼지 매칭을 구현할 때보다 강력한 기능을 얻기 위해 일반 표현식과 함께 사용하여이를 사용하고 싶습니다.
Levenshtein 함수의 기본 구문은 다음과 같습니다.
<span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">levenshtein</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str1</span></span><span> , </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str2</span></span><span> [, </span><span><span class="hljs-keyword">int</span></span><span> &</span><span><span class="hljs-variable">$cost_ins</span></span><span> = </span><span><span class="hljs-number">1</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> &</span><span><span class="hljs-variable">$cost_rep</span></span><span> = </span><span><span class="hljs-number">1</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> &</span><span><span class="hljs-variable">$cost_del</span></span><span> = </span><span><span class="hljs-number">1</span></span><span> ] )
</span></span>
$ str1 과 $ str2 는 비교할 두 줄입니다.
옵션 $ cost_ins , $ cost_rep 및 $ cost_del은 각각 삽입, 교체 및 삭제 작업 비용을 나타냅니다 (기본값은 1).
함수의 반환 값은 문자열 $ str1을 $ str2 로 변환하는 데 필요한 최소 피연산자를 나타내는 정수입니다. 예를 들어, Levenshtein ( 'Kitten', 'Sitting') 은 "Kitten"에서 "S"로 전환하려면 "k"를 "s"로 바꾸고 "e"를 "i"로 바꾸고 "g"를 추가하기 때문에 3을 반환합니다.
정규 표현식 (Regex)은 문자열 패턴과 일치하는 강력한 도구입니다. PHP에서 일반적으로 사용되는 일반 일치 기능에는 preg_match , preg_match_all , preg_replace 등이 포함됩니다. 정규식은 패턴 매칭, 검색, 교체 및 기타 작업에 사용될 수 있으며 특히 복잡한 문자열 일치 문제를 처리하는 데 적합합니다.
Levenshtein 과 정규 표현은 두 가지 강력한 도구이지만 자연스럽게 "결합"되지는 않습니다. Levenshtein은 두 줄 사이의 거리를 계산하는 반면 정규식은 패턴과 일치하는 데 사용됩니다. 어떤 경우에는 서로를 보완 할 수 있습니다.
여러 단어가 포함 된 문자열에서 사용자가 입력 한 단어와 가장 유사한 단어를 찾고 싶다고 가정 해 봅시다. Levenshtein 함수를 사용하여 각 단어와 사용자가 입력 한 문자열 사이의 유사성을 계산하여 가장 가까운 단어를 선택할 수 있습니다.
<span><span><span class="hljs-variable">$words</span></span><span> = [</span><span><span class="hljs-string">"apple"</span></span><span>, </span><span><span class="hljs-string">"banana"</span></span><span>, </span><span><span class="hljs-string">"orange"</span></span><span>, </span><span><span class="hljs-string">"grape"</span></span><span>, </span><span><span class="hljs-string">"kiwi"</span></span><span>];
</span><span><span class="hljs-variable">$user_input</span></span><span> = </span><span><span class="hljs-string">"applw"</span></span><span>; </span><span><span class="hljs-comment">// 사용자가 입력 한 퍼지 단어</span></span><span>
</span><span><span class="hljs-variable">$closest_match</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-variable">$min_distance</span></span><span> = PHP_INT_MAX;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$words</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$word</span></span><span>) {
</span><span><span class="hljs-variable">$distance</span></span><span> = </span><span><span class="hljs-title function_ invoke__">levenshtein</span></span><span>(</span><span><span class="hljs-variable">$user_input</span></span><span>, </span><span><span class="hljs-variable">$word</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$distance</span></span><span> < </span><span><span class="hljs-variable">$min_distance</span></span><span>) {
</span><span><span class="hljs-variable">$min_distance</span></span><span> = </span><span><span class="hljs-variable">$distance</span></span><span>;
</span><span><span class="hljs-variable">$closest_match</span></span><span> = </span><span><span class="hljs-variable">$word</span></span><span>;
}
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"가장 비슷한 단어는입니다: <span class="hljs-subst">$closest_match</span></span></span><span>";
</span></span>
이 예에서는 모든 단어를 가로 지르고 Levenshtein 함수를 사용하여 사용자가 입력 한 단어와의 거리를 계산하고 마지막으로 가장 유사한 단어를 선택합니다.
경우에 따라 먼저 몇 가지 기본 패턴을 정규 표현과 일치시킨 다음 Levenshtein을 통해보다 정확한 경기를 만들 수 있습니다. 예를 들어, 사용자가 거친 패턴 (예 : 접두사 또는 접미사)을 입력하면 일반 표현식을 사용하여 잠재적 일치를 필터링 한 다음 Levenshtein을 사용하여 가장 유사한 결과를 찾을 수 있습니다.
<span><span><span class="hljs-variable">$words</span></span><span> = [</span><span><span class="hljs-string">"apple"</span></span><span>, </span><span><span class="hljs-string">"banana"</span></span><span>, </span><span><span class="hljs-string">"orange"</span></span><span>, </span><span><span class="hljs-string">"grape"</span></span><span>, </span><span><span class="hljs-string">"kiwi"</span></span><span>];
</span><span><span class="hljs-variable">$user_input</span></span><span> = </span><span><span class="hljs-string">"applw"</span></span><span>; </span><span><span class="hljs-comment">// 사용자가 입력 한 퍼지 단어</span></span><span>
</span><span><span class="hljs-variable">$pattern</span></span><span> = </span><span><span class="hljs-string">"/^ap/"</span></span><span>; </span><span><span class="hljs-comment">// 정규 표현,일치합니다 "ap" 시작하는 단어</span></span><span>
</span><span><span class="hljs-comment">// 패턴과 일치하는 일반 필터 아웃 단어를 사용하십시오</span></span><span>
</span><span><span class="hljs-variable">$matches</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_grep</span></span><span>(</span><span><span class="hljs-variable">$pattern</span></span><span>, </span><span><span class="hljs-variable">$words</span></span><span>);
</span><span><span class="hljs-variable">$closest_match</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-variable">$min_distance</span></span><span> = PHP_INT_MAX;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$matches</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$match</span></span><span>) {
</span><span><span class="hljs-variable">$distance</span></span><span> = </span><span><span class="hljs-title function_ invoke__">levenshtein</span></span><span>(</span><span><span class="hljs-variable">$user_input</span></span><span>, </span><span><span class="hljs-variable">$match</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$distance</span></span><span> < </span><span><span class="hljs-variable">$min_distance</span></span><span>) {
</span><span><span class="hljs-variable">$min_distance</span></span><span> = </span><span><span class="hljs-variable">$distance</span></span><span>;
</span><span><span class="hljs-variable">$closest_match</span></span><span> = </span><span><span class="hljs-variable">$match</span></span><span>;
}
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"가장 비슷한 단어는입니다: <span class="hljs-subst">$closest_match</span></span></span><span>";
</span></span>
이 예에서는 먼저 정규 표현식을 통해 "AP"로 시작하는 모든 단어를 필터링 한 다음 Levenshtein을 사용하여 가장 유사한 단어를 추가로 찾습니다. 이 접근법은 일치하는 조건 (접두사, 접미사 또는 특정 문자 패턴)을 알고있을 때 특히 유용하여 일반 표현식을 통해 불필요한 옵션을 필터링하여 효율성을 향상시킵니다.
일치 정확도 향상 : 일반 표현식을 통해 특정 조건을 충족하는 문자열을 사전 필터링 한 다음 Levenshtein을 통해 가장 가까운 문자열을 미세하게 계산할 수 있습니다.
성능 최적화 : 데이터 세트가 크면 정규 표현식으로 필터링이 미리 일치하면 모든 문자열에 대한 Levenshtein 계산을 피할 수 있으므로 성능이 향상됩니다.
유연성 : 정규 표현식은 케이스 감도, 특정 특정 문자 세트 매칭 등과 같은 복잡한 패턴 매칭을 처리 할 수 있으며, Levenshtein을 사용하여 필터링 된 문자열의 미세한 유사성 비교를 만들 수 있습니다.
Levenshtein 과 정규 표현식은 두 가지 별도의 도구 인 것처럼 보이지만, 그들의 조합은 PHP에 실제 개발에서보다 강력한 퍼지 매칭 기능을 제공 할 수 있습니다. 먼저 정규 표현식을 필터링 한 다음 Levenshtein을 사용하여 정확하게 계산함으로써 정확도와 일치 효율성을 효과적으로 개선 할 수 있습니다. 요구에 따라 특정 응용 프로그램 시나리오를 더 잘 충족시키기 위해이 두 가지의 조합을 유연하게 선택할 수 있습니다.