現在の位置: ホーム> 最新記事一覧> levenshtein関数は正規表現で使用できますか? PHPでのファジーマッチングのための新しいアイデア

levenshtein関数は正規表現で使用できますか? PHPでのファジーマッチングのための新しいアイデア

gitbox 2025-06-27

PHPでは、 Levenshtein関数は、2つの文字列間の編集距離を計算するために使用される関数であり、通常はファジーマッチングを実装するために使用されます。ある文字列から別の文字列に変換するために必要な挿入、削除、および交換の最小数をカウントすることにより、類似性を評価します。 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> &amp;</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> &amp;</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> &amp;</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」を追加します。

PHPにおける正規表現の役割

正規表現(Regex)は、文字列パターンに一致する強力なツールです。 PHPでは、一般的に使用される通常のマッチング関数には、 preg_matchpreg_match_allpreg_replaceなどが含まれます。通常の表現は、パターンマッチング、検索、交換、その他の操作に使用でき、複雑な文字列マッチングの問題を処理するのに特に適しています。

通常の表現でlevenshteinを使用する方法は?

Levenshteinと正規表現は2つの強力なツールですが、自然に「組み合わされた」ものではありません。 Levenshteinは2つの文字列間の距離を計算しますが、正規表現はパターンに一致するために使用されます。それらは場合によってはお互いを補完することができます。

例1: 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> &lt; </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関数を使用してユーザーが入力した単語からの距離を計算し、最後に最も類似した単語を選択します。

例2:複雑なファジーマッチングのための正規表現と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> &lt; </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を使用して最も類似した単語をさらに見つけます。このアプローチは、いくつかのマッチング条件(接頭辞、接尾辞、特定の文字パターンなど)を知っている場合に特に役立ち、正規表現を通して不必要なオプションを除外し、それにより効率を向上させます。

レギュラーとレーベンシュテインを使用することの利点

  1. マッチングの精度を向上させる:正規表現を通じて、特定の条件を満たす文字列を事前にフィルターしてから、 Levenshteinを介して最も近い文字列を細かく計算できます。

  2. パフォーマンスの最適化:データセットが大きい場合、通常の式で事前にフィルタリングマッチを使用すると、すべての文字列でのLevenshteinの計算を回避でき、パフォーマンスが向上します。

  3. 柔軟性:正規表現は、ケース感度などの複雑なパターンマッチングを処理できます。特定の特定の文字セットなどと一致しますが、 Levenshteinを使用して、フィルタリングされた文字列の微妙な比較をさらに作成できます。

要約します

Levenshteinと正規表現は2つの別々のツールであるように見えますが、その組み合わせは、実際の開発においてより強力なファジーマッチング機能をPHPに提供できます。最初に正規表現をフィルタリングし、次にlevenshteinを使用して正確に計算することにより、マッチングの精度と効率を効果的に改善できます。ニーズに応じて、特定のアプリケーションシナリオをよりよく満たすために、これら2つの組み合わせを柔軟に選択できます。