PHPでは、 Levenshtein関数は、2つの文字列間の編集距離を計算するために使用される関数であり、通常はファジーマッチングを実装するために使用されます。ある文字列から別の文字列に変換するために必要な挿入、削除、および交換の最小数をカウントすることにより、類似性を評価します。 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は、比較する2つの文字列です。
オプションの$ cost_ins 、 $ cost_rep 、 $ cost_delは、それぞれ挿入、交換、削除操作のコストを表します(デフォルトは1です)。
関数の返品値は、文字列$ str1を$ str2に変換するために必要な最小オペランドを表す整数です。たとえば、 levenshtein( 'kitten'、 'sith')は3を返します。「子猫」から「s」への移行には3つの操作が必要なため、「k」を「s」に置き換え、「e」を「i」に置き換え、「g」を追加します。
正規表現(Regex)は、文字列パターンに一致する強力なツールです。 PHPでは、一般的に使用される通常のマッチング関数には、 preg_match 、 preg_match_all 、 preg_replaceなどが含まれます。通常の表現は、パターンマッチング、検索、交換、その他の操作に使用でき、複雑な文字列マッチングの問題を処理するのに特に適しています。
Levenshteinと正規表現は2つの強力なツールですが、自然に「組み合わされた」ものではありません。 Levenshteinは2つの文字列間の距離を計算しますが、正規表現はパターンに一致するために使用されます。それらは場合によってはお互いを補完することができます。
いくつかの単語を含む文字列からユーザーが入力した単語に最も似ている単語を見つけたいとします。 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と正規表現は2つの別々のツールであるように見えますが、その組み合わせは、実際の開発においてより強力なファジーマッチング機能をPHPに提供できます。最初に正規表現をフィルタリングし、次にlevenshteinを使用して正確に計算することにより、マッチングの精度と効率を効果的に改善できます。ニーズに応じて、特定のアプリケーションシナリオをよりよく満たすために、これら2つの組み合わせを柔軟に選択できます。