텍스트를 일치시키고 검색 할 때는 종종 정확히 일치 할뿐만 아니라 대상 텍스트에 "가까운"문자열을 식별하는 방법도 필요합니다. PHP는 매우 편리한 기능 Levenshtein을 제공 하여이 목표를 달성하고 퍼지 검색을 수행 할 수 있습니다. 오늘, 우리는 Levenshtein 기능을 사용하여 퍼지 검색을 수행하고 PHP를 통해 대략적인 일치를 달성하는 방법을 자세히 소개합니다.
Levenshtein 거리 (편집 거리라고도 함)는 두 줄의 차이를 나타내는 지표입니다. 최소 편집 작업으로 한 문자열을 다른 문자열로 변환하는 데 필요한 단계 수를 나타냅니다 (삽입, 삭제, 교체). 거리가 작을수록 두 줄이 비슷합니다.
PHP에서는 Levenshtein 기능을 사용하여 두 줄 사이의 Levenshtein 거리를 계산할 수 있습니다. 기본 구문은 다음과 같습니다.
levenshtein(string $str1, string $str2, int $cost_ins = 1, int $cost_rep = 1, int $cost_del = 1): int
$ str1 과 $ str2 는 비교할 두 줄입니다.
$ cost_ins는 문자 삽입 비용이며 1로 기본값입니다.
$ Cost_Rep는 문자를 교체하는 비용이며 1로 기본값입니다.
$ cost_del은 문자 삭제 비용으로 1로 기본값입니다.
리턴 값은 두 줄 사이의 Levenshtein 거리입니다.
Levenshtein 거리를 계산하여 두 줄 사이의 유사성을 판단 할 수 있습니다. 거리가 작을수록 비슷한 의미가 있습니다.
실제 응용 프로그램에서는 일반적으로 키워드를 검색 할 때 "퍼지 검색"기능을 제공합니다. 즉, 정확한 일치뿐만 아니라 사용자가 입력 한 검색어와 유사한 컨텐츠를 찾고 싶습니다.
다중 문자열 배열이 있다고 가정하고 이제 사용자가 입력 한 키워드를 기반으로 유사한 문자열을 찾아야합니다. 배열을 통과하여 각 문자열과 검색어 사이의 Levenshtein 거리를 계산하고 더 작은 거리로 결과를 선택할 수 있습니다.
<?php
$searchTerm = 'apple'; // 사용자가 입력 한 검색어
$items = ['apple pie', 'apple', 'banana', 'grape', 'apricot'];
$threshold = 3; // 최대 거리 임계 값을 설정하십시오,더 작을수록 더 엄격합니다
$results = [];
foreach ($items as $item) {
$distance = levenshtein($searchTerm, $item);
if ($distance <= $threshold) {
$results[] = $item; // 거리가 임계 값보다 적은 경우,퍼지 경기로 간주됩니다
}
}
print_r($results);
?>
이 예에서는 검색어 Apple 과 배열의 각 요소 사이의 Levenshtein 거리를 계산합니다. 거리가 설정 임계 값 (예 : 3 )보다 작거나 같으면 항목은 검색어와 유사한 것으로 간주되어 결과 배열에 추가됩니다.
출력은 다음과 같습니다.
Array
(
[0] => apple pie
[1] => apple
)
때때로, 우리는 모든 유사성을 찾아야 할뿐만 아니라 유사성에 따라 정렬하여 가장 유사한 결과에 우선 순위를 부여 할 수도 있습니다. 계산 된 Levenshtein 거리를 정렬하여이를 수행 할 수 있습니다.
<?php
$searchTerm = 'apple'; // 사용자가 입력 한 검색어
$items = ['apple pie', 'apple', 'banana', 'grape', 'apricot'];
$results = [];
foreach ($items as $item) {
$distance = levenshtein($searchTerm, $item);
$results[] = ['item' => $item, 'distance' => $distance];
}
// 거리별로 정렬하십시오
usort($results, function ($a, $b) {
return $a['distance'] - $b['distance'];
});
print_r($results);
?>
이 예에서는 먼저 각 문자열의 Levenshtein 거리를 검색어로 계산 한 다음 연관 배열에 넣습니다. USORT 기능을 사용하여 결과를 거리별로 정렬하면 최소 거리의 항목이 먼저 순위가 매겨집니다.
출력 결과 :
Array
(
[0] => Array
(
[item] => apple
[distance] => 0
)
[1] => Array
(
[item] => apple pie
[distance] => 4
)
[2] => Array
(
[item] => apricot
[distance] => 5
)
[3] => Array
(
[item] => banana
[distance] => 6
)
[4] => Array
(
[item] => grape
[distance] => 6
)
)
보시다시피, 거리가 0 인 애플은 먼저 순위를 매기고 검색어와 가장 유사한 항목이 이어집니다.
검색 결과에서 무언가를 URL과 연결해야한다고 가정하면 관련 URL을 문자열에 직접 포함시킬 수 있습니다. 예는 다음과 같습니다.
<?php
$searchTerm = 'apple'; // 사용자가 입력 한 검색어
$items = ['apple pie', 'apple', 'banana', 'grape', 'apricot'];
$baseUrl = 'http://gitbox.net/search?query=';
$results = [];
foreach ($items as $item) {
$distance = levenshtein($searchTerm, $item);
if ($distance <= 3) {
$results[] = [
'item' => $item,
'url' => $baseUrl . urlencode($item) // 일치하는 항목을 넣으십시오 URL 스 플라이 싱을하십시오
];
}
}
print_r($results);
?>
이 예에서 검색 결과에는 일치 자체가 포함될뿐만 아니라 각 일치에 대한 URL을 생성하여 가능한 검색 페이지를 가리킬 수 있습니다.
출력 예 :
Array
(
[0] => Array
(
[item] => apple pie
[url] => http://gitbox.net/search?query=apple+pie
)
[1] => Array
(
[item] => apple
[url] => http://gitbox.net/search?query=apple
)
)
Levenshtein 기능을 사용하면 퍼지 검색 기능을 매우 쉽게 구현할 수 있습니다. 간단한 경기이든 정렬 된 경기이든, Levenshtein 거리는 줄 사이의 유사성을 판단하는 데 도움이 될 수 있습니다. 실제 요구에 따라 퍼지 매칭을 URL과 연결하여 검색 경험을 추가로 최적화 할 수 있습니다. 이 기사가 PHP의 Levenshtein 기능을 더 잘 이해하고 사용하고 검색 기능의 유연성과 정확성을 향상시키는 데 도움이되기를 바랍니다.