テキストを一致させて検索する場合、正確な一致だけでなく、ターゲットテキストに「近い」文字列を識別する方法も必要です。 PHPは非常に便利な機能Levenshteinを提供します。これは、この目標を達成し、ファジー検索を実行するのに役立ちます。今日は、 levenshtein関数を使用してファジー検索を実行し、PHPを介したおおよそのマッチングを実現する方法を詳細に紹介します。
Levenshtein距離(編集距離とも呼ばれます)は、2つの文字列間の違いの指標です。最小限の編集操作(挿入、削除、交換)で、ある文字列を別の文字列に変換するために必要な手順の数を表します。距離が小さいほど、2つの文字列が類似しています。
PHPでは、 Levenshtein関数を使用して、2つの文字列間のLevenshtein距離を計算できます。その基本的な構文は次のとおりです。
levenshtein(string $str1, string $str2, int $cost_ins = 1, int $cost_rep = 1, int $cost_del = 1): int
$ str1と$ str2は、比較する2つの文字列です。
$ cost_insは文字を挿入するコストであり、デフォルトは1になります。
$ cost_repは文字を置き換えるコストであり、デフォルトは1にデフォルトです。
$ cost_delは文字を削除するコストであり、デフォルトは1になります。
戻り値は、2つの文字列間のlevenshtein距離です。
Levenshtein距離を計算することにより、2つの文字列間の類似性を判断できます。距離が小さいほど、それはより似ています。
実際のアプリケーションでは、通常、キーワードを検索するときに「ファジー検索」機能を提供します。つまり、正確な一致だけでなく、ユーザーが入力した検索用語に似たコンテンツを見つけたいと考えています。
複数の文字列の配列があり、ユーザーが入力したキーワードに基づいてこれらの同様の文字列を見つける必要があるとします。アレイを通過することにより、各文字列と検索用語の間の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機能をよりよく理解し、使用し、検索機能の柔軟性と精度を向上させるのに役立つことを願っています。